【问题标题】:Preventing Heroku from using precompiled assets in development mode防止 Heroku 在开发模式下使用预编译资产
【发布时间】:2012-02-15 17:22:24
【问题描述】:

目前看来,当我将代码推送到实例时,Heroku 决定预编译资产。

这对于生产服务器非常有用,但是对于我的“RAILS_ENV=development”服务器,这会导致问题,因为我现在从我的资产清单中获取包含所有 JavaScript 文件的页面,然后是另一个具有相同代码的文件全部归为预编译资产。

这会导致我的 jquery 数据表库中断,引发弹出错误,而我在本地环境(开发或生产)或生产 Heroku 实例中都没有。

是否有在 Heroku 上为开发模式实例禁用资产的预编译?或者有什么理由没有在开发 Heroku 服务器上禁用这些?

【问题讨论】:

    标签: ruby-on-rails-3 ruby-on-rails-3.1 heroku asset-pipeline precompiled


    【解决方案1】:

    AFAIK,Heroku 必须预编译资产以解决其只读 FS 以及 Rails 资产管道想要将文件写入 FS 的事实。我唯一能建议的就是弄清楚为什么你的资产在编译时会破坏。

    【讨论】:

    • 我相信这是因为它们被加载了两次。在开发模式下,rails 解构 JS 清单文件并在页面中包含所有单独的 JS 链接,然后在页面继续加载包含所有代码的预编译 JS 清单时再次。这不会发生在我的本地开发机器(正确地没有预编译资产)或任何生产环境(所有资产都必须预编译)
    【解决方案2】:

    如果 Heroku 检测到 public/assets/manifest.yml 文件,那么他们将不会尝试预编译您的资产并假设您正在自己处理它们。更多详情http://devcenter.heroku.com/articles/rails31_heroku_cedar

    【讨论】:

    • 这将涉及到我必须有一组单独的代码我推送到开发和生产,我猜(否则生产也会停止预编译资产!)谢谢你的提示 - 可以让我起来并运行,但我想知道 herkou 是否可以提供一个解决方案,我不需要为开发 heroku 设置不同的代码/git 分支(例如 ENV 变量,或使用 Ruby 环境 rb 脚本值)
    • 如果在您的应用程序中检测到 public/assets/manifest.yml,Heroku 将假定您正在自己处理资产编译,并且不会尝试编译您的资产。在 Rails 4 中,应该有一个 public/assets/manifest-.json 。在这两个版本上,您都可以通过在本地运行 $ rake assets:precompile 并将生成的文件检入 Git 来生成此文件。
    【解决方案3】:

    我通过在我的 Rakefile 中添加一些 voodoo 来禁用 assets:precompile rake 任务来解决这个问题。

    首先我添加 user-env-compile labs 组件

    heroku labs:enable user-env-compile
    

    然后将其添加到我的 Rakefile 的开头

    # found from http://blog.jayfields.com/2008/02/rake-task-overwriting.html
    # used by conditional heroku asset compile magick
    class Rake::Task
      def overwrite(&block)
        @actions.clear
        enhance(&block)
      end
    end
    

    然后我在 lib/tasks/disable_assets_on_heroku.rake 中添加这个 rake 任务

    if ENV['RAILS_ENV'] == 'development'
      namespace :assets do
        task(:precompile).overwrite do
          puts "Asset precompile skipped in #{ENV['RAILS_ENV']}"
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 2012-12-26
      • 2012-06-26
      • 2015-08-28
      • 2012-10-19
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多