服务器模式

服务器模式在 RuboCop 1.31 中引入。如果您使用的是旧版本的 RuboCop,您可以查看 rubocop-daemon 项目,该项目是 RuboCop 内置功能的灵感来源。

您可以通过使用 --server 命令行选项来显著减少 RuboCop 的启动时间(大约快 850 倍)。

--server 选项通过利用一个独立的服务器进程来加速 rubocop 命令的启动,该进程加载 RuboCop 运行时生产文件(即 require 'rubocop')。

通常,RuboCop 启动速度比较慢,因为它需要 require 很多文件,而这很慢。使用 RuboCop 服务器,我们可以绕过这个讨厌的问题,使从文本编辑器和 IDE 与 RuboCop 交互变得更加愉快。

此功能不能在 JRuby 和 Windows 上使用,因为它们不支持 fork 系统调用。

使用服务器运行

有两种方法可以启用服务器

  • rubocop --server:如果服务器进程尚未启动,则启动服务器进程并使用服务器执行检查。

  • rubocop --start-server:只启动服务器进程。

服务器启动后,它会输出主机和端口。

$ rubocop --start-server
RuboCop server starting on 127.0.0.1:55772.
如果服务器已启动,则 rubocop 命令将使用服务器进程执行。只要服务器进程未运行,它就会加载 RuboCop 运行时文件并执行。(与 RuboCop 1.30 及更低版本的行为相同)

如果服务器已在运行,该命令只会显示服务器的 PID。不会启动新的服务器。

$ rubocop --start-server
RuboCop server (16060) is already running.

服务器进程名称基本上是 rubocop --server 和项目目录路径

$ ps aux | grep 'rubocop --server'
user             16060   0.0  0.0  5078568   2264   ??  S     7:54AM   0:00.00 rubocop --server /Users/user/src/github.com/rubocop/rubocop
user             16337   0.0  0.0  5331560   2396   ??  S    23:51PM   0:00.00 rubocop --server /Users/user/src/github.com/rubocop/rubocop-rails

当您更新并运行 rubocop 时,服务器进程会自动重启。

$ rubocop --server
RuboCop version incompatibility found, RuboCop server restarting...
RuboCop server starting on 127.0.0.1:60665.

如果您想在前景启动服务器,这在 Docker 中运行时可能很有用,您可以传递 --no-detach 选项。

$ rubocop --start-server --no-detach

重启服务器

已启动的服务器不会重新加载配置文件。升级 RuboCop 或更改 RuboCop 配置后,您需要重启服务器。

$ rubocop --restart-server
RuboCop server starting on 127.0.0.1:55822.

命令行选项

以下是服务器操作的命令行选项

命令标志 描述

--server

如果尚未启动服务器进程,则启动服务器进程并使用服务器执行检查。

--no-server

如果已启动服务器进程,则停止服务器进程并使用服务器执行检查。

--restart-server

重启服务器进程。

--start-server

启动服务器进程。

--stop-server

停止服务器进程。

--server-status

显示服务器状态。

--no-detach

在前景运行服务器进程。

您可以使用 $RUBOCOP_SERVER_HOST 和 $RUBOCOP_SERVER_PORT 环境变量指定服务器主机和端口。

如果 RUBOCOP_OPTS 环境变量或 .rubocop 文件包含 --server 选项,则 rubocop 命令默认为服务器模式。命令行中指定的其他服务器选项(例如 stop-serverrestart-server)将优先于它们。

环境变量

您可以使用环境变量更改服务器进程的启动主机和端口。

  • $RUBOCOP_SERVER_HOST

  • $RUBOCOP_SERVER_PORT

以下是一个示例

$ RUBOCOP_SERVER_PORT=98989 rubocop --start-server