在Rails生产环境中禁用资产压缩

43
为了在我的Heroku生产环境中调试JavaScript,我需要禁用资产压缩(或至少JavaScript压缩)。我尝试了config.assets.compress = false以及config.assets.debug = true,但仍然使用压缩的资产。然后我删除了已压缩的资产,此时根本没有呈现任何资产。我添加了config.assets.enabled = false,但无效。我尝试将未压缩的资产复制到各种目录中,包括应用程序根目录、public和public/assets(后两者均使用文件夹"images"、"javascripts"和"stylesheets",并直接将资产放入文件夹中而不是这三个子文件夹中)。最终我通过更改HTML直接引用所有JavaScript文件来使JavaScript工作。但CSS和图像仍然无法工作。
我原本认为我的config.assets.compress = false应该可以起作用。有什么想法我做错了什么?

你肯定修改了 config/environments/production.rb 文件? - Andrew France
1
你是否使用Rails标签助手来访问资产(javascript_include_tag 'script.js')?你能否专注于一个单一的文件,并给我们一个实现的例子以及发生了什么? - mltsy
9个回答

56

在阅读文档后,我想出了这个解决方法:

创建一个不压缩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

非常聪明!我从来没有想过那个。谢谢! - Jack R-G
在部署到暂存服务器时使用的好东西。每次在Heroku上部署时,可以为我节省100秒钟,总共260秒。 - hakunin
这样做还会将哈希添加到资产文件名中吗?我需要在服务器上调试一些代码,但为了找到错误,我需要使用正确的哈希资产名称。 - Ziggy
1
@Ziggy 抱歉回复晚了,但只要在你的 environment.rb 文件中设置 config.assets.digest = true,Sprockets 仍会附加从未压缩文件的 MD5 哈希创建的摘要。 - ncherro
1
删除 config.assets.js_compressor = :uglifier 就足以解决它。 - Dorian
能否将其修改为仅影响特定文件? - Daniel Lawton

29

在Rails 4中,只需要将该行代码注释掉即可。

# config.assets.js_compressor = :uglifier

config/environments/production.rb 中的设置对我有效。看起来默认情况下不进行压缩。


13

我也需要调试我的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

1
你可以使用 require 语句将 no_compression.rb 包含在 production.rb 文件中。require 'modules/no_compression.rb' - M. Habib
这是一个完全的黑客技巧,但它完美地符合了我的目的! - Master of Ducks

8

注释掉uglify,然后添加config.assets.debug = true。这对我有效。

  • 压缩JavaScript和CSS:

    config.assets.js_compressor = :uglifier

  • 调试模式禁用了合并和处理资产。但是此选项可能会导致渲染具有大量复杂资产的视图时出现显着延迟:

    config.assets.debug = true


7
值得注意的是,在使用 ncherro 解决方案的同时,您还需要执行以下操作:
  1. 确保将新模块放在默认加载位置。在我的情况下是 lib/extras。
  2. 运行 rake assets:clean 清理现有资产。
  3. 运行 rake assets:precompile 使用新压缩器编译您的资产。
  4. 重新启动您的应用程序…我使用touch tmp/restart.txt
祝您愉快地调试 :)

2
在Heroku上使用Rails 4,你需要做两件事情。首先,正如@geekQ所提到的,在config/environments/production.rb中注释掉js_compressor一行代码。
# config.assets.js_compressor = :uglifier

其次,您需要考虑{{link1:Rails 4 的 Heroku 资产管道缓存}}。任何与缓存版本具有相同 MD5 的文件都不会重新编译。之前(可能已压缩)的版本将被提供。您编辑的任何文件都将具有新的 MD5 并重新编译。
您还可以使用{{link2:Heroku Repo 插件}}清除整个资产缓存到 Heroku 工具包。安装它,然后使用以下命令。
heroku repo:purge_cache

在清除缓存后部署新版本,所有资产将被重新编译。

删除 config.assets.js_compressor = :uglifier 就足以解决它。 - Dorian

1

请在environments/production.rb中查找并注释掉以下行:

config.assets.js_compressor = ...
config.assets.css_compressor = ...

1
我需要在config/initializers/assets.rb中更新Rails.application.config.assets.version,才能使production.rb的更改生效。

0

看起来这可能是Rails中的一个bug。从即将发布的rails 3.2.9的更改日志中,您是否遇到了以下情况?

针对asset_path尊重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存在同样的问题,他们只是还没有发现。无论如何,感谢您提供这个信息。 - Jack R-G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接