私は、アプリケーション開発/展開サイクルのさまざまな段階でいくつかの宝石を使用する単純な (またはそう思った) Sinatra アプリを使用しています。
- 依存関係を管理するバンドラー
- ビルドタスクのレーキ
- アセットのプリコンパイル用スプロケット
- テスト用のRSpec 2
- 展開用のカピストラーノ
Gemfile はグループに含まrspec
れtest
ます。
Rakefile は、assets:compile
Sass を CSS に、CoffeeScript を JavaScript に変換し、結果のファイルを連結するタスクを定義します。
Capistrano はbundle install --without development test
、実稼働 (およびアセットのコンパイル) に必要な gem のみが実稼働サーバーにインストールされるように実行されます。また、最終的にサーバー上で実行される Cap タスクも実行bundle exec rake assets:compile
します。
ここまでは順調ですが、RSpec Rake タスクを Rakefile に追加したいのですが、ここで問題が発生します。ローカルで実行すると問題なく動作しますが、実行するcap deploy
とサーバーでエラーが発生します: no such file to load -- rspec/core/rake_task
.
これは理にかなっています。バンドルをインストールするときに RSpec はサーバーにインストールされず、spec タスクが実際にサーバーで実行されることはありません。タスクを定義しようとしただけでエラーが発生します。
これを処理するためのいくつかのオプションを考えることができますが、どれも私には適切ではないようです。
- ブロックにラップ
require 'rspec/core/rake_task'
してbegin...rescue
エラーを無視する rspec
グループから外すtest
か、強制的にサーバーにインストールするassets:compile
タスクのみを含む展開中に別の rakefile を使用するspec
呼び出されたときに RSpec のみを必要とする独自のタスクを定義する- サーバーではなくローカルでプリコンパイルを実行します (これらのオプションの中で私のお気に入り)
ここでのベストプラクティスは何ですか?