如何刷新Rails / Sprockets以在资产之后了解生产服务器上的新清单:预编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何刷新Rails / Sprockets以在资产之后了解生产服务器上的新清单:预编译相关的知识,希望对你有一定的参考价值。

我们有一个需要运行资产的用例:在部署/重启过程之外进行预编译,因此最好不必重新启动Rails服务器进程。这在乘客环境中是否可行?

我一直在试图在Rake任务中尝试一堆东西并摆弄Rails.application.config.assets的东西,但没有任何东西让应用程序拾取对摘要的更改,除了用/usr/bin/env touch ~/project/current/tmp/restart.txt重新启动Passenger

答案

我们最终选择了2部分解决方案:

第1部分是设置应用程序以命中redis来存储'assets:version'(我们只是带有时间戳)。然后,只要我们的流程完成预编译,我们就会使用最新的时间戳更新此资产版本。

第2部分是我们在我们的主application_controller中添加了一个before_filter :check_assets_version,我们所有其他控制器都继承自。这个方法看起来像这样:

  def check_assets_version
    @@version ||= 1
    latest_version = get_assets_version # wrapped call to redis to get latest version
    # clear assets cache if current version isn't the same as the latest version from redis
    unless latest_version.blank? || latest_version.to_s == @@version
      @@version = latest_version
      if Rails.env.production? || Rails.env.sandbox? || Rails.env.experimental?
        nondev_reset_sprockets
      else
        dev_reset_sprockets @@version
      end
    end
  end

这两个重置方法如下所示:

  def nondev_reset_sprockets
    manifest = YAML.load(File.read(Rails.root.join("public","assets","manifest.yml")))
    manifest.each do |key, value|
      Rails.application.config.assets.digests[key] = value
    end
  end

nondev重置将每个值“填充”到新生成的清单文件的内存中

  def dev_reset_sprockets(version)
    environment = Rails.application.assets
    environment = environment.instance_variable_get('@environment') if environment.is_a?(Sprockets::Index)
    environment.version = version
  end

dev重置只是踢sprockets“版本”值,以便它认为(正确的)它需要重新分析并实时重新编译最新的资产。

另一答案

更新生产资产的另一种方法如下:

Rails.application.assets_manifest.instance_eval do
    new_manifest = Sprockets::Manifest.new(manifest.dir, manifest.filename)
    @data = new_manifest.instance_variable_get(:@data)
end
另一答案

对于Rails 4(Sprockets 2.11),您可以:

  Rails.application.assets_manifest = Sprockets::Manifest.new(Rails.env, Rails.application.assets_manifest.path)
  # see sprockets-rails/lib/railtie.rb
  ActionView::Base.assets_manifest = Rails.application.assets_manifest

以上是关于如何刷新Rails / Sprockets以在资产之后了解生产服务器上的新清单:预编译的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?

禁用 Asset Pipeline/Sprockets Rails 4.1

为什么Sprockets没有找到我编译的资产?

为啥预编译资产不再起作用?

如何将dojo工具包与rails 3.1资产管道和coffeescript一起使用?

Rails 预编译供应商/资产