Spring

参考:

rails/spring: Rails application preloader – GitHub

jonleighton/spring-watcher-listen – GitHub

使い方

group :development do
  gem "listen", ">= 3.0.5", "< 3.2"
  gem "spring"
  gem "spring-watcher-listen", "~> 2.0.0"
end

参考:

Spring install – Qiita

spring を使ってテスト高速化 – Qiita

実践 Ruby on Rails 学習ノート 初期設定編 | 珈琲駆動開発

Rails 使いよ spork, zeus から spring へ!| Act as Professional

spring stop

Spring サーバーの動作を停止させる

$ spring stop

参考:

rails のコマンドが動かない時は spring を (stop|kill) してみよう – Qiita

spring を再起動する – Qiita

開発時に rails コマンドが動かなくなったときの対処法 | Webサプリ

rails console が応答しなくなったら | Permanent Til

Does the Rails Console reload initializers? – Stack Overflow

reload!

rails console で自動読み込みされた定数を再ロードする。

> reload!

※ イニシャライザは再実行されないので注意!!

イニシャライザをリロードするためには、コンソールを終了して spring stop が必要。

参考:

Does the Rails Console reload initializers? – Stack Overflow

ファイルの監視とキャッシュのクリア

参考:

Rails5 で app 以下のディレクトリが読み込まれないとき | nyarn.tech

Rails で app 以下の変更を Spring が検知しない問題を解決した(?) | マスタカの ChangeLog メモ

config/spring.rb

参考:

Rails5 で app 以下のディレクトリが読み込まれないとき | nyarn.tech

Rails で app 以下の変更を Spring が検知しない問題を解決した(?) | マスタカの ChangeLog メモ

spring コマンド実行時に読み込まれる ~/.spring.rb についての試行錯誤の記録 – Qiita

Spring.watch / watcher.add

デフォルトで追加されるパス

  • loaded_application_features
  • Gemfile
  • Gemfile.lock
  • config/initializers
  • config/database
  • config/secrets

監視されているファイルを確認する。

$ rails console
> puts Spring.watcher.files.grep %r{/my_project/config/}
/path/to/my_project/config/spring.rb
/path/to/my_project/config/boot.rb
/path/to/my_project/config/application.rb
...

監視されているディレクトリを確認する。

$ rails console
> puts Spring.watcher.directories.to_a
/path/to/my_project/config/initializers
/path/to/my_project/config

参考:

Watching files and directories – rails/spring: Rails application preloader – GitHub

watcher.add – spring/application.rb at v2.0.2 · rails/spring – GitHub

loaded_application_features – spring/application.rb at v2.0.2 · rails/spring – GitHub

フォーク後にコードを実行する

Spring.after_fork do
  # run arbitrary code
end

参考:

Running code after forking – rails/spring: Rails application preloader – GitHub

DISABLE_SPRING

参考:

3 ways to run Spring (the Rails app preloader) and how to disable it | makandra dev

Rails Spring breaking generators – Stack Overflow

SPRING_LOG

SPRING_LOG:環境変数でログファイルを指定する

rails コマンドの実行時にコマンドラインで指定する

$ spring stop
$ SPRING_LOG=log/spring.log rails runner 'nil'

config/spring.rb で指定する (※ spring server コマンドで標準出力に何も表示されなくなるので注意)

# config/spring.rb

ENV["SPRING_LOG"] = "log/spring.log"

ログファイルを指定して spring server をバックグラウンドで実行する

$ SPRING_LOG=log/spring.log spring server &
$ tails -f log/spring.log

参考:

Environment variables – rails/spring: Rails application preloader – GitHub

Troubleshooting – rails/spring: Rails application preloader – GitHub

symlink が含まれていた場合に表示されるエラーについて

監視するファイル/ディレクトリに symlink が含まれていた場合にエラーが表示される。

エラーをどうにかしたい場合は、以下のモンキーパッチを活用する。

エラーの表示を抑制するモンキーパッチ

