Эта задача осложняется тем, что Звездочки работают с логическими путями, которые не включают, где находится лежащий в основе, некомпилированный ресурс.
Предположим, что в моем проекте есть JS-файл «/app/assets/javascripts/foo/bar.js.coffee».
Компилятор звездочек сначала определяет расширение выходного файла, в данном случае «.js», а затем оценивает, следует ли компилировать логический путь «foo/bar.js». Некомпилированный ресурс может быть в «app/assets/javascripts», «vendor/assets/javascripts», «lib/assets/javascripts» или драгоценном камне, поэтому нет способа включить/исключить конкретный файл на основе логического пути в одиночестве.
Чтобы определить, где находится базовый ресурс, я полагаю, что необходимо спросить среду 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 будет ноль (предполагается, что по умолчанию: конфиг .assets.compile = false).
Чтобы обойти замены Полный_путь назначение:
@assets ||= Rails.application.assets || Sprockets::Railtie.build_environment(Rails.application)
full_path = @assets.resolve(path)
Смотрите также: https://github.com/rails/sprockets-rails/issues/237
Возможный дубликат [Как использовать config.assets.precompile для каталогов, а не отдельных файлов?] (Http://stackoverflow.com/questions/12613980/how-do-i-use-config-assets-precompile -for-directories-rather-than-single-files) – Jason