Ruby on Rails 4.2资产管道没有缩小/压缩application-fingerprinted.js JS文件

时间:2018-02-09 09:41:38

标签: ruby-on-rails ruby-on-rails-4 heroku asset-pipeline

我在Rails 4.2应用程序上有一个红宝石,正面临一个"头发撕裂"关于我的资产管道长达2天的问题。我的产品是在Heroku上托管的,我在这里直接提到它,因为我认为它可能与我有相关的宝石' rails_12factor',group :: production

我阅读并尝试了(太多)有关Rails资产未编译但无效的问题的建议,因为我将进一步描述。

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

我怎么知道?白色空间仍然在这里,评论没有删除,applciation.js,与我的application.css相反,只是所有js文件的连接,但没有压缩/缩小。

关于SO的大多数问题处理的问题是图像,css或js都没有被缩小/预编译,但是我的情况特别是图像,css被预编译/缩小的程度,但只有js是一个问题而不是缩小的

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

我在下面的设置将向您展示我如何处理资产(在初学者的理解范围内):我使用guard来不断监视任何更改和预编译的东西并将生成/生成的应用程序-tr56d7.css(指纹识别)和应用程序-45dsugdsy67.js((指纹)在公共/资产内部,然后当我在git上部署时,它会推送所有更改,包括预编译/缩小文件,然后当我推送到Heroku时,我的生产资产设置会告诉Rails部署我已经预先编译好的资产。我是初学者,并且很难理解所有众多开发/产品环境资产设置,但我认为这是您将进一步查找的代码中定义的内容。

我知道所有这个过程它都在工作,因为每当我找到一个新的应用程序时更改文件-tr56d7.css和一个新的应用程序-45dsugdsy67.js(当然是示例)(以及一个新的css) .gz和.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是应用程序-753e1d0958f76ae233a460ad47606790.css缩小但不是应用程序-1021e7d2ea120fe40c67ec288f1c6525.js js,我去了看看 公共/资产,在这里我也注意到了同样的事情:

  • 由/public/assets/application-753e1d0958f76ae233a460ad47606790.css css等后卫生成的css文件缩小

  • 但是gyard生成的js文件没有缩小

所以我认为,但我不确定,它不是Heorku特定的问题,它只是在将其推送到Heroku之前,我的在公共/资产上托管的js文件应该是但不会缩小。

我尝试调试此内容(破坏暂停:全部失败):

  • 试图在assets.rb中明确说明编译application.js not work =>结果:js仍未在本地缩小,而不是在heroku的生产网站上

    #建议在config/application.rb中明确列出资产   config.assets.precompile = [' application.js']

  • 尝试用rake清理所有旧东西:assets clobber =>结果:js仍未在本地缩小,而不是在heroku的生产网站上

  • 尝试通过更改版本来清理旧东西 assets.rb:changed =>结果:js仍未在本地缩小,而不是在heroku的生产网站上

     config.assets.version = '1.0'
    

     config.assets.version = '1.1'
    
  • 尝试更改所有各种dev和prod资产设置=>结果:js仍未在本地缩小,而不是在heroku的生产网站上

config.serve_static_assets = true并尝试false 尝试了两个文件的这么多不同的设置但没有工作。

  • 尝试在本地和prod =>中编译结果:js仍未在本地缩小,而不是在heroku的生产网站上

    rake assets:预编译RAILS_ENV = production --trace

也尝试了当地:

rake assets:precompile
  • 2最奇怪的尝试: 在我通过修改所有失败的资产管道设置来完成这项工作的所有尝试之后,我认为可能在某处发生了一个棘手的javascript错误默默地打破了警卫所做的缩小/压缩(这也是在页面加载方面保持沉默,因为当我加载我的页面时,chrome dev工具上没有出现错误但是谁知道...阅读一些SO问题评论对资产管道的一些奇怪的影响)',所以 我决定在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资产:clobber然后推(git add,git commit,git push,git push heroku paster)编译js但不幸的是它会产生其他问题:它向生产发送一个旧版本的js(I知道因为我在js里面放了一条警告信息而且它不是最新的!)。它揭示了耙资产的错误:clobber调试它吗?

EDIT 我使它工作但是有一个非常苛刻的过程: 如果你不改变css或js(参见https://stackoverflow.com/a/7988689/1467802),有些人说没有编译,我调整了前面的过程:(改变js文件,rake assets:clobber,git add, git commit,git push,git heroku master)它的工作原理:它cpmpiles并发送最新的js文件! 难道没有办法不记得eveyr时间改变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

资产/ Javascript角/ 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

2 个答案:

答案 0 :(得分:3)

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

<强> /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

答案 1 :(得分:1)

如果我理解正确,你可以在本地复制这个问题,所以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

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

事实上,您可以尝试在Heroku dyno上运行它,而不是已经为生产设置:

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

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