Как использовать config.assets.precompile для каталогов, а не для одиночных файлов?

Как использовать config.assets.precompile в производстве, чтобы включать только файлы в 'lib/assets/javascripts', 'lib/assets/stylesheets', 'vendor/assets/javascripts' и 'vendor/assets/stylesheets?

В основном что-то вроде:

config.assets.precompile += %w( pagespecific.js anotherpage.js )

Но используется для автоматического включения файлов в определенные каталоги, которые не являются "app/assets/javascripts" или "app/assets/stylesheets".

* edit: добавив решение, которое я закончил, использовал для специфики страницы js

config.assets.precompile += ['pages/*.js']

Ответ 1

Вы можете просто написать это следующим образом:

config.assets.precompile += ['directory/*']

Ответ 2

Точкой компиляции активов является создание одного (или небольшого количества) файлов для минимизации количества HTTP-запросов из браузера.

Если вы собираетесь обслуживать каждый файл по отдельности, почему бы не просто отключить прекомпиляцию?

Чтобы использовать прекомпиляцию по назначению, создайте целую директорию в один файл, используя Sprockets 'require_directory:

//= require_directory ./awesome_js_app

... и укажите этот файл в массиве config.assets.precompile.

По умолчанию все CSS встроены в application.css и JS в application.js. Вы можете добавить больше файлов верхнего уровня для компиляции с директивой precompile в config/environments/production.rb (и другие envs, если хотите). Например:

config.assets.precompile += %w( public.css public.js )

Затем директивы Sprockets //= require ... в файлах верхнего уровня будут определять состав окончательного скомпилированного файла.

Вы можете использовать эти дополнительные файлы верхнего уровня в своих макетах, чтобы иметь разные CSS и JS для определенных видов.

Ответ 3

Я нашел эту ссылку и думаю, что она вам полезна, см.

keithgaputis ответ. Rails config.assets.precompile для обработки всех файлов CSS и JS в приложении/ресурсах

Я думаю, вы можете сделать следующее:

# 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 "excluding asset: " + full_path
      false
    else
      puts "including asset: " + full_path
      true
    end
  else
    false
  end
}

Ответ 4

Вероятно, лучше включить это как путь к ресурсу (в соответствии с вашим примером):

config.assets.paths << Rails.root.join('app', 'assets', 'javascripts', 'pages')

Он также позволяет включать пути не в каталог активов (например, с включением bootstrap-sass). Эти пути затем добавляются в папку ваших ресурсов в вашем общедоступном каталоге и перемещаются в ваше местоположение вашего ресурса, если вы используете что-то вроде asset_sync.