2

deploy.rbを使用して、レールアセットが変更された場合にのみプリコンパイルします。このタスクは、常にアセットのコンパイルをスキップします:(

namespace :assets do
  task :precompile, :roles => :web, :except => {:no_release => true} do
    from = source.next_revision(current_revision)
    if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
      run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
    else
      logger.info "Skipping asset pre-compilation because there were no asset changes"
    end
  end
end

この完全なタスクがコンパイルされない原因は何ですか?常にアセットの変更はないと考え、そのメッセージをスローします。

また、私はそのタスクを本当に理解したことはありません。たとえば、以下のsource.log.localは何を指しているのでしょうか。

source.local.log

誰かがタスクコマンドが何をするのかを明確にし、アセットの変更がまったく表示されない理由をいくつか知っていますか?ありがとうございました

4

1 に答える 1

17

内容:

from = source.next_revision(current_revision)

sourceSCM(git、svnなど)から見たソースコードへの参照です。これはfrom、(基本的に)現在デプロイされているバージョンのソースコードとして設定されます。

capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l")

capture'シェルでこのコマンドを実行し、その出力を返す'を意味します。問題のコマンドは、デプロイされたバージョンを現在のバージョンと比較するソースへの変更のログを参照し(アセットが存在するパスを「重要」なものとして指定します)、それを単語数ツールに渡します(wc -l)。この-lオプションは、出力の行数のカウントを返すことを意味します。したがって、出力(によって返されるcapture)は、これら2つのバージョン間で変更されたファイル名の数です。

その数がゼロの場合、指定されたパスのいずれにもファイルが変更されていないため、プリコンパイルをスキップします。

なぜ機能しないのか:

知らない。コード自体に問題はないようです。多かれ少なかれ、私が使用しているのと同じスニペットです。確認できることがいくつかあります。

  1. Capistranoは、アセットパイプラインを使用していることさえ知っていますか?Capfileを確認してください。そこにいない場合load 'deploy/assets'、デプロイではアセットのコンパイルも考慮されません。

  2. 実際、アセットパイプラインを有効にしましたか?application.rbで確認してくださいconfig.assets.enabled = true

  3. 間違ったアセットパスが指定されていますか?コードはとの変更をチェックしていvendor/assets/ますapp/assets/。資産が別の場所(lib/assetsたとえば)にある場合、それらは気付かれません。(この場合は、その行を変更して正しいパスを含めることができます。

  4. 実際、前回の展開以降にアセットを変更しましたか?変更されたアセットのチェックをバイパスし、プリコンパイルを1回強制的に実行してから、チェックをオンに戻し、問題が魔法のように解決することを確認することをお勧めします。以下の私の例では、設定force_precompile = trueによってそれが行われます。

私が使用するもの:

これが私が現在使用しているバージョンです。役に立つかもしれません。か否か。オリジナルからの変更:

  1. アセットパスを指定するためのより読みやすい方法(使用する場合は、asset_locationsアセットが存在する場所に設定することを忘れないでください)
  2. プリコンパイルを強制的に実行する簡単な方法(force_precompile=trueチェックの実行を試みるように設定しますが、関係なくプリコンパイルを実行します)
  3. プリコンパイルが実行されたかどうかのカウントを出力します。チェックが実行されていることを確認するためだけに、いくつかの出力を取得していただきありがとうございます。
  4. ファイルを比較しようとしたときにエラーが発生した場合(たとえば、新しいプロジェクトでよく発生するように)、エラーは出力されますが、とにかくプリコンパイルが実行されます。

  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
于 2012-10-16T18:31:45.040 に答える