如何避免在开发模式下提供预编译资产?
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.jsreviews.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.js
和bar.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 错误,空间不足