Как запустить пользовательский код до того, как какой-либо ресурс будет предварительно скомпилирован в Rails?

Что-то вроде (в инициализаторе):

Sprockets.before_precompile do
  # some custom stuff that preps or autogenerates some asset files
  # that should then be considered in the asset pipeline as if they were checked in
end

В частности, я хотел бы запустить задачу gulp, чтобы связать некоторый Javascript с некоторыми специальными препроцессорами, и я бы предпочел не переписывать свой gulpfile, чтобы получить конвейер активов для обработки всего... и я также хочу, чтобы это работать на Heroku, не требуя специального сборщика, если это вообще возможно. Есть предположения? Предположительно, звездочки имеют эти типы крючков.

Ответ 1

Как я вижу из источника, Sprockets не имеет такого крючка, но вы можете использовать перехватчики задач рейка. Например, вы создадите задачу rake, которая запускает все препроцессоры, gulp и т.д., Поэтому эту задачу можно было бы поставить перед предварительной компиляцией.

# lib/tasks/before_assets_precompile.rake

task :before_assets_precompile do
  # run a command which starts your packaging
  system('gulp production')
end

# every time you execute 'rake assets:precompile'
# run 'before_assets_precompile' first    
Rake::Task['assets:precompile'].enhance ['before_assets_precompile']

Затем вы просто запустите rake assets:precompile, и в результате задача before_assets_precompile будет выполнена непосредственно перед ней.

Также используйте system вместо exec, потому что exec выйдет из процесса на этапе выполнения этой предварительной задачи и не будет запускать assets:precompile после себя, как и ожидалось.

Источники: