使用Rails 6.0.2.1和Ruby 2.6.3以及NGINXI,当资产在生产服务器中发生变化时,有一个rake任务的工作是重新编译资产。
#Called by delayed job UpdateAssetsJob
require 'rake'
desc "Applying Theme, will restart server and may take a while!"
task :apply_css => :environment do
Rails.logger.info("Applying CSS in #{Rails.env}")
if Rails.env == "production"
Rails.logger.info("Compiling Assets")
Rake::Task['assets:precompile'].invoke
Rake::Task['assets:precompile'].reenable
# `RAILS_ENV=production rails assets:precompile`
Rails.logger.info("Cleaning assets - busting cache")
Rake::Task['assets:clean'].invoke
Rake::Task['assets:clean'].reenable
# `RAILS_ENV="production" rake assets:clean`
Rails.logger.info("Restarting Puma server")
`bundle exec pumactl -S /home/app_path/shared/tmp/pids/puma.state -F /home/app_path/shared/puma.rb restart`
end
end
这样做的问题是,资产只能被编译一次。
我试过在编译前使用
#Clobber assets to force recompilation
Rails.logger.info("Clobber Assets")
Rake::Task['assets:clobber'].invoke
Rake::Task['assets:clobber'].reenable
但同样的,这也只能用一次
场景是:一个管理员更新了当前应用程序主题的颜色,导致后台任务--延迟工作--写下必要的更改。
一个管理员更新了当前应用程序主题的颜色,导致一个后台任务,延迟的工作,将必要的更改写入到
assests/stylesheets/_colours.scss file
为了让这些变化生效,我编译资产,清理资产,确保已缓存资产的访问者获得最新版本,然后重新启动服务器。
由于我使用部分语法来命名_colours.scss,所以在开发环境中我不需要这个功能,因为变化会被自动接收到
欢迎提出更合适的解决方案建议
解决这个问题的方法是从使用
Rake::Task['assets:precompile'].invoke
Rake::Task['assets:precompile'].reenable
到
RAILS_ENV=production rails assets:precompile
我确实需要clobber资产,但无法解释的是,一旦我切换了预编译任务,assets:clobber任务就会运行多次。
问题解决了