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

时间:2011-11-04 17:33:09

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

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

development.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的内容会提供两次,其中一个是{{1}中可能较旧的版本}。

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

4 个答案:

答案 0 :(得分:80)

config/environments/development.rb集合中:

config.assets.prefix = "/assets_dev"

所以在开发模式下Rails会看到那里(但是它不会找到任何东西,因为你不会在开发中编译资产(这确实是你想要做的 - 不编译资产))。

预编译生产时,请使用

RAILS_ENV=production rake assets:precompile

因此它会编译到默认资源文件夹public/assets

答案 1 :(得分:53)

听起来好像是在本地进行预编译。因为文件存在于预期的位置,所以它们由开发服务器提供服务,并且请求不会转到Sprockets。

停止此操作的唯一方法是删除已编译的文件。

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

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

编辑:确保您强制浏览器更新(控制+ F5),或者您可能会发现浏览器缓存中使用的旧资产!

答案 2 :(得分:17)

config/environments/development.rb集合中:

config.serve_static_assets = false

并且不会提供/public中的任何文件

答案 3 :(得分:1)

我尝试了这个并且它有效。 rake assets:precompile RAILS_ENV=production

我发现,当您运行rake assets:precompile rake assets:precompile:all

时,新版本的资产管道会执行此操作