config.assets.precompile的目的是什么?

时间:2011-11-04 16:19:24

标签: ruby-on-rails-3 ruby-on-rails-3.1

在Rails 3.1中,您必须将要包含在资产预编译中的文件列入白名单。您必须打开config / environments / production.rb并明确包含您想要预编译的资产:

config.assets.precompile += ['somestylesheet.css']

如果你不这样做而且你运行 rake assets:precompile ,你的资产将不会被复制到公共/资产,而你的应用程序会引发异常(因此导致500错误)在生产中)当找不到资产时。

为什么这有必要?为什么所有资产都不会自动预编译?

这种当前方法在部署时会产生额外的代码和压力。黑名单/排除资产不是更容易,所以事情开箱即用吗?其他人分享这些感受吗?

3 个答案:

答案 0 :(得分:19)

大多数资产 会自动包含在资产预编译中。根据{{​​3}}:

  

用于编译文件的默认匹配器包括application.js,application.css和所有不以js或css结尾的文件:[ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]

如果您要包含其他资源,则可以使用config.assets.precompile

  

config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

或者你可以覆盖它。

答案 1 :(得分:8)

我认为这与管道/链接器需要单独文件的能力有关。

例如,我的admin.js文件夹中有app/assets/javascripts个文件。但它所做的只是需要其他几个.js文件。

//= require jquery
//= require jquery_ujs
//= require jquery.colorpicker.js
//= require jquery.wysiwyg.js
//= require wysiwyg.image.js
//= require jquery.fileupload.js
//= require jquery.fileupload-ui.js
//= require codemirror.js
//= require css.js
//= require admin_load

这是因为(a)我正在使用外部js插件和(b)我喜欢将jQuery onload处理程序保存在单独的文件中。

如果 每个 .js文件都已预编译,那么它会预编译这些单独的文件中的每一个 - 这是完全没必要的。我想要/需要的只是预编译的单个admin.js文件。

CSS文件也是如此。

答案 2 :(得分:2)

对我来说预编译的资产很酷,所以你不会最终部署你不想要的资产。也不要忘记有助于压缩你的javascripts的uglifer宝石。成像所有这些都不存在,你只需部署你的应用程序,你发现你有未使用的CSS文件和未压缩的javascripts。你觉得如何。这只是我自己的看法,我说资产管道是铁路中最酷的东西。能够正确管理所有资产。

请注意,如果我是rails,我不想编译你不想要的资产,所以你会在脑海里说出为什么这个人会编译这些资产.. :)