高速Rubocopレールアプリケーションの実行


最近、Native Berkopecは面白い観察を共有したbundle exec whatever Gemfileが巨大であれば起動するまでに数秒かかる.

ネイトバーコペック
@ nateberkopec

私は巨大な宝石ファイルを持っていると言います.私はこのGemfileのグループを持っています.バンドルはなぜです.セットアップ(NameOfGroup)は、それらの5つの宝石でそれを別々のgemfileを維持するより非常に遅いです?
午後14時48分
それはBandlerが確認しなければならないという事実によって説明されるかもしれませんGemfile.lock ファイルの一貫性(すべての宝石がインストールされます).したがって、それは我々がそれを改善しようとしてはならないということを意味しませんGel ).
Rails開発者は通常、すべてのDEPSをGemfile , などのdevツールを含むRuboCop . ルボコップはリンターであり、高速でなければなりません.RuboCop自体はこのステートメントに準拠していますが、バンドルを介して実行することはできません.
どうやってこれを克服できるのか?別の宝石ファイルを使用する!
私は長い間、gems開発のためにこのテクニックを使用してきました.こちらがtypical rubocop.gemfile :
# gemfiles/rubocop.gemfile
source "https://rubygems.org" do
  gem "rubocop-md", "~> 1.0"
  gem "rubocop-rspec"
  gem "standard", "~> 1.0"
end
バンドルで使用するには、BUNDLER_GEMFILE 変数
# first, install the deps
BUNDLE_GEMFILE=gemfiles/rubocop.gemfile bundle install

# then, run the executable
BUNDLE_GEMFILE=gemfiles/rubocop.gemfile bundle exec rubocop
この冗長なアプローチはマシン(CI)のために十分に機能します、しかし、人間のためにでなく:別々のlockfileを維持して、発展においてENV VARSを使うことは完全なユーザー経験から遠いです.
Railsアプリケーションの開発については、次のようなトリックを実行してコマンドを実行するには、カスタムgemfilesbin/whatever ラッパー.こちらがbin/rubocop :
#!/bin/bash

cd $(dirname $0)/..

export BUNDLE_GEMFILE=./gemfiles/rubocop.gemfile
bundle check > /dev/null || bundle install

bundle exec rubocop $@
魔法$@ あなたが渡すすべての引数プロキシbin/rubocop , したがって、Rubocopのようなこのラッパーのquackを作る.
私たちもbundle check || bundle install すべてのdepsが存在することを確認するにはbundle install あなた自身.
それです.
P . S .なぜインラインジェムファイルを使用しないのですか?私たちは書くことができますbin/rubocop このように:
require 'bundler/inline'

gemfile(true, quiet: true) do
  gem "rubocop-md", "~> 1.0"
  gem "rubocop-rspec"
  gem "standard", "~> 1.0"
end

require 'rubocop'
RuboCop::CLI.new.run
しかし、このアプローチでは、lockfileが全くありません.私たちは、誰もが依存関係の同じバージョンを使用していることを確認したい(“私のコンピュータ上で動作する”状況を回避する).もちろん、我々は正確なバージョンを使用することができますgemfile do ... end ブロック、しかし、IMOは、バンドルとDEPを管理するより便利ですbundle update ).
P . P . S .このアプローチの利点の1つは、他のツール、例えば他のツールを実行する能力です.Kuby ) 使用中ローカルDocker for application development ; RuboCOPを実行するコンテナをスピンする必要はありません.あなたがgitフックまたはエディタ統合を使いたいならば、それは特に役に立ちます.