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

How can I run custom code before any asset precompile in 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 与一些特殊的预处理器捆绑在一起,我不想重写我的 gulp 文件来获得资产管道来处理所有事情......而且我也希望它可以在 Heroku 上运行,而无需自定义构建包(如果可能的话)。有什么想法吗?想必 Sprockets 有这些类型的挂钩。

正如我从源代码中看到的那样,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会在运行ning这个前置任务的阶段退出进程,不会运行 assets:precompile 正如预期的那样。

来源:

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