2011-11-04 71 views
48

我更喜欢而不是以开发模式连接JavaScript文件,但将它们作为单个文件提供。所以我配置:如何避免以开发模式提供预编译资源?

development.rb:

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

在我的/应用/资产/ JavaScript的目录,我有:

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

reviews.js:

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

我包括JavaScript的在我的布局使用<%= javascript_include_tag "reviews" %>。生成的页面单独正确地引用这三个脚本,并且reviews.js基本上是空的。到现在为止还挺好。

现在,当我使用rake assets:precompile预编译我的资产进行生产时,三个JavaScript文件连接成reviews.js。这对于生产来说都很好,但现在,处于开发模式,连接的reviews.js服务于另外到两个单独的文件。

当然,这会导致各种讨厌的错误发展,因为现在,foo.jsbar.js的内容被提供两次,其中一个在reviews.js的潜在旧版本中。

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

回答

52

这听起来像是你在本地进行预编译。由于文件存在于预期位置,因此它们将由开发人员服务器提供服务,并且请求不会转到链接。

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

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

如果您确实需要将这些文件本地提交到您的回购站,则可以使用分支来避免该问题。为生产代码保留主分支,并为dev创建第二个分支。只在主人上编译和提交资产。当你切换到dev时,他们将会消失。根据需要将开发合并到主设备中。

编辑:确保您强制您的浏览器进行更新(控制+ F5),或者您可以从浏览器缓存中找到使用的旧资产!

+0

谢谢你的建议,我本地删除编译后的文件和配置已经他们混帐推到Heroku的编译。 –

+1

这是我需要的答案。确实,在我开发过程中,我并不需要这些预编译资产,但是当我正在学习如何配置资产管道时,我确实需要他们在本地测试我的生产模式,而不是等待Heroku上的惊喜!现在我要改变目录名(或把它们放到一个git分支上),但仍然是一个耻辱,这是我需要考虑的另一件事,而不是在开发环境中配置选项来说“忽略公共/资产目录“,这是我所希望的。 – Phantomwhale

+1

您可能不得不忘记清除浏览器缓存,因此浏览器不会使用在rm -rf'd public/assets –

1

我试过这个,它的工作。rake assets:precompile RAILS_ENV=production

我观察到的资产管道的新版本做这个当您运行rake assets:precompile确实rake assets:precompile:all

80

config/environments/development.rb集:

config.assets.prefix = "/assets_dev" 

使得发展模式Rails会在那里寻找(但它不会找到任何东西,因为您不会在开发中编译资产(这实际上是您要做的 - 不是编译资产))。

当预编译的生产,使用

RAILS_ENV=production rake assets:precompile 

所以它编译成默认的文件夹资产,public/assets

+15

这应该是选定的答案。很好的发现。 –

+1

应该指出的是,这种改变会改变Rails在其URL中使用的“assets /”路径,以便获得像“http://127.0.0.1:3000/assets_dev/favicon.ico”这样的图像。 –

+0

预先编译资产。所以这是最好的答案。否则,您将需要继续删除和重新生成资产。 –

15

config/environments/development.rb集:

config.serve_static_assets = false 

,并没有文件从/public将送达

+3

请记住,公共文件夹中的任何上传文件都不会被提供,所以最好避免这种情况。 –

+1

在后一版本中,它已被更改为'config.serve_static_files' –