このタスクは、スプロケットが基になるコンパイルされていないリソースが配置されている場所を含まない論理パスで機能するという事実によって、より困難になります。
私のプロジェクトに「/app/assets/javascripts/foo/bar.js.coffee」という JS ファイルがあるとします。
sprockets コンパイラは、最初に出力ファイルの拡張子 (この場合は ".js") を決定し、次に論理パス "foo/bar.js" をコンパイルするかどうかを評価します。コンパイルされていないリソースは、「app/assets/javascripts」、「vendor/assets/javascripts」、「lib/assets/javascripts」、または gem にある可能性があるため、論理パスに基づいて特定のファイルを含める/除外する方法はありません1人。
基礎となるリソースがどこにあるかを判断するには、sprockets 環境 (オブジェクト Rails.application.assets を介して利用可能) に、論理パスが与えられたリソースの実際のパスを解決するように依頼する必要があると思います。
これが私が使用しているソリューションです。私はRubyにかなり慣れていないので、これは最もエレガントなコードではありません:
# In production.rb
config.assets.precompile << Proc.new { |path|
if path =~ /\.(css|js)\z/
full_path = Rails.application.assets.resolve(path).to_path
app_assets_path = Rails.root.join('app', 'assets').to_path
if full_path.starts_with? app_assets_path
puts "including asset: " + full_path
true
else
puts "excluding asset: " + full_path
false
end
else
false
end
}
スプロケット > 3.0 では、Rails.application.assets が nil になるため (デフォルト: config.assets.compile = false と仮定)、これは本番環境では機能しません。
回避するには、full_pathの割り当てを次のように置き換えます。
@assets ||= Rails.application.assets || Sprockets::Railtie.build_environment(Rails.application)
full_path = @assets.resolve(path)
参照: https://github.com/rails/sprockets-rails/issues/237