Ruby on Rails開発を自動化するためのGuardの構成

みなさんこんにちは! 私の意見では、すべてのプログラマーは、移動するものと存在しないものすべてを自動化および最適化するよう努力する必要があります。 この記事では、GuardというRuby gemを使用してRuby on Rails開発者のワークフローを自動化する方法について説明します。 この記事は主にRuby開発者には役立ちますが、他の人には役立つかもしれません。



画像

ガードとは何ですか?





Guardは、ファイルを変更するときにコマンドを自動的に実行できるツールです。 たとえば、サーバー設定ファイルを変更すると、Guardはサーバーを自動的に再起動する場合があります。 または、ファイルを保存するときにCSSに自動的にコンパイルされるようにLESSを構成できます。 開発者がGuardをどのように構成するかによります。



Guardには特別なGuardfile設定ファイルがあり、これはどのファイルを変更するときにどのコマンドを実行するかを示します。 すべての設定を自分で指定するか、最も頻繁に使用される設定が事前に書き込まれているGuard Pluginsコミュニティによって作成された設定を使用できます。



インストールと最初の開始



Guardをプロジェクトに統合する最善の方法は、GuardをGemfileに追加することです。



group :development do gem 'guard' end
      
      





そして、コマンドでインストールします



 $ bundle
      
      





次に、Guardfileコマンドを作成する必要があります



 $ bundle exec guard init
      
      





Guardを実行するには、Bundlerコマンドを使用するのが最適です。



 $ bundle exec guard
      
      





画像



Ruby on Railsアプリケーションのセットアップ



インストール後、標準のRoRプロジェクトにGuardを使用することを検討してください。 RoRアプリケーションが既に作成されているとします。 Gemfileの変更時に、Guardが必要なすべてのgemを自動的にインストールするようにします。



1.プロジェクトへの追加



これを行うには、Gemfileの開発グループにguard-bundler gemを追加します



 group :development do # And updates gems when needed gem 'guard-bundler', require: false end
      
      





宝石をセット



 $ bundle install
      
      





そして、コマンドでプラグインを初期化します



 $ guard init bundler
      
      





プロジェクトのルートにあるGuardfileに注意してください。 今、行があります



 guard :bundler do watch('Gemfile') end
      
      





彼らは、GuardはGemfileを監視し、guard-bundler gemで事前に作成されたコマンドを実行すると言います。 この場合、それは



 $ bundle install
      
      







2.検証



それをチェックしてください! 次のコマンドを使用して、ターミナルでGuardを有効にします



 $ bundle exec guard
      
      





Gemfileにgemを追加します。 たとえば、 guard-rspecは 、Rspecのテストを自動的に実行します。



 gem 'guard-rspec', require: false
      
      





ガードプロセスでターミナルを開いて、そこでbundlerが自動的に起動したことを確認しましょう。その結果、guard-rspecが自動的にインストールされました。 ご覧のとおり、このようなGuardの設定により、開発者は頻繁に実行されるタスクの1つを自動化できます。



3.セットアップ



Rspecのインストール後にプラグインを初期化する



 $ guard init rspec
      
      





Guardfileに新しい行が追加されました。 それらを考慮してください:



 # Note: The cmd option is now required due to the increasing number of ways # rspec may be run, below are examples of the most common uses. # * bundler: 'bundle exec rspec' # * bundler binstubs: 'bin/rspec' # * spring: 'bin/rsspec' (This will use spring if running and you have # installed the spring binstubs per the docs) # * zeus: 'zeus rspec' (requires the server to be started separetly) # * 'just' rspec: 'rspec' guard :rspec, cmd: 'bundle exec rspec' do watch(%r{^spec/.+_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } watch('spec/spec_helper.rb') { "spec" } # Rails example watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" } watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] } watch(%r{^spec/support/(.+)\.rb$}) { "spec" } watch('config/routes.rb') { "spec/routing" } watch('app/controllers/application_controller.rb') { "spec/controllers" } watch('spec/rails_helper.rb') { "spec" } # Capybara features specs watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" } # Turnip features and steps watch(%r{^spec/acceptance/(.+)\.feature$}) watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' } end
      
      





