ruby-on-rails - 为什么我的 Rails Assets 要预编译两次?

标签 ruby-on-rails asset-pipeline activeadmin

我注意到我的 Assets 似乎被编译了两次,这大大减慢了我的部署,因为这一步是最耗时的部分:

~/projects/rewportal(mapwidget ✔) rake assets:precompile
/home/ruy/.rvm/rubies/ruby-1.9.3-p194/bin/ruby /home/ruy/.rvm/gems/ruby-1.9.3-p194@rewportal/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb
AssetSync: Syncing.
Using: Directory Search of /home/ruy/projects/rewportal/public/assets
Uploading: assets/application-5170f52c1dd49cb382d5135bee01d75e.js
[...]
Fetching files to flag for delete
Flagging 8 file(s) for deletion
Deleting: assets/active_admin-4ce46d089d4b0080e87c9abcb6fa6c97.css
[...]
AssetSync: Done.

这正常吗?

当我预编译到其他环境(非生产)时,我可以看到每个 Assets 的详细编译两次:
~/projects/rewportal(mapwidget ✔) rake RAILS_ENV=qa assets:precompile --trace
** Invoke assets:precompile (first_time)
** Execute assets:precompile
/home/ruy/.rvm/rubies/ruby-1.9.3-p194/bin/ruby /home/ruy/.rvm/gems/ruby-1.9.3-p194@rewportal/bin/rake assets:precompile:all RAILS_ENV=qa RAILS_GROUPS=assets --trace
** Invoke assets:precompile:all (first_time)
** Execute assets:precompile:all
** Invoke assets:precompile:primary (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:primary
Compiled gmaps4rails/gmaps4rails.base.js  (141ms)  (pid 8480)
Compiled gmaps4rails/gmaps4rails.googlemaps.js  (148ms)  (pid 8480)
[...]
Compiled active_admin.css  (1299ms)  (pid 8480)
Compiled active_admin/print.css  (113ms)  (pid 8480)
** Invoke assets:precompile:nondigest (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:nondigest
Compiled gmaps4rails/gmaps4rails.base.js  (133ms)  (pid 8480)
Compiled gmaps4rails/gmaps4rails.googlemaps.js  (133ms)  (pid 8480)
[...]
Compiled active_admin.css  (1290ms)  (pid 8480)
Compiled active_admin/print.css  (116ms)  (pid 8480)
AssetSync: Syncing.
Using: Directory Search of /home/ruy/projects/rewportal/public/assets
Uploading: assets/active_admin-d05b61ab8366b74eabc9074d3e60fe82.css.gz
[...]
Fetching files to flag for delete
Flagging 6 file(s) for deletion
Deleting: assets/active_admin-ec90e7d9a9f45f14d1387f58fa1452b4.css
[...]
AssetSync: Done.

我的 application.rb有以下内容:
config.assets.precompile += %w( active_admin/print.css active_admin.css active_admin.js admin.js admin.css html5shiv.js )

想法?

最佳答案

默认情况下,Rails 3 编译一次以生成指纹 Assets ,一次生成非指纹 Assets (指纹 Assets 在文件名中具有 MD5 哈希值)。

您可以使用 turbo-sprockets-rails3 gem从一个编译创建两者。

在 Rails 4 中,这个功能被提取到 sprockets-rails gem 中。并且行为已更改,因此在 Rails 4 中不会发生双重编译。

关于ruby-on-rails - 为什么我的 Rails Assets 要预编译两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15394345/

相关文章:

ruby-on-rails - 允许 eq 比较中的数组内容是 rspec 测试中的任何内容

ruby-on-rails - 如何从另一个模型预填充 ActiveAdmin 表单值?

activeadmin - 带有Active Storage的active_admin中的多个上传图像

jquery - 如何使用 Jquery 动态选择特定链接?

ruby-on-rails - 我的 ubuntu 系统在启动 Elasticsearch 服务时卡住了

ruby-on-rails - 带有自定义 header 的 S3 临时签名 url,无需将对象元数据修改到磁盘

ruby-on-rails - 运行 rake Assets 时出现字符编码错误 :precompile

ruby-on-rails - 有数百个 Assets 文件时的 Rails Assets 管道工作流程

ruby-on-rails - Rails 不会将缓存破坏时间戳附加到生产中的 Assets

ruby-on-rails - 在用户选择框中使用设计当前用户作为默认用户