【问题标题】:How to avoid precompiled assets being served in development mode?如何避免在开发模式下提供预编译资产?
【发布时间】:2011-12-22 05:52:26
【问题描述】:

我更喜欢 在开发模式下连接 JavaScript 文件,而是将它们作为单独的文件提供。所以我配置了:

开发.rb:

config.assets.compress = false
config.assets.debug = true
config.assets.compile = true

在我的 /app/assets/javascript 目录中,我有:

  • reviews.js
  • 评论/
    • foo.js
    • bar.js

reviews.js:

//= require jquery
//= require jquery_ujs
//= require_tree ./reviews

我在我的布局中包含使用<%= javascript_include_tag "reviews" %> 的JavaScript。生成的页面分别正确引用了三个脚本,reviews.js 基本上是空的。到目前为止一切顺利。

现在,当我使用 rake assets:precompile 为生产预编译我的资产时,三个 JavaScript 文件被连接到 reviews.js。这对于生产来说一切都很好,但是现在,在开发模式中,连接的 reviews.js 被提供除了两个单独的文件。

当然,这会导致开发时出现各种令人讨厌的错误,因为现在foo.jsbar.js 的内容被提供了两次,其中一个可能是reviews.js 中的旧版本。

如何确保 Rails 在开发模式下不使用预编译资产?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline


    【解决方案1】:

    config/environments/development.rb 集合中:

    config.assets.prefix = "/assets_dev"
    

    以便在 development 模式下 Rails 会在那里查看(但它不会找到任何东西,因为您不会在开发中编译资产(这确实是您正在尝试做的 - 不编译资产))。

    生产预编译时,使用

    RAILS_ENV=production rake assets:precompile
    

    所以它会编译到默认资产文件夹public/assets

    【讨论】:

    • 这应该是选择的答案。很好的发现。
    • 需要注意的是,这个改变会改变 Rails 在其 URL 中使用的“assets/”路径,所以你会得到像http://127.0.0.1:3000/assets_dev/favicon.ico这样的图像
    • 有时您必须预编译资产。所以这是最好的答案。否则,您将需要不断删除和重新生成资产。
    • 这只是在测试环境中对我不利:Selenium 使用的是预编译资产,而我的 Ajax 测试失败了。我将在config\environments\test.rb 中尝试此解决方法。
    • 看起来这在 Rails 4 中不再有效。似乎将config.assets.prefix 用于预编译文件的目录和从中提取资产的目录。
    【解决方案2】:

    听起来您正在本地预编译。因为文件存在于您的开发服务器所服务的预期位置,并且请求不会发送到 Sprockets。

    阻止这种情况的唯一方法是删除已编译的文件。

    通常您不需要在本地编译。预计在几乎所有情况下,预编译任务都将在应用程序部署期间运行。在资产管道指南页面上有一个 Capistrano 配方。

    如果您确实需要将这些文件在本地提交到您的存储库,您可以使用分支来避免该问题。为生产代码保留主分支,并为开发创建第二个分支。仅在 master 上编译和提交资产。当您切换到开发时,它们将消失。根据需要将 dev 合并到 master 中。

    编辑:确保强制更新浏览器(control + F5),否则您可能会从浏览器缓存中找到使用的旧资源!

    【讨论】:

    • 感谢您的建议,我在本地删除了已编译的文件并配置为让它们在 git push 上编译到 heroku。
    • 这就是我需要的答案。确实,我在开发时不需要这些预编译的资产,但是当我正在学习如何配置资产管道时,我确实需要它们在本地测试我的生产模式,而不是等待 Heroku 的惊喜!现在我将更改目录名称(或将它们放在 git 分支上),但仍然很遗憾,这是我需要考虑的另一件事,而不是开发环境中的配置选项说“忽略公共/资产我希望的目录”。
    • 您可能还必须不要忘记清除浏览器缓存,这样浏览器就不会使用您在 rm -rf'd public/assets 之前意外加载的 application.js
    • 好点,我将编辑该答案,以便预先明确。
    【解决方案3】:

    config/environments/development.rb 集合中:

    config.serve_static_assets = false
    

    不会提供来自/public 的文件

    【讨论】:

    • 请记住,不会提供公用文件夹中的任何上传文件,因此最好避免这种情况。
    • 在后来的版本中,这已更改为config.serve_static_files
    • 在 Rails 5.1.6 中,这将关闭来自 public/ 的服务资产,但它仍然不会打开来自 app/assets/ 的服务资产——根本不会提供任何资产。
    【解决方案4】:

    我试过了,效果很好。 rake assets:precompile RAILS_ENV=production

    我观察到新版本的资产管道在您运行 rake assets:precompile 时会执行此操作rake assets:precompile:all

    【讨论】:

      猜你喜欢
      • 2012-02-15
      • 2012-12-26
      • 2011-09-18
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2013-10-31
      相关资源
      最近更新 更多