为啥预编译资产不再起作用?

Posted

技术标签:

【中文标题】为啥预编译资产不再起作用?【英文标题】:Why does precompile assets no longer work?为什么预编译资产不再起作用? 【发布时间】:2017-07-16 12:09:15 【问题描述】:

Rails 4.2.1、Ruby 2.2.6、sprockets 3.7.1、sprockets-rails 3.2.0

我正在尝试使用新的 .js 文件部署到我的登台服务器,但预编译什么也没做。这是带有“--trace”的输出。

  ** Invoke assets:precompile (first_time)
  ** Invoke assets:environment (first_time)
  ** Execute assets:environment
  ** Invoke environment (first_time)
  ** Execute environment
  ** Execute assets:precompile
  ** Invoke ckeditor:nondigest (first_time)
  ** Invoke environment 
  ** Execute ckeditor:nondigest

我已经尝试运行 rake assets:clean、assets:clobber 和 assets:precompile,无论是否在这些命令前附加“RAILS_ENV=staging bundle exec” - 什么都没有。我删除了资产文件夹并再次运行预编译 - 没有。我增加了 assets.version - 什么都没有。

我尝试将资产预编译指令放在 /config/initializers/assets.rb、/config/environments/staging.rb 和 /config/application.rb 中

 Rails.application.config.assets.version = '1.0.2'
 Rails.application.config.assets.precompile += %w(
  admin.css
  admin.js
  new_file.js
 )

有没有办法知道 assets:precompile 正在查看哪个文件?

* 更新 *

设置 assets.compile = true 并部署使资产预编译。我的印象是,该指令将使 Rails 动态地为资产服务,而不是使用预编译的资产。这样做是否正确?

 Rails.application.config.assets.compile = true

【问题讨论】:

【参考方案1】:

是的,设置config.assets.compile = true 会降低您的应用程序性能,并导致在生产环境中随机加载较长的页面。尝试运行“bundle exec rake assets:precompile RAILS_ENV=production”,以便它使用您的生产环境配置。文件。至于您在哪里寻找预编译的其他问题,rails 配置中有一个前缀设置。你可以用它来说明你想要预编译的资产去哪里。前任。 config.assets.prefix = '/production' 但默认是你的公共资产文件夹。

更新:(我本来打算写一篇关于这个主题的长文,但看起来它的创建者已经非常详细地写了为什么要避免,并且可以在这个链接中找到:

config.assets.compile=true in Rails production, why not?

【讨论】:

assets.prefix 定义了资产的去向,但是在编译资产时如何确定实际读取的是哪个文件?据我所知,它应该阅读初始化程序/assets.rb 或环境/staging.rb。在设置 assets.compile = true 后,我能够预编译我的所有资产。然后我再次删除了 assets 文件夹,并尝试了您运行预编译以进行生产的建议,但什么也没有。在我找到合适的解决方案之前,我可能会推送两次资产更新。一次用于预编译资产,另一次将 assets.compile 设置回 false。 我想我也有点困惑 assets.compile = true 是坏的。如果您将该值设置为 true 并且它会预编译应用程序中的所有内容,那么它不会为预编译的资产提供服务吗?该指令不是仅在没有预编译资产时才适用吗?在这种情况下,将其设置为 true 不是更好吗?与您的资产未交付给最终用户并引发错误不同,用户只需额外等待几秒钟,页面就会正确加载。我的假设错了吗? 我将更新我的答案,说明您为什么不希望 assets.compile 设置为 true,因为它的解释有点长。您是正确的,Rails 将查看您的 initializer/assets.rb 文件,以便在运行 rake assets:precompile 时预编译哪些资产。检查我的更新以获取对资产实时编译的响应。 好的。很高兴知道。那么为什么我的资产只有在设置为 true 时才编译? 您是否正在运行“bundle exec rake assets:precompile RAILS_ENV=production”?如果您没有指定环境,它将脱离您的开发。设置。

以上是关于为啥预编译资产不再起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.1 资产管道 - 为啥我的图像没有为生产进行预编译?

未使用 Rails 测试环境中的预编译资产

资产预编译错误

预编译 Rails AngularJS 资产

OpsWorks:多次预编译的资产

预编译资产失败的 Rails