Makes RuboCop faster
rubocop-daemonmakes RuboCop faster.
Install
rubocop-daemonvia rubygems.org:
gem install rubocop-daemon
or if you install RuboCop using bundler, put this in your
Gemfile:
gem 'rubocop-daemon', require: false
To start the server, just run:
rubocop-daemon start
Then you can execute RuboCop fast:
rubocop-daemon exec
And you can pass files:
rubocop-daemon exec foo.rb bar.rb
If you want to pass arguments to RuboCop, you should separate arguments by
--:
rubocop-daemon exec -- --auto-correct
You can control the server like this:
rubocop-daemon
Available commands:
start: start the server
stop: stop the server
status: print out whether the server is currently running
restart: restart the server
exec [file1, file2, ...] [-- [rubocop-options]]: invoke
rubocopwith the given
rubocop-options
rubocop-daemon-wrapperis a bash script that talks to the
rubocop-daemonserver via
netcat. This provides much lower latency than the
rubocop-daemonRuby script.
You will need to manually download and install the bash script:
(Unfortunately this cannot be done automatically with
rubygems.)
curl https://raw.githubusercontent.com/fohte/rubocop-daemon/master/bin/rubocop-daemon-wrapper -o /tmp/rubocop-daemon-wrapper sudo mkdir -p /usr/local/bin/rubocop-daemon-wrapper sudo mv /tmp/rubocop-daemon-wrapper /usr/local/bin/rubocop-daemon-wrapper/rubocop sudo chmod +x /usr/local/bin/rubocop-daemon-wrapper/rubocop
Add
/usr/local/bin/rubocop-daemon-wrapperto the beginning of your
PATH:
# ~/.bashrc export PATH="/usr/local/bin/rubocop-daemon-wrapper:$PATH"
Now the
rubocopwrapper command will always be used by default.
rubocop-daemon-wrapperwill automatically start the daemon server if it is not already running. So the first call will be about the same as
rubocop, but the second call will be much faster.
If you install
rubocop-daemonwith bundler, you should set
RUBOCOP_DAEMON_USE_BUNDLERenvironment variable:
$ export RUBOCOP_DAEMON_USE_BUNDLER=true
Now
rubocop-daemon-wrapperwill call the
rubocop-daemoncommand with
bundle exec.
Unfortunately, the vscode-ruby extension doesn't really allow you to customize the
rubocoppath or binary. (You can change the linter path, but not the formatter.)
In the meantime, you could just override the
rubocopbinary with a symlink to
rubocop-daemon-wrapper:
# Find your rubocop path $ which rubocop /.rvm/gems/ruby-x.y.z/bin/rubocopOverride rubocop with a symlink to rubocop-daemon-wrapper
$ ln -fs /usr/local/bin/rubocop-daemon-wrapper $HOME/.rvm/gems/ruby-x.y.z/bin/rubocop
Or, if you use rbenv:
# which rubocop is rbenv running? $ rbenv which rubocop /.rbenv/versions/x.y.z/bin/rubocopOverride rubocop with a symlink to rubocop-daemon-wrapper
$ ln -fs /usr/local/bin/rubocop-daemon-wrapper $HOME/.rbenv/versions/x.y.z/bin/rubocop
Now VS Code will use the
rubocop-daemon-wrapperscript, and
formatOnSaveshould be much faster (~150ms instead of 3-5 seconds).
ALE setting example:
" Use `rubocop-daemon-wrapper` instead of `rubocop` let g:ale_ruby_rubocop_executable = 'rubocop-daemon-wrapper'
Auto-correct on save setting example:
" optional: Set fixer(not only linter). let g:ale_fixers = { \ 'ruby': ['rubocop'], \}" optional: Auto-correct on save. let g:ale_fix_on_save = 1
Bug reports and pull requests are welcome on GitHub at https://github.com/fohte/rubocop-daemon.
The gem is available as open source under the terms of the MIT License.