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

Ort*_*ntz 54 ruby-on-rails ruby-on-rails-3.1 asset-pipeline

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

development.rb:

config.assets.compress = false
config.assets.debug = true
config.assets.compile = true
Run Code Online (Sandbox Code Playgroud)

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

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

reviews.js:

//= require jquery
//= require jquery_ujs
//= require_tree ./reviews
Run Code Online (Sandbox Code Playgroud)

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

现在,当我使用rake assets:precompile三个JavaScript文件连接到预生成我的资产进行生产时reviews.js.这是一切优秀的生产,但现在,在开发模式,级联reviews.js供应除了两个单独的文件.

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

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

小智 80

config/environments/development.rb集合中:

config.assets.prefix = "/assets_dev"
Run Code Online (Sandbox Code Playgroud)

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

在预编译生产时,请使用

RAILS_ENV=production rake assets:precompile
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是选定的答案.很好找. (15认同)

Ric*_*lse 53

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

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

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

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

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


Pet*_*sen 17

config/environments/development.rb集合中:

config.serve_static_assets = false
Run Code Online (Sandbox Code Playgroud)

并没有从文件/public将送达

  • 请记住,公共文件夹中的任何上传文件都不会被提供,因此最好避免这种情况. (3认同)