我在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
再次进行了与上述相同的测试,但这里更进一步:我清空(删除了所有内容)我的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
答案 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
让我知道你在这里发现了什么,如果不能改变你的等式,我可以修改我的答案