内容:
from = source.next_revision(current_revision)
source
SCM(git、svnなど)から見たソースコードへの参照です。これはfrom
、(基本的に)現在デプロイされているバージョンのソースコードとして設定されます。
capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l")
capture
'シェルでこのコマンドを実行し、その出力を返す'を意味します。問題のコマンドは、デプロイされたバージョンを現在のバージョンと比較するソースへの変更のログを参照し(アセットが存在するパスを「重要」なものとして指定します)、それを単語数ツールに渡します(wc -l
)。この-l
オプションは、出力の行数のカウントを返すことを意味します。したがって、出力(によって返されるcapture
)は、これら2つのバージョン間で変更されたファイル名の数です。
その数がゼロの場合、指定されたパスのいずれにもファイルが変更されていないため、プリコンパイルをスキップします。
なぜ機能しないのか:
知らない。コード自体に問題はないようです。多かれ少なかれ、私が使用しているのと同じスニペットです。確認できることがいくつかあります。
Capistranoは、アセットパイプラインを使用していることさえ知っていますか?Capfileを確認してください。そこにいない場合load 'deploy/assets'
、デプロイではアセットのコンパイルも考慮されません。
実際、アセットパイプラインを有効にしましたか?application.rbで確認してくださいconfig.assets.enabled = true
間違ったアセットパスが指定されていますか?コードはとの変更をチェックしていvendor/assets/
ますapp/assets/
。資産が別の場所(lib/assets
たとえば)にある場合、それらは気付かれません。(この場合は、その行を変更して正しいパスを含めることができます。
実際、前回の展開以降にアセットを変更しましたか?変更されたアセットのチェックをバイパスし、プリコンパイルを1回強制的に実行してから、チェックをオンに戻し、問題が魔法のように解決することを確認することをお勧めします。以下の私の例では、設定force_precompile = true
によってそれが行われます。
私が使用するもの:
これが私が現在使用しているバージョンです。役に立つかもしれません。か否か。オリジナルからの変更:
- アセットパスを指定するためのより読みやすい方法(使用する場合は、
asset_locations
アセットが存在する場所に設定することを忘れないでください)
- プリコンパイルを強制的に実行する簡単な方法(
force_precompile=true
チェックの実行を試みるように設定しますが、関係なくプリコンパイルを実行します)
- プリコンパイルが実行されたかどうかのカウントを出力します。チェックが実行されていることを確認するためだけに、いくつかの出力を取得していただきありがとうございます。
- ファイルを比較しようとしたときにエラーが発生した場合(たとえば、新しいプロジェクトでよく発生するように)、エラーは出力されますが、とにかくプリコンパイルが実行されます。
。
namespace :assets do
task :precompile, :roles => :web, :except => { :no_release => true } do
# Check if assets have changed. If not, don't run the precompile task - it takes a long time.
force_compile = false
changed_asset_count = 0
begin
from = source.next_revision(current_revision)
asset_locations = 'app/assets/ lib/assets vendor/assets'
changed_asset_count = capture("cd #{latest_release} && #{source.local.log(from)} #{asset_locations} | wc -l").to_i
rescue Exception => e
logger.info "Error: #{e}, forcing precompile"
force_compile = true
end
if changed_asset_count > 0 || force_compile
logger.info "#{changed_asset_count} assets have changed. Pre-compiling"
run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
else
logger.info "#{changed_asset_count} assets have changed. Skipping asset pre-compilation"
end
end
end