如何避免在开发模式下提供预编译资产?

Posted

技术标签:

【中文标题】如何避免在开发模式下提供预编译资产?【英文标题】: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 在开发模式下不使用预编译资产?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何避免在开发模式下提供预编译资产?的主要内容,如果未能解决你的问题,请参考以下文章

rails and metronic - 资产预编译:SassC 错误,空间不足

为生产预编译资产时,没有方法错误,[ ] 未定义 nil 类

数字资产交易所开发C2C模式平台开发

浅谈敏捷开发模式下银行业金融机构开源软件引入风险及管控举措

如何调试速度慢得无法忍受的 Rails 资产预编译

在调试模式下尝试将预编译头文件与 VS2010 (VC100) 一起使用时,如何消除错误 C2859?