为什么Rake任务增强在我的本地环境和部署到Heroku Cedar之间有所不同?

我在lib / tasks / foo.rake中有这个:

Rake::Task["assets:precompile"].enhance do print ">>>>>>>> hello from precompile" end Rake::Task["assets:precompile:nondigest"].enhance do print ">>>>>>>> hello from precompile:nondigest" end 

当我运行rake assets:precompile在本地rake assets:precompile ,两个消息都被打印出来。

当我推送到heroku时,只打印非简化消息。 但是, 根据buildpack ,push正在执行与我本地完全相同的命令。

为什么基础资产的增强:预编译案例在heroku上不起作用但在本地工作?

我一直在调查这个问题,我发现assets:precompile的行为assets:precompile取决于RAILS_ENVRAILS_GROUPS是否设置都在本地查看。

  # This works → bundle exec rake assets:precompile RAILS_ENV=production >>>>>>>> hello from precompile:nondigest >>>>>>>> hello from precompile # This works → bundle exec rake assets:precompile RAILS_GROUPS=assets >>>>>>>> hello from precompile:nondigest >>>>>>>> hello from precompile → # This does not work :'( → bundle exec rake assets:precompile RAILS_ENV=production RAILS_GROUPS=assets >>>>>>>> hello from precompile:nondigest → 

问题来自https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/sprockets/assets.rake在invoke_or_reboot_rake_task方法中,如果你替换Rake::Task[task].invoke line使用ruby_rake_task task然后它就像你期望的那样工作。 我一直在探究为什么会这样,并且没有找到原因。

由于两个变量都是在Heroku构建包中设置的,因此您可以创建自定义构建包而不设置GROUP和ENV设置,但我认为这样做太过分了。 在这种情况下,您应该能够增强assets:precompile:primaryassets:precompile:all并获得类似于您期望的意图的结果。

你在设置RAILS_ENV=productionRAILS_GROUPS=assets吗?

另外,根据这篇文章 ,Heroku不支持自定义资产编译任务……