これらの行は、自動的に実行されるようにRspecテストを構成します。 それらのいくつかを考えてみましょう。 たとえば、次の行



 ruby watch('spec/spec_helper.rb') { "spec” }
      
      





Guardはspec / spec_helper.rbファイル(プロジェクトルートへの相対パスはGuardfileファイル)を監視し、変更されるたびにspecフォルダー全体のテストを開始すると言います。 ブロック開始



 ruby guard :rspec, cmd: 'bundle exec rspec' do
      
      





ルールについては、すべてのRspecコマンドがbundle exec rspecパラメーターで起動されると述べています。 つまり、考慮されるケースでは、ruby spec / spec_helper.rbを変更すると、コマンドが起動されます



 $ bundle exec rspec spec
      
      





ひも



 rubywatch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
      
      





.rbファイルを変更すると、このファイルに関連付けられたテストのテストが開始されると述べています。 つまり、app / models / user.rbを変更すると、コマンドが自動的に実行されます



 $ bundle exec spec spec/models/user_spec.rb
      
      





正規表現は、このようなアクションを作成および編集するために使用されます。 デバッグには、Rubyコンソールでmatchコマンドを使用することをお勧めします。たとえば、



 "app/views/units/index.html.slim".match(%r{^app/views/(.+)/(.*)\.(.*)\.(erb|haml|slim)$})
      
      







その他の例!



Guardの場合、あらゆる場面で多数のプラグインが作成されています。 各開発者は、自分に合った適切なものを個別に見つけて、自分で構成する必要があります。 現在使用しているものについて簡単に説明します。 私自身はまだ完璧な解決策を見つけていないので、コメントや提案を喜んでいます!



gemfileで





 group :development, :test do # Integrates jasmine js testing gem 'jasmine-rails' # With guard gem 'guard-jasmine', git: "git://github.com/guard/guard-jasmine.git", branch: "jasmine-2" # Checks ruby code grammar gem 'rubocop', require: false # With rspec gem 'rubocop-rspec' # With guard gem 'guard-rubocop' end group :development do # Automagically launches tests for changed files gem 'guard' gem 'guard-rspec', require: false # And updates gems when needed gem 'guard-bundler', require: false # And auto starts rails server gem 'guard-rails' # And auto runs migrations gem 'guard-migrate' end
      
      







ガードファイル内





 # More info at https://github.com/guard/guard#readme # https://github.com/guard/guard-bundler guard :bundler do watch('Gemfile') end # https://github.com/guard/guard-rspec guard :rspec, cmd: 'zeus rspec' do watch(%r{^spec/.+_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } # Run the model specs related to the changed model watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } # Controller changes watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] } watch('config/routes.rb') { "spec/controllers" } watch('app/controllers/application_controller.rb') { "spec/controllers" } watch(%r{^spec/support/(.+)\.rb$}) { "spec" } watch('spec/rails_helper.rb') { "spec" } watch('spec/spec_helper.rb') { "spec" } # Capybara features specs watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/acceptance/#{m[1]}" } watch(%r{^app/views/(.+)/(.*)\.(.*)\.(erb|haml|slim)$}) { |m| "spec/acceptance/#{m[1]}" } watch(%r{^app/views/(.+)/_.*\.(erb|haml|slim)$}) { |m| "spec/acceptance/#{m[1].partition('/').first}/#{m[1].partition('/').last}_spec.rb" } end # Checks any changed ruby file for code grammar # https://github.com/yujinakayama/guard-rubocop guard :rubocop, all_on_start: false, cli: ['--out', 'log/rubocop.log'] do watch(%r{^(.+)\.rb$}) { |m| "#{m[1]}.rb" } end # Restarts server on config changes # https://github.com/ranmocy/guard-rails guard :rails, zeus: true, daemon: true do watch('Gemfile.lock') watch(%r{^(config|lib)/.*}) end # Restarts all jasmine tests on any js change # https://github.com/guard/guard-jasmine guard :jasmine, all_on_start: false, server_mount: '/specs' do watch(%r{^app/(.+)\.(js\.coffee|js|coffee)}) { "spec/javascripts" } watch(%r{^spec/javascripts/(.+)\.(js\.coffee|js|coffee)}) { "spec/javascripts" } end # Runs migrations on migrate files changes # https://github.com/glanotte/guard-migrate guard :migrate do watch(%r{^db/migrate/(\d+).+\.rb}) watch('db/seeds.rb') end
      
      





ルボコップについて少し



画像

Rubocopは、.rbファイルで構文が正しいかどうかを確認できるRuby gemです。 この例では、Guardと一緒に構成されているため、Rubocopの.rbファイルを変更するたびに、それを確認し、コンソールとlog / rubocop.logファイルに結果を表示します。



Rubocopには膨大な数の設定があるため、任意の構文要件に適合させることができます。 コードを自動的に修正することもできます。 .rubocop.ymlファイルはgemの設定に使用されます。たとえば、rubocopは通常90文字を超える行で誓いますが、設定ファイルのおかげで、140文字を超える行のみを指すようにできます。



すべての設定を表示するには、コマンドを実行するだけです



 $ rubocop --auto-gen-config
      
      





すべての設定を無効にしてファイルを作成します。 したがって、1つずつオンにして、目的の最終的な.rubocop.ymlファイルを取得できます。



結果



最終的に何が設定されますか? このプロジェクトでは、別のプロセスzeusとguardを実行するだけで十分です。 その後、次のことが起こります。

  1. zeus Railsを介して実行されているサーバーは自動的にサポートされ、メインのプロジェクト設定ファイルが変更されるたびに再起動します
  2. gemfileを変更するたびに、すべてのgemがインストールされます
  3. テストでファイルを変更すると、このテストが実行されます
  4. コントローラー/モデル/ライブラリ/ビューのファイルを変更すると、関連するテストがあれば起動されます
  5. 変更された各rubyファイルは、rubocopを使用してリテラシーをチェックします
  6. javascript / coffeescriptファイルを変更すると、すべてのジャスミンテストが実行されます
  7. 移行ファイルまたはシードを変更すると、必要なすべての移行が実行されます


画像



したがって、十分に多数のプロセスが自動化されました。 各プロジェクトについて、警備員を立ち上げ、創造的なプロセスに完全に集中するだけで十分であることを確認したいと思います。



ガードの例



次に、Guardを使用した現在のプロセスについて説明します。 以下は、私が現在一緒に働いている他の開発者に私が与えた推奨事項です。

  1. ターミナルを開き、プロジェクトフォルダーに移動します
  2. テスト/サーバーを高速化するためにzeusを実行する

     $ zeus start
          
          



  3. ガードを起動

     $ bundle exec guard
          
          





    これで、Guardが自動的に起動し、Zeusで有効化された付属のRailsサーバーをサポートします。
  4. ターミナルでEnterキーを押して、すべてのテストを実行します。 すべてのテストを修正したら、作業できます!


注意すべき点:テストファイルを変更すると、テストが自動的に実行されます。 つまり、IDEウィンドウと同時にターミナルウィンドウを開いたままにすることをお勧めします(たとえば、Rubymineでは、下のウィンドウでこれを行うことができます)。変更が行われたことでテストが失敗したかどうかをすぐに確認できます。



画像



よろしくお願いします!



読んでくれてありがとう! 私はGuardの専門家であると主張していないので、コメントや提案を喜んでいます。



All Articles