如何在Rails中的任何资产预编译之前运行自定义代码?

时间:2015-01-04 02:04:35

标签: ruby-on-rails heroku sprockets

像(在初始化程序中)的东西:

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上工作,而不需要自定义buildpack。有什么想法吗?据推测,链轮有这些类型的挂钩。

1 个答案:

答案 0 :(得分:25)

正如我从源代码中看到的,Sprockets没有这样的钩子,但你可以使用rake任务钩子。例如,您将创建一个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}}本身就像预期的那样。

来源:

  1. Rake before task hook
  2. http://www.dan-manges.com/blog/modifying-rake-tasks