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

Posted

技术标签:

【中文标题】Rails 3.1 资产管道 - 为啥我的图像没有为生产进行预编译?【英文标题】:Rails 3.1 Asset pipeline - Why my images do not precompile for production?Rails 3.1 资产管道 - 为什么我的图像没有为生产进行预编译? 【发布时间】:2011-11-08 15:30:26 【问题描述】:

运行时:

rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets

一切都预编译,但不是我的/app/assets/images/*

我什至尝试将此添加到我的environment/production.rb

config.assets.paths << "#Rails.root/app/assets/images"

怎么了?谢谢!

【问题讨论】:

找到了解决方案:添加到environment/production.rb config.assets.precompile += %w[*.png *.jp?g *.gif] 为什么不是这个默认值;就像这一行所说:(application.js, application.css, and all non-JS/CSS are already added) *.jp?g 不起作用 - ?完全匹配 1 个字符,因为它是全局匹配而不是正则表达式。你想要的是config.assets.precompile += %w[*.png *.jpg *.jpeg *.gif] 是的,我知道了,谢谢 对于它的价值,我认为我遇到了类似的问题,但是在学习了有关资产管道如何工作的更多细节之后,我发现我只是在参数中有语法错误传递给我的 image_tag 助手!至少在 Rails 3.2.8 中,不需要更改环境文件中的任何默认值。 【参考方案1】:

找到解决方案:Add to environment/production.rb

config.assets.precompile += %w[*.png *.jpg *.jpeg *.gif] 

为什么不是这个默认值?就像这行说的:(application.js、application.css 和所有非 JS/CSS 都已添加)

【讨论】:

*.jp?g 不起作用 - ?恰好匹配 1 个字符,因为它是全局匹配而不是正则表达式。你想要的是config.assets.precompile += %w[*.png *.jpg *.jpeg *.gif] 发现这是 Rails 4 中的一个问题。当我们将资产目录移动到 /assets 而不是 /app/assets 时 为什么我们应该“预编译”图像?我认为这样做没有任何意义 对于其他来到这里的人,在 Rails 5 中,Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) 在您的config/initializers/assets 文件夹中 @divideByZero 例如要添加 md5 指纹,假设您有一些 logo.png 或 default.png 图像,当您更改它们时,它们的 md5 哈希值也会更改,并且生成的图像 URL 的更改将强制浏览器获取新副本(更改后)【参考方案2】:

对服务器使用这种格式:

rails assets:precompile:all -e production

【讨论】:

你的意思是rake assets:precompile:all 试试`rails assets:precompile -e production' 不需要用assets:precompile指定环境,默认是生产环境 快速说明:rake assets:precompile:all 不会生成我的资产的散列(指纹)版本。出于这个原因,我回到只使用 rake assets:precompile【参考方案3】:

在我的情况下,一些 不兼容的 gem 正在使用类似的东西:

config.assets.precompile << %r(bootstrap-sass/assets/fonts/bootstrap/[\w-]+\.(?:eot|svg|ttf|woff2?)$)

删除 gem 或更新它可以解决问题。 这是因为 gem 是为旧版 Rails 制作的

这并不能直接从控制台输出中清除。

在我的情况下,由于当时无法更新 gem,解决方案是删除有问题的资产路径,通过添加 application.rb 由于兼容性:

config.after_initialize do
    bootstrap_index = config.assets.precompile.index(/bootstrap\/glyphicons-halflings-regular\.(?:eot|svg|ttf|woff2?)$/)
    config.assets.precompile.delete_at(bootstrap_index)
end

并添加应预编译的缺失文件:

config.assets.precompile += %w( .svg .eot .woff .ttf .woff2)

【讨论】:

以上是关于Rails 3.1 资产管道 - 为啥我的图像没有为生产进行预编译?的主要内容,如果未能解决你的问题,请参考以下文章

rails 3.1资产管道路由错误

为啥 Rails 找不到我的资产?

Rails 3.1 资产管道供应商/资产文件夹组织

使用 Rails 3.1 资产管道有条件地使用某些 css

用于 JavaScript 的 Rails 3.1 资产管道

Rails 3.1 资产管道和手动订购的 Javascript 需要