ruby-on-rails-3 - 如何在 Assets :precompile 之后刷新 Rails/Sprockets 以了解生产服务器上的新 list

标签 ruby-on-rails-3 rake passenger sprockets capistrano3

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

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

最佳答案

我们最终采用了两部分解决方案:

第 1 部分是设置应用程序以命中 redis 以存储“assets:version”(我们只是使用了时间戳)。然后,每当我们的流程完成预编译时,我们都会使用最新的时间戳更新此 Assets 版本。

第 2 部分是我们在所有其他 Controller 继承的主 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 重置将每个值从新生成的 list 文件“填充”到内存中

  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 的“版本”值,以便它认为(正确地)它需要重新解析并实时重新编译最新的 Assets 。

关于ruby-on-rails-3 - 如何在 Assets :precompile 之后刷新 Rails/Sprockets 以了解生产服务器上的新 list ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769240/

相关文章:

ruby-on-rails - Rails 验证,知道哪个字段无效?

ruby-on-rails - ActiveRecord 对象的 Ruby dup 方法

ruby-on-rails - 显示 SSHKit 调用的 rake 任务的输出

ruby-on-rails - phusion 乘客是否使用 fork ,如果是,在哪里设置 after_fork 配置?

linux - 尝试安装乘客时 Unresolved 依赖关系

mysql - Rails 对两个关联模型的复杂搜索条件

ruby-on-rails - 嵌套模型错误消息

ruby-on-rails - rake 数据库 :migrate doesn't work and brings me back to the command line rails 3. 1.1

ruby-on-rails-3 - 运行 rspec 时隐藏文件列表?

ruby-on-rails - (使用 phusion passenger + Nginx)运行具有相同端口(80)的多个实例名称的相同 Rails 应用程序