问题描述
问题:
如何解决这个问题?
当前情况:
我创建了一个自定义布局,以包含我的 供应商资产 .下面是代码
I have created a custom layout to include my vendor assets. Below is the code
#app/views/layouts/gentellela_theme.html.erb
<!DOCTYPE html>
<html>
<head>
<title>HMS</title>
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "css/custom", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "fullcalendar.print.min", :media => "print", 'data-turbolinks-track' => true %>
<%= stylesheet_link_tag "dataTables.bootstrap4.min", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag "gentellela_theme", "data-turbolinks-track" => true %>
<%= csrf_meta_tags %>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body class="nav-md">
<%= render "layouts/sidenav" %>
<%= render "layouts/topnav" %>
<%= yield %>
<%= render "layouts/footer" %>
<%= javascript_include_tag 'js/custom', 'data-turbolinks-track' => true %>
</body>
</html>
问题:
我在vendor/assets/components/gentelella/production/js/custom.js
和vendor/assets/components/gentelella/production/css/custom.css
下有两个文件.这些文件已在localhost中加载并运行良好,但未在Heroku中加载
I have two files under vendor/assets/components/gentelella/production/js/custom.js
and vendor/assets/components/gentelella/production/css/custom.css
. These files are loaded and working well in localhost, but they are not loading in Heroku
我只能在浏览器控制台中看到以下警告,但仅此而已. 也没有404错误 .
I can only see a warning like below in the browser console, but nothing more. No 404 errors either.
我的config/application.rb
看起来像这样
require_relative 'boot'
require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module HMS
class Application < Rails::Application
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
config.assets.paths << Rails.root.join('vendor', 'assets', 'components', 'gentelella', 'production')
end
end
我的config/initializers/assets.rb
看起来像这样
# Be sure to restart your server when you modify this file.
# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'
# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
# Rails.application.config.assets.precompile += %w( search.js )
Rails.application.config.assets.precompile += %w( fullcalendar.print.min.css )
Rails.application.config.assets.precompile += %w( dataTables.bootstrap4.min.css)
Rails.application.config.assets.precompile += %w( gentellela_theme.js )
Rails.application.config.assets.precompile << Proc.new { |path, fn| fn =~ /vendor\/assets\/components\/gentelella\/production/ }
因此,我已参考相关问题并试图解决该问题,但无济于事.以下是我失败的尝试
So I've referred to the related questions and tried to solve the issue, but to no avail. Below are my failed attempts
尝试#1
使用
RAILS_ENV=production bundle exec rake assets:precompile
并将更改推送到heroku,但问题仍然存在.
and pushed the changes to heroku, but the problem persists.
尝试#2
在config/application.rb
config.assets.enabled = true
config.serve_static_assets = true
并将更改推送到heroku,但问题仍然存在.
and pushed the changes to heroku, but the problem persists.
尝试#3
在config/environments/production.rb
中将config.assets.compile = false
修改为config.assets.compile = true
,但是在推送到heroku时,推送失败并显示以下错误
Modified config.assets.compile = false
to config.assets.compile = true
in config/environments/production.rb
, but when pushing to heroku, the push failed with the below error
remote: ! A security vulnerability has been detected in your application.
remote: ! To protect your application you must take action. Your application
remote: ! is currently exposing its credentials via an easy to exploit directory
remote: ! traversal.
remote: !
remote: ! To protect your application you must either upgrade to Sprockets version "3.7.2"
remote: ! or disable dynamic compilation at runtime by setting:
remote: !
remote: ! ```
remote: ! config.assets.compile = false # Disables security vulnerability
remote: ! ```
remote: !
remote: ! To read more about this security vulnerability please refer to this blog post:
remote: ! https://blog.heroku.com/rails-asset-pipeline-vulnerability
remote: !
remote: ! Push rejected, failed to compile Ruby app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to boiling-dusk-64956.
因此,我按照建议升级了链轮版本,并将更改推送到heroku.这次推送成功完成,没有任何错误.接下来,我运行heroku run rake assets:precomplie
并重新启动服务器.但是现在应用程序崩溃了.以下是heroku logs --tail
信息
So, I upgraded the sprockets version as suggested and pushed the changes to heroku. This time the push has succeeded without any errors. Next I've run heroku run rake assets:precomplie
and restarted the server. But now the application has crashed. Below is the heroku logs --tail
info
2018-09-20T08:27:33.161369+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path="/departments" host=boiling-dusk-64956.herokuapp.com request_id=fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb fwd="27.7.94.242" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https
2018-09-20T08:28:34.114593+00:00 heroku[web.1]: Process running mem=577M(112.7%)
2018-09-20T08:28:34.114685+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2018-09-20T08:29:16.452991+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2018-09-20T08:29:16.452911+00:00 heroku[web.1]: Process running mem=611M(119.5%)
2018-09-20T08:30:16.740081+00:00 heroku[web.1]: Restarting
2018-09-20T08:30:16.743963+00:00 heroku[web.1]: State changed from up to starting
2018-09-20T08:30:17.601536+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2018-09-20T08:30:17.631815+00:00 app[web.1]: [2018-09-20 08:30:17] FATAL SignalException: SIGTERM
2018-09-20T08:30:17.631835+00:00 app[web.1]: /app/vendor/ruby-2.3.7/lib/ruby/2.3.0/webrick/server.rb:177:in `select'
2018-09-20T08:30:17.631838+00:00 app[web.1]: /app/vendor/ruby-2.3.7/lib/ruby/2.3.0/webrick/server.rb:177:in `block in start'
2018-09-20T08:30:17.631840+00:00 app[web.1]: /app/vendor/ruby-2.3.7/lib/ruby/2.3.0/webrick/server.rb:33:in `start'
2018-09-20T08:30:17.631843+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-2.0.5/lib/rack/handler/webrick.rb:34:in `run'
2018-09-20T08:30:17.631841+00:00 app[web.1]: /app/vendor/ruby-2.3.7/lib/ruby/2.3.0/webrick/server.rb:164:in `start'
2018-09-20T08:30:17.631847+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/railties-5.0.0/lib/rails/commands/server.rb:79:in `start'
2018-09-20T08:30:17.631845+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-2.0.5/lib/rack/server.rb:297:in `start'
2018-09-20T08:30:17.631851+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:85:in `tap'
2018-09-20T08:30:17.631849+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:90:in `block in server'
2018-09-20T08:30:17.631853+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:85:in `server'
2018-09-20T08:30:17.631856+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/railties-5.0.0/lib/rails/commands.rb:18:in `<top (required)>'
2018-09-20T08:30:17.631859+00:00 app[web.1]: bin/rails:4:in `require'
2018-09-20T08:30:17.631854+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
2018-09-20T08:30:17.697233+00:00 app[web.1]: [2018-09-20 08:30:17] INFO WEBrick::HTTPServer#start done.
2018-09-20T08:30:17.631860+00:00 app[web.1]: bin/rails:4:in `<main>'
2018-09-20T08:30:17.632626+00:00 app[web.1]: [2018-09-20 08:30:17] INFO going to shutdown ...
2018-09-20T08:30:19.862800+00:00 app[web.1]: I, [2018-09-20T08:30:17.637116 #4] INFO -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] Completed 500 Internal Server Error in 194442ms (ActiveRecord: 2.6ms)
2018-09-20T08:30:19.862814+00:00 app[web.1]: F, [2018-09-20T08:30:17.643023 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb]
2018-09-20T08:30:19.862817+00:00 app[web.1]: F, [2018-09-20T08:30:17.643123 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] ActionView::Template::Error ():
2018-09-20T08:30:19.862820+00:00 app[web.1]: F, [2018-09-20T08:30:17.647307 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 3: <head>
2018-09-20T08:30:19.862822+00:00 app[web.1]: F, [2018-09-20T08:30:17.647399 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 4: <title>HMS</title>
2018-09-20T08:30:19.862824+00:00 app[web.1]: F, [2018-09-20T08:30:17.647458 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 5: <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862826+00:00 app[web.1]: F, [2018-09-20T08:30:17.647517 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 6: <%= stylesheet_link_tag "css/custom", media: "all", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862829+00:00 app[web.1]: F, [2018-09-20T08:30:17.647561 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 7: <%= stylesheet_link_tag "fullcalendar.print.min", :media => "print", 'data-turbolinks-track' => true %>
2018-09-20T08:30:19.862831+00:00 app[web.1]: F, [2018-09-20T08:30:17.647604 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 8: <%= stylesheet_link_tag "dataTables.bootstrap4.min", media: "all", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862833+00:00 app[web.1]: F, [2018-09-20T08:30:17.647647 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] 9: <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862835+00:00 app[web.1]: F, [2018-09-20T08:30:17.647690 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb]
2018-09-20T08:30:19.862838+00:00 app[web.1]: F, [2018-09-20T08:30:17.647732 #4] FATAL -- : [fe446dfc-ea7c-4d38-8b6b-ec529e8db9eb] app/views/layouts/gentellela_theme.html.erb:6:in `_app_views_layouts_gentellela_theme_html_erb___843058433631945669_70285598017940'
2018-09-20T08:30:19.862840+00:00 app[web.1]: I, [2018-09-20T08:30:17.657292 #4] INFO -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] Completed 500 Internal Server Error in 271041ms (ActiveRecord: 38.3ms)
2018-09-20T08:30:19.862841+00:00 app[web.1]: F, [2018-09-20T08:30:17.676144 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf]
2018-09-20T08:30:19.862843+00:00 app[web.1]: F, [2018-09-20T08:30:17.676296 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] ActionView::Template::Error ():
2018-09-20T08:30:19.862845+00:00 app[web.1]: F, [2018-09-20T08:30:17.679494 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 3: <head>
2018-09-20T08:30:19.862847+00:00 app[web.1]: F, [2018-09-20T08:30:17.679561 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 4: <title>HMS</title>
2018-09-20T08:30:19.862848+00:00 app[web.1]: F, [2018-09-20T08:30:17.679834 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 5: <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862850+00:00 app[web.1]: F, [2018-09-20T08:30:17.679898 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 6: <%= stylesheet_link_tag "css/custom", media: "all", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862852+00:00 app[web.1]: F, [2018-09-20T08:30:17.680159 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 7: <%= stylesheet_link_tag "fullcalendar.print.min", :media => "print", 'data-turbolinks-track' => true %>
2018-09-20T08:30:19.862853+00:00 app[web.1]: F, [2018-09-20T08:30:17.680220 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 8: <%= stylesheet_link_tag "dataTables.bootstrap4.min", media: "all", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862855+00:00 app[web.1]: F, [2018-09-20T08:30:17.680277 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] 9: <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
2018-09-20T08:30:19.862857+00:00 app[web.1]: F, [2018-09-20T08:30:17.683960 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf]
2018-09-20T08:30:19.862859+00:00 app[web.1]: F, [2018-09-20T08:30:17.684030 #4] FATAL -- : [ab0d5f1c-d91e-4741-825e-97e1ce5443cf] app/views/layouts/gentellela_theme.html.erb:6:in `_app_views_layouts_gentellela_theme_html_erb___843058433631945669_70285598017940'
2018-09-20T08:30:19.862861+00:00 app[web.1]: Exiting
2018-09-20T08:30:20.300416+00:00 heroku[web.1]: Process exited with status 143
2018-09-20T08:30:26.455831+00:00 heroku[web.1]: Starting process with command `bin/rails server -p 51256 -e production`
2018-09-20T08:30:32.965279+00:00 app[web.1]: The PGconn, PGresult, and PGError constants are deprecated, and will be
2018-09-20T08:30:32.965301+00:00 app[web.1]: removed as of version 1.0.
2018-09-20T08:30:32.965303+00:00 app[web.1]:
2018-09-20T08:30:32.965305+00:00 app[web.1]: You should use PG::Connection, PG::Result, and PG::Error instead, respectively.
2018-09-20T08:30:32.965306+00:00 app[web.1]:
2018-09-20T08:30:32.965309+00:00 app[web.1]: Called from /app/vendor/bundle/ruby/2.3.0/gems/activesupport-5.0.0/lib/active_support/dependencies.rb:259:in `load_dependency'
2018-09-20T08:30:33.458524+00:00 app[web.1]: [2018-09-20 08:30:33] INFO WEBrick 1.3.1
2018-09-20T08:30:33.458570+00:00 app[web.1]: [2018-09-20 08:30:33] INFO ruby 2.3.7 (2018-03-28) [x86_64-linux]
2018-09-20T08:30:33.459164+00:00 app[web.1]: [2018-09-20 08:30:33] INFO WEBrick::HTTPServer#start: pid=4 port=51256
2018-09-20T08:30:33.797414+00:00 heroku[web.1]: State changed from starting to up
因此,我无法检测到应用程序崩溃的原因.我是否在解决问题的正确道路上?任何帮助表示赞赏. TIA
So, I'm unable to detect why the application has crashed. Am I on the right track to solve my problem? Any help is appreciated. TIA
更新#1:
我运行了我的应用程序,并遵循了 @Maxence 方法.现在,我可以看到两个文件的 404 错误消息
I got my app running and followed @Maxence approach. Now I can see 404 error messages for both the files
ActionController::RoutingError (No route matches [GET] "/stylesheets/css/custom.css")
ActionController::RoutingError (No route matches [GET] "/javascripts/js/custom.js")
更新#2:
这些来自sprockets-manifest
文件的文件的逻辑路径如下
The logical paths for those files from sprockets-manifest
file are below
gentelella/production/js/custom.js
和
gentelella/production/css/custom.css
推荐答案
我在像您这样的生产环境中遇到了很多问题.
Well I have had quite a few problems with asset pipeline in production like you.
第一:不要在Heroku上编译资产.您是通过CLI heroku run rake assets:precomplie
还是通过生产文件config.assets.compile = true
进行操作.它对我也不起作用.
First : Dont compile assets at Heroku. Whether you do through the CLI heroku run rake assets:precomplie
or through your production file config.assets.compile = true
. It has not worked for me either.
只需使用推荐的config.assets.compile = false
.这还将使您的部署速度更快,因为所有内容都已经在本地进行了预编译,并且您的数据包也将变得更苗条.
Just use the recommended config.assets.compile = false
. It will also make your deploy much faster because everything has been precompiled locally and your slug will be slimmer too.
因此基本上只在本地执行RAILS_ENV=production bundle exec rake assets:precompile
.这将在您的public/assets
文件夹中创建指纹资产.还将在此文件夹中创建一个.sprockets-manifest
文件.
So basically just do a RAILS_ENV=production bundle exec rake assets:precompile
locally. This will create fingerprinted assets in your public/assets
folder. It will also create a .sprockets-manifest
file in this folder.
sprockets_manifest
是您的指纹资产与应用程序助手image_tag
等生成的非指纹资产之间的对应关系表.(您可以打开清单文件,这非常有意思,并帮助我理解了我所遇到的问题拥有)
sprockets_manifest
is the table of correspondence between your fingerprinted assets and the non fingerprinted assets generated by the application helpers image_tag
etc .. (You can open the manifest file, it is very interesting and helped me understand the problems I had)
现在,您应该能够在public/assets
文件夹中看到所有指纹化的资产.如果缺少某些文件,则应检查assets.rb
文件,并确保已包含所需的所有文件. (预编译方法只能预编译此文件中提到的内容)
Now you should able to see all your assets fingerprinted in the public/assets
folder. If some are missing you should check your assets.rb
file and make sure you have included all files you need. (Precompiling method only precompiles what is mentionned in this file)
从现在开始,基本上,您的应用程序还不错,尽管我发现一些事情可能会阻止清单文件/链轮对资产的良好匹配:
Basically from now on, your app is fine though I have found a few things that could prevent a good matching of assets by the manifest file / sprockets :
- 在您的助手中,总是提到文件类型
image_tag(splash)
应该更改为image_tag(splash.jpg)
.这是因为清单文件将文件类型添加到逻辑路径,并且rails不会自动猜测它.您应该对javascript_include_tag "gentellela_theme"
执行相同的操作,并将其更改为javascript_include_tag "gentellela_theme.js"
.或javascript_include_tag 'js/custom'
到javascript_include_tag 'js/custom.js'
- 如果您使用SASS,请确保您的css文件正确命名为
whatever.css.scss
,而不是whatever.scss
.我在css文件中使用了sass帮助程序,但文件命名错误,导致清单中断了匹配.
- in your helpers, always mention the file type
image_tag(splash)
should be changed toimage_tag(splash.jpg)
. It is because your manifest file adds the file type to the logical path, and rails doesn't guess it automagically. You should do the same withjavascript_include_tag "gentellela_theme"
and change it tojavascript_include_tag "gentellela_theme.js"
. Orjavascript_include_tag 'js/custom'
tojavascript_include_tag 'js/custom.js'
- If you use SASS make sure your css files are properly named
whatever.css.scss
and notwhatever.scss
. I am using sass helpers in my css files and my files bad naming was breaking the matching by the manifest.
那你应该很好
编辑
根据下面的注释,如果您已使用全名+文件类型更改了资产名称(例如,将splash
更改为splash.jpg
),但文件仍未显示.检查清单文件中该特定资产的逻辑路径.并用逻辑路径替换资产的名称.逻辑路径消除了资产名称的歧义.
As per comments below, if you have changed the assets name with full name+file type (splash
changed to splash.jpg
for example) and the file is still not showing. Check the logical path of that specific asset in the manifest file. And replace the name of the asset by the logical path. The logical path disambiguates asset names.
编辑2
该线程仅涉及Sprockets3.X. Sprockets 4/Webpacker的工作方式有所不同
This thread aonly concernes Sprockets 3.X. Sprockets 4 / Webpacker works differently
这篇关于Rails 5 + Heroku:资产未在生产环境中加载,但可在localhost中运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!