module ListenSymlinkErrorSilencer
  def _fail(_, _)
    fail \
      Listen::Record::SymlinkDetector::Error,
      "Don't watch locally-symlinked directory twice"
  end
end

Listen::Record::SymlinkDetector.prepend ListenSymlinkErrorSilencer

監視するディレクトリを変更するパッチ

プロジェクトのルートディレクトリを監視に含めずに、ルートディレクトリ下の symlink ではないディレクトリを監視に含める。

module ListenBaseDirectoriesExtension
  def base_directories
    ((Dir.children(root)
        .select { |entry| File.directory? File.join(root, entry) }
        .reject { |entry| File.symlink?   File.join(root, entry) }
        .map { |d| File.expand_path(d) } +
      files.map { |f| File.expand_path("#{f}/..") } +
      directories.to_a
    ).uniq - [root])
    .map { |path| Pathname.new(path) }
  end
end

Spring::Watcher::Listen.prepend ListenBaseDirectoriesExtension

参考:

Duplicate directory errors · guard/listen Wiki – GitHub

abort on filesystem loop by e2 · Pull Request #273 · guard/listen – GitHub

Feature request: Listen could *really ignore* ignored directories (optimization) · Issue #274 · guard/listen

Suppress errors on local symlinks · Issue #339 · guard/listen – GitHub

Using Listen on Rails root spams errors on local symlinks · Issue #8 · jonleighton/spring-watcher-listen – GitHub

listen/symlink_detector.rb at v3.1.5 · guard/listen – GitHub

spring-watcher-listen/listen.rb at v2.0.1 · jonleighton/spring-watcher-listen – GitHub

add – spring/abstract.rb at v2.0.2 · rails/spring

symlink を辿らない

監視対象ディレクトリ内に symlink が含まれていても辿らない。Listen の仕様。

参考:

Listener does not follow symlinks · Issue #25 · guard/listen – GitHub

Support for symlinked directories · Issue #19 · thibaudgg/rb-fsevent – GitHub

ignore

参考:

Some way to ignore files on Rails 5… · Issue #15 · jonleighton/spring-watcher-listen – GitHub

プラグイン開発時に RSpec で使う

参考:

spring の導入時に application.rb が見つからない | kikukawa’s diary

spring コマンド実行時に読み込まれる ~/.spring.rb についての試行錯誤の記録 – Qiita

production 環境で spring を bundle install しない

$ bundle install --without development test

参考:

Rails の bundle の without オプション | Rails Webook

rails コマンドでエラー cannot load such file — bundler/setup (LoadError) – Qiita

rails console on production uses spring · Issue #318 · rails/spring – GitHub

Update README on deployment by visibletrap · Pull Request #337 · rails/spring – GitHub

Warn if Spring is running in production by agis · Pull Request #532 · rails/spring – GitHub

エンジンの開発で spring を使う

参考:

How to Setup RSpec, Factory Bot and Spring for a Rails 5 Engine – Mohnish G J – Medium

Spring not working fast enough with an engine · Issue #316 · rails/spring – GitHub

Spring can’t run Rails server when developing an engine · Issue #323 · rails/spring – GitHub

config/spring.rb not loaded if used within engine · Issue #144 · rails/spring – GitHub

Rails engine test/dummy with Spork, Guard, RSpec? – Stack Overflow

require した gem をリロードする

参考:

ローカルで開発中の gem をリロードする – Qiita

teohm/require_reloader: Auto-reload require files or local gems without restarting server in Rails development – GitHub

ハングアップ

参考:

Spring hangs a lot · Issue #396 · rails/spring – GitHub

I18n の翻訳ファイルがリロードされない

参考:

新しく国際化ファイルを追加した時は spring を再起動してやらないと rails console に反映されない – Qiita

New locale files require a Spring restart | makandra dev

代替

参考:

Spork / Zeus / Spring によるテスト実行時間の短縮 | Ruby on Rails with OIAX

Tagged:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です