Как я могу запустить пользовательский код перед любой предварительной компиляцией активов в 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 12

1 ответ:

Как я могу видеть из источника, у звездочек Нет такого крюка, но вы можете использовать крюки задачи грабли. Например, вы создадите задачу 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 за собой, как и ожидалось.

Источники:

  1. грабли перед заданием крюк
  2. http://www.dan-manges.com/blog/modifying-rake-tasks