10

私は、Rails で遅延アセットのプリコンパイルを実行するための、複雑で一般的に効果のないさまざまなソリューションを見てきました。バックエンド開発者として、プログラムがデプロイされるたびに決して触れないアセットを再コンパイルしたくはありませんが、アセットは でタスクを定義するのではなくCapfile経由で読み込まれるため、条件付きで無効にする方法が思いつきません。 .load 'deploy/assets'deploy.rb

私が求めている動作はcap deploy、通常の with-precompile デプロイに使用cap deploy:no_assetsし、アセットのデプロイをスキップするために使用することです。

4

3 に答える 3

15

Turbo-sporocket-rails とその auto-skip スクリプトには、いくつかの落とし穴があります (後で説明します)。そこで、次のハックを使用して、パラメーターを渡してアセットのプリコンパイルを自由にスキップできるようにします。

callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" }
callbacks[:after].delete(callback)
after 'deploy:update_code', 'deploy:assets:precompile' unless fetch(:skip_assets, false)

このスクリプトは組み込みの asset-precompile フックを変更するため、 skip_assetsパラメーターに基づいてフックされます。cap deploy -S skip_assets=trueアセットのプリコンパイル全体をスキップするように呼び出すことができます。


私にとって、ターボ スプロケット レールは、何も変更されていない場合でも、チェックを行うのに数分かかります。これは、サーバーにできるだけ早く修正をプッシュする必要がある場合に非常に重要です。したがって、強制スキップ方法が必要です。

于 2013-05-15T03:45:47.917 に答える
7

rails4は、変更されたアセットのみをプリコンパイルすることで、新しいバージョンのスプロケットでこの問題に対処しています。それまでの間、rails3アプリには、turbo-sprockets-rails3 gem をお勧めします。

この gem はNathan Broadbent による一連のパッチとして始まりましたが、この問題は rails4 で既に対処されていたため、マージされませんでした。README から:sprockets-railsmaster

  • ソースファイルのハッシュに基づいて、変更されたアセットのみを再コンパイルすることにより、Rails 3 rake assets:precompile を高速化します

  • 一度コンパイルするだけで、フィンガープリントと非フィンガープリントの両方のアセットを生成

と:

Turbo-sprockets-rails3 は、最新バージョンの Capistrano ですぐに使用できるはずです。

Capistrano を使用してデプロイする rails-3.2.x アプリでうまく機能することを確認できます。

GitHubbers の補足として、元のプル リクエストは、マージされていない場合でも、オープン ソース プロジェクトにコードを送信する方法の優れた例です。

于 2013-02-13T19:26:29.287 に答える
1

この要点は非常に有望に見えます https://gist.github.com/3072362

前回のデプロイから現在までの git ログをチェックして、変更があるかどうかを確認し、変更がある%w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb)場合はその時点でのみプリコンパイルします。

于 2012-07-15T14:41:10.210 に答える