如何强制编译资产 - Rails 6

How to force asset compilation - Rails 6

将 Rails 6.0.2.1 与 Ruby 2.6.3 和 NGINX 结合使用 我有一个 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

我确实需要破坏资产,无法解释的是,一旦我切换预编译任务,assets:clobber 任务将 运行 多次

问题已解决