在 Rails 生产中禁用资产缩小
Posted
技术标签:
【中文标题】在 Rails 生产中禁用资产缩小【英文标题】:Disable Asset Minification in Rails Production 【发布时间】:2012-03-29 07:17:29 【问题描述】:为了在我的 heroku 生产环境中调试 javascript,我需要禁用资产压缩(或至少 javascript 的压缩)。我尝试了config.assets.compress = false
和config.assets.debug = true
,仍然使用压缩资产。然后我删除了压缩资产,此时根本没有渲染任何资产。我添加了config.assets.enabled = false
,但没有帮助。我尝试将未压缩的资产复制到各种目录中,包括应用程序根目录、公共和公共/资产(后两者同时使用文件夹“images”、“javascripts”和“stylesheets”,并将资产直接放入文件夹中三个子文件夹)。我最终能够通过更改 html 以直接引用所有 javascript 文件来使 javascripts 工作。但 CSS 和图像仍然无法正常工作。
我原以为我原来的config.assets.compress = false
应该可以工作。任何想法我做错了什么?
【问题讨论】:
你确定是在修改config/environments/production.rb
?
您是否使用 Rails 标签助手来访问资产(javascript_include_tag 'script.js')?您能否专注于单个文件,并举例说明它是如何实现的以及发生了什么?
【参考方案1】:
我在阅读the docs 后想出了这个解决方法:
在此处创建一个不压缩 js/css 的模块:lib/modules/no_compression.rb
class NoCompression
def compress(string)
# do nothing
string
end
end
将您的资产配置为(不)使用您的无操作压缩器进行压缩
config.assets.compress = true
config.assets.js_compressor = NoCompression.new
config.assets.css_compressor = NoCompression.new
【讨论】:
非常聪明!我永远不会想到这一点。谢谢! 部署到登台服务器时非常有用。每次在 heroku 上部署时,总共节省了 260 秒,为我节省了 100 秒。 这还会将哈希添加到资产文件名吗?我必须在服务器上调试一些代码,但为了找到错误,我需要使用正确散列的资产名称。 @Ziggy 很抱歉回复晚了,但 Sprockets 仍会附加从未压缩文件的 MD5 哈希创建的摘要(只要在您的 environment.rb 文件中添加config.assets.digest = true
)
删除 config.assets.js_compressor = :uglifier
就可以修复它【参考方案2】:
在 Rails 4 下只是注释掉这一行
# config.assets.js_compressor = :uglifier
config/environments/production.rb
为我工作。看起来默认是没有压缩。
【讨论】:
【参考方案3】:我还需要调试我的 js,所以我尝试了 ncherro 的解决方案。问题是它仍然会抛出
rake 中止! 未初始化的常量 NoCompression
所以我只是将 NoCompression 类放在 production.rb 文件中
# Compress JavaScripts and CSS
class NoCompression
def compress(string)
# do nothing
string
end
end
config.assets.compress = true
config.assets.js_compressor = NoCompression.new
config.assets.css_compressor = NoCompression.new
【讨论】:
您可以使用 require 语句require 'modules/no_compression.rb'
在 production.rb 文件中包含 no_compression.rb
【参考方案4】:
注释掉 uglifier 并添加 config.assets.debug = true
。这对我有用。
压缩 JavaScript 和 CSS:
config.assets.js_compressor = :uglifier
调试模式禁用资产的串联和预处理。但此选项可能会导致大量复杂资产的视图渲染出现明显延迟:
config.assets.debug = true
【讨论】:
【参考方案5】:另外值得注意...除了 ncherro 解决方案之外,您还需要执行以下操作:
-
确保将新模块放在默认加载的位置。在我的情况下是 lib/extras。
运行
rake assets:clean
清理现有资产。
运行 rake assets:precompile
以使用新的压缩器编译您的资产。
重新启动您的应用程序...我使用touch tmp/restart.txt
调试愉快 ;)
【讨论】:
【参考方案6】:使用 Heroku 上的 Rails 4,您需要做两件事。首先正如@geekQ 提到的,注释掉config/environments/production.rb
中的js_compressor 行
# config.assets.js_compressor = :uglifier
其次,你需要考虑Heroku's asset pipeline cache for Rails 4.任何与缓存中版本相同MD5的文件都不会被重新编译。将提供以前的(可能是压缩的)版本。您编辑的任何文件都会有一个新的 MD5 并被重新编译。
您还可以使用 Heroku Repo plugin 将整个资产缓存清除到 Heroku 工具带。安装它,然后使用命令
heroku repo:purge_cache
清除缓存后部署新版本,您的所有资产都将重新编译。
【讨论】:
删除config.assets.js_compressor = :uglifier
就可以修复它【参考方案7】:
我必须更新 config/initializers/assets.rb
中的 Rails.application.config.assets.version
才能使 production.rb
更改生效。
【讨论】:
【参考方案8】:在environments/production.rb
中找到并注释掉这些行:
config.assets.js_compressor = ...
config.assets.css_compressor = ...
【讨论】:
【参考方案9】:看起来这可能是 Rails 中的一个错误。从即将发布的 rails 3.2.9 的更新日志中,您遇到了这样的问题吗?
尊重资产路径的 config.digest = false
以前,asset_path 内部仅尊重 :digest 选项,但忽略了全局配置设置。这意味着 config.digest = false 不能与 config.compile = false 一起使用,这可以纠正这种行为。
http://weblog.rubyonrails.org/2012/10/29/ann-rails-3-2-9-rc1-has-been-released/
你认为这可能相关吗?
【讨论】:
我认为这两者没有关系,因为我认为更改与是否在资产名称中添加摘要有关,而我的问题更多与 javascript 有关压缩。我想 config.asset.compression 可能存在同样的问题,他们只是还没有找到它。无论如何,感谢您对此的提醒。以上是关于在 Rails 生产中禁用资产缩小的主要内容,如果未能解决你的问题,请参考以下文章
rails - 在生产模式下找不到 application.css 资产