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 在这里我也注意到了同样的事情:
/public/assets/application-753e1d0958f76ae233a460ad47606790.csscss等guard生成的css文件被压缩
但是gyard生成的js文件没有压缩
所以我认为,但我不确定,这不是 Heorku 特定的问题,只是在将它推送到 Heroku 之前,我的 js 文件托管在 public/assets 应该是但没有缩小。
我试图调试这个(破坏 suspenese:all 失败):
试图在 assets.rb 中明确说明编译 application.js 不起作用 => 结果:js 仍然没有在本地缩小,而不是在 heroku 的生产网站上
#建议在config/application.rb
中明确列出资产
config.assets.precompile = ['application.js']
尝试用 rake :assets clobber 清理所有旧东西 => 结果:js 仍然没有在本地缩小,也没有在 heroku 的生产网站上
尝试通过更改版本来清理旧内容
assets.rb:已更改 => 结果:js 仍未在本地缩小,也未在 heroku 上的生产网站上缩小
config.assets.version = '1.0'
进入
config.assets.version = '1.1'
尝试更改所有各种开发和生产资产设置 => 结果:js 仍然没有在本地缩小,也没有在 heroku 上的生产网站上缩小
config.serve_static_assets = true 试过 false
还为两个文件尝试了很多不同的设置,但 none 有效。
尝试在本地和 prod 中编译 => 结果:js 仍然没有在本地缩小,也没有在 heroku 的生产网站上缩小
rake assets:precompile RAILS_ENV=production --trace
也试过本地:
rake assets:precompile
- 2 次最奇怪的尝试:
在我尝试通过修改所有失败的资产管道设置来完成这项工作之后,我认为 可能 's a tricky javascript error somewhere breaking silently the minification/compressing made by guard (which also be silent in terms of page load as no error appear on chrome dev tools when i load my pages but who knows...read on some SO questions some strange effect of comments on the asset pipeline)',所以
我决定在 assets/javascripts/ 内评论我所有的 js 文件!一无所有:甚至删除了最终在管道中但由 gem 注入的 js(因此在我的文件夹 app/assets/javascripts 中不可见),例如 jquery gem : 并创建 2 个非常基本的 js 文件
那将是唯一剩下的文件......
还好:=> 结果:js 仍然没有在本地缩小,也没有在 heroku 的生产网站上缩小
再次进行了与上面相同的测试,但这里更进一步:我清空(删除了所有内容)我的 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
我在 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 在这里我也注意到了同样的事情:
/public/assets/application-753e1d0958f76ae233a460ad47606790.csscss等guard生成的css文件被压缩
但是gyard生成的js文件没有压缩
所以我认为,但我不确定,这不是 Heorku 特定的问题,只是在将它推送到 Heroku 之前,我的 js 文件托管在 public/assets 应该是但没有缩小。
我试图调试这个(破坏 suspenese:all 失败):
试图在 assets.rb 中明确说明编译 application.js 不起作用 => 结果:js 仍然没有在本地缩小,而不是在 heroku 的生产网站上
#建议在
config/application.rb
中明确列出资产 config.assets.precompile = ['application.js']尝试用 rake :assets clobber 清理所有旧东西 => 结果:js 仍然没有在本地缩小,也没有在 heroku 的生产网站上
尝试通过更改版本来清理旧内容 assets.rb:已更改 => 结果:js 仍未在本地缩小,也未在 heroku 上的生产网站上缩小
config.assets.version = '1.0'
进入
config.assets.version = '1.1'
尝试更改所有各种开发和生产资产设置 => 结果:js 仍然没有在本地缩小,也没有在 heroku 上的生产网站上缩小
config.serve_static_assets = true 试过 false 还为两个文件尝试了很多不同的设置,但 none 有效。
尝试在本地和 prod 中编译 => 结果:js 仍然没有在本地缩小,也没有在 heroku 的生产网站上缩小
rake assets:precompile RAILS_ENV=production --trace
也试过本地:
rake assets:precompile
- 2 次最奇怪的尝试: 在我尝试通过修改所有失败的资产管道设置来完成这项工作之后,我认为 可能 's a tricky javascript error somewhere breaking silently the minification/compressing made by guard (which also be silent in terms of page load as no error appear on chrome dev tools when i load my pages but who knows...read on some SO questions some strange effect of comments on the asset pipeline)',所以 我决定在 assets/javascripts/ 内评论我所有的 js 文件!一无所有:甚至删除了最终在管道中但由 gem 注入的 js(因此在我的文件夹 app/assets/javascripts 中不可见),例如 jquery gem : 并创建 2 个非常基本的 js 文件 那将是唯一剩下的文件...... 还好:=> 结果:js 仍然没有在本地缩小,也没有在 heroku 的生产网站上缩小
再次进行了与上面相同的测试,但这里更进一步:我清空(删除了所有内容)我的 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