Ruby on Rails 4.2 Asset pipeline 不是 minifying/compressing application-fingerprinted.js JS 文件

Ruby on Rails 4.2 Asset pipeline not minifying/compressing the application-fingerprinted.js JS file

我在 Rails 4.2 应用程序上有一个 ruby,并且我面临长达 2 天的关于我的资产管道的 "hair-tearing" 问题。我的产品托管在 Heroku 上,我在这里直接提到这一点,因为我认为这可能是相关的,我有它们 gem 'rails_12factor', group: :production

我阅读并尝试了关于 Rails 资产未编译但 none 的(太多)SO 问题的建议,我将在下面进一步描述。

导致我提出这个 SO 问题的观察问题是我的 我的 javascript application.js 文件在生产中没有缩小

我怎么知道?空格仍然在这里,评论没有被删除,好吧 applciation.js,与我的 application.css 相反,它只是所有 js 文件的串联,但没有 compressing/minifying 已经完成。

关于 SO 的大多数问题都涉及图像 css 或 js 都不是 minified/precompilied 但 我的情况很特殊,图像 css是precompiled/minified,但只有js是个问题,没有缩小

是我的js有问题吗? (见下面的一些实验我试图找出错误的原因)似乎不是

我下面的设置将向您展示我如何处理资产(在我初学者理解的范围内):我使用 guard 持续监控任何更改和预编译内容并将 resulting/generated 应用程序-tr56d7.css(指纹)和 application-45dsugdsy67.js((指纹)在 public/assets 内,然后当我在 git 上部署时,它会推送所有更改,包括 precompiled/minified 文件和然后当我推送到 Heroku 时,我的生产资产设置说 Rails 部署我已经预编译的资产。我是一个初学者并且努力理解所有众多 dev/prod 环境资产设置,但我认为这是您将在下面找到代码中定义的内容。

我知道所有这些过程都是有效的,因为每次我更改文件时,我都能找到一个新的应用程序-tr56d7.css和一个新的应用程序-45dsugdsy67.js(当然是示例)(以及new css.gz and.js.z 必须是二进制文件)

例如,每次我更改 js 文件时,守卫都会完成他的工作,我可以读取类似的内容:

I, [2018-02-09T09:53:41.140165 #130534]  INFO -- : Writing /home/mathieu/rails_projects/my_app/public/assets/application-af0ab4a348e4f5545c844cfac02a0670.js

然后可以在 public/assets 文件夹中找到新生成的 application.css 和 application.js 文件:例如

/public/assets/application-1021e7d2ea120fe40c67ec288f1c6525.js
/public/assets/application-1021e7d2ea120fe40c67ec288f1c6525.js.gz (binary: just a list of numbers...)
/public/assets/application-753e1d0958f76ae233a460ad47606790.css
/public/assets/application-753e1d0958f76ae233a460ad47606790.css.gz (binary: just a list of numbers...)

所以当我观察到在生产中 css 是 application-753e1d0958f76ae233a460ad47606790.css 缩小但不是 application-1021e7d2ea120fe40c67ec288f1c6525.js js 时,我去看看 public/assets 在这里我也注意到了同样的事情:

所以我认为,但我不确定,这不是 Heorku 特定的问题,只是在将它推送到 Heroku 之前,我的 js 文件托管在 public/assets 应该是但没有缩小。

我试图调试这个(破坏 suspenese:all 失败):

config.serve_static_assets = true 试过 false 还为两个文件尝试了很多不同的设置,但 none 有效。

也试过本地:

rake assets:precompile

再次进行了与上面相同的测试,但这里更进一步:我清空(删除了所有内容)我的 assets/javascripts 中的所有 js 文件并删除了表单 application.js 所有 gems 只留下 require 目录,然后创建了 2 个非常简单的 js 文件来检查它现在是否被缩小了.... 结果仍然相同:js 仍然没有在本地缩小,也没有在 heroku

的生产网站上缩小

做 rake assets:clobber 然后推送(git 添加,git 提交,git 推送,git 推送 heroku 粘贴)编译 js但不幸的是,它会产生其他问题:它会向生产环境发送一个旧版本的 js(我知道是因为我在 js 中放了一条警告消息,但它不是最新的!)。它揭示了 rake assets:clobber 调试它的错误是什么?

编辑 我让它工作了,但过程非常苛刻: 利用一些人说如果你不改变 css 或 js 就没有编译(参见 ),我调整了之前的过程:(在 js 文件中改变某事,rake assets:clobber , git add, git commit, git push, git heroku master) 它有效:它 cpmpiles 并发送最新的 js 文件! 有没有什么办法不用记住每个时间在 js 中更改某物以确保编译?

我没主意了。也许我的设置有误,作为初学者,我遗漏了一些明显的东西。

最奇怪的地方是:我的cs被缩小了!为什么不是 js????

我的代码库

/config/environments/development.rb

MyApp::Application.configure do
 # Do not compress assets
  config.assets.compress = false

  # Expands the lines which load the assets
  config.assets.debug = true

  config.serve_static_files = false
end

/config/environments/production.rb

MyApp::Application.configure do

# Disable Rails's static asset server (Apache or nginx will already do this)
  config.serve_static_files = false

  # Compress JavaScripts and CSS
  # config.assets.compress = true removed when switch from Rails 3.2 to Rails 4
  config.assets.js_compressor  = :uglifier
  config.assets.js_compressor = Uglifier.new(
    # Remove all console.* functions
    :compress => { :drop_console => true }
  ) if defined? Uglifier
  config.assets.css_compressor = :sass

  # Don't fallback to assets pipeline if a precompiled asset is missed
  config.assets.compile = false

  # Generate digests for assets URLs
  config.assets.digest = true

  config.force_ssl = true

end

/config/initializers/assets.rb

Rails.application.configure do
  # Precompile additional assets.
  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.

  # related to deployment pb with active admin
  config.assets.precompile += %w[admin/active_admin.css admin/active_admin.js] 

  # for ckeditor: github.com/galetahub/ckeditor
  config.assets.precompile += %w( ckeditor/* )

  # Version of your assets, change this if you want to expire all your assets
  config.assets.version = '1.0'  

end

/config/application.rb

require File.expand_path('../boot', __FILE__)

require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"

if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
end

module MyApp
  class Application < Rails::Application

    config.autoload_paths += %W(#{config.root}/lib)
    # Enable the asset pipeline
    config.assets.enabled = true
  end
end

/Guardfile

# More info at https://github.com/guard/guard#readme
require 'active_support' # edded this due to a bug where guard did not load github.com/rails/rails/issues/14664
require 'active_support/core_ext'

require 'active_support/inflector'

# Make sure this guard is ABOVE any other guards using assets such as jasmine-headless-webkit
# It is recommended to make explicit list of assets in `config/application.rb`
# config.assets.precompile = ['application.js', 'application.css', 'all-ie.css']
# update dec 2014- added :runner => :cli because of a know bug on guard rail assets
# if bug is solved i can remove the part :runner=> cli
guard 'rails-assets', :run_on => [:start, :change], :runner => :cli do
  watch(%r{^app/assets/.+$})
  watch('config/application.rb')  
end

assets/javascripts/application.js

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require jquery.cookie
//= require cloudinary-jquery.min
//= require twitter/bootstrap
//= require paloma
//= require html5shiv-printshiv
//= require storageService
//= require turbolinks
//= require_directory .

部署后的终端进程,例如检查一些 js 文件,等待守卫通知我它已完成其预编译工作:

git add --all
git commit -a -m "fix issue with asset pipeline"
git push
git push heroku master

如果我理解正确,您可以在本地复制此问题,因此 Heroku 因素无关紧要。

但是,听起来您正在本地编译资产,将它们提交到存储库,然后推送到 Heroku。首先,我会避免这种情况并依靠让 Heroku 在部署期间进行静态资产编译。

无论如何,如果我正确理解这就是您正在做的事情,我认为这可能是因为当您 运行 rake assets:precompile 时,您可能正在开发模式下编译它们,这将使用您的config/development.rb配置,其中有config.assets.compress = false。我不确定为什么你的一些文件被压缩而另一些没有,除了它可能只是与 how recently you've modified the source files.

有关

无论如何,尝试运行宁:

$ rake assets:clean
$ rake assets:precompile RAILS_ENV=production

我怀疑您在本地以生产模式启动应用程序时会遇到问题(例如,如果您没有正确配置数据库凭据或其他),这是我 不会 [=32] 的另一个原因=] 在部署之前在本地预编译资产。但是,如果活动环境是您问题的一个因素,这可能会证明或反驳。

事实上,您可以在 Heroku dyno 上尝试 运行ning 这个,它已经为生产设置好了:

(local)$ heroku run bash
(heroku)$ rake assets:clean assets:precompile RAILS_ENV=production
(heroku)$ less public/assets/application-*.js # see if this is compressed

让我知道你在这里发现了什么,如果这不会改变你的等式,我可以修改我的答案

我知道我要说的不符合常规,但你的方法并没有那么明确,你应该尝试添加你在开发中错误的显式压缩调用

/config/environments/production.rb

MyApp::Application.configure do
  # Compress assets please
  config.assets.compress = true
  # ... other stuff
end

之后清理您的资产并使用

重新生成它们
$ bundle exec rake assets:clobber
$ RAILS_ENV=production bundle exec rake assets:precompile