一些资产未加载到旧的 Rails 3-2 稳定的应用程序中
Some assets not loading in an old Rails 3-2-stable app
底部有重大更新 POST
我有一个 Rails 3-2 稳定的应用程序,我正在将其移动到新服务器,以便我可以将其升级到 Rails 5。目前,它托管在 Heroku 上,并且大多数资产都显示得很好(应用程序 Just Works (TM))。我有一些 运行dom 资产在 Digital Ocean droplet 上预编译后不会显示。我正在部署 Capist运行o.
不会显示的资产错误如下所示:
Loading failed for the <script> with source “http://stage.fancy-new-droplet.com/assets/application/application.js”.
在某些情况下,会有一个与资产关联的哈希值,如下所示:
Loading failed for the <script> with source “http://stage.fancy-new-droplet.com/assets/application/certifications-56046476595984b00d1267a4f02822e5.js
在前一种情况下,资产实际上在 public/assets/
中,而不是在 droplet 中的 public/assets/application/
中。将丢失的资产移动或符号链接到该位置似乎没有任何影响。在后一种情况下,据我所知,资产根本不存在于液滴上。
对于文件名中没有散列的情况,将我的包含标签更改为:
<%= javascript_include_tag "application/application" %>
像这样:
<%= javascript_include_tag "application" %>
会解决这个问题,但我觉得这是一个转移注意力的问题,因为其他资产在预编译后似乎不存在。
我 运行 解决了一个深奥的问题,其中 droplet 运行 内存不足,并且在资产编译中途默默地失败了,但我增加了可用内存,它甚至没有使用一半现在的记忆。不过,它确实最大化了 CPU 100%。我可能会尝试增加 droplet 上的 CPU 和内存。
以下是来自 config/environments/production.rb
的相关资产编译行:
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = true
config.assets.digest = true
以及来自 application.rb
的相关资产编译行:
config.assets.enabled = true
config.assets.version = '1.0'
在本地,一切都 100% 正常,没有错误。资产加载正常,我们都很好。这是我的 development.rb
文件中的资产管道位:
config.assets.compile = true
config.assets.compress = false
config.assets.debug = true
我在生产服务器上(在生产环境中)运行 rake assets:clean
、rake assets:precompile
和 rake assets:precompile:all
的各种组合,我什至用核弹public/assets/ 文件夹重新开始。都无济于事。
什么可能导致这些资产无法在我们的 Droplet 上创建,而它们设法在 Heroku 上创建?
编辑
根据要求,我的 DO 堆栈只是一个 droplet(2vcpu,2gb ram),我使用的是 Puma 和 Nginx。这是我的 Capfile:
# Load DSL and Setup Up Stages
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/scm/git'
install_plugin Capistrano::SCM::Git
require 'capistrano/rails'
require 'capistrano/bundler'
require 'capistrano/rvm'
require 'capistrano/puma'
install_plugin Capistrano::Puma
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
进一步编辑
我已经在 application.rb
和 运行 的 rake assets:clean, assets:precompile
和 assets:precompile:all
与 [=32= 的各种排列中使用了几次 config.assets.initialize_on_precompile
] 本地无果。
又一次编辑
此时我注意到预编译生产资产似乎没有编译四个 javascript 文件和大约七个 css 文件。它似乎也没有将 application.js 放入 public/assets/application/application.js
(应用程序查找的位置),而是放在 public/assets/application.js
中。
更多编辑
我通过修复 application.js
中的 require_tree
语句解决了 JavaScript 资产未加载的问题,现在唯一的问题似乎是缺少几个 CSS文件。
在此应用程序中,有两个包含 css 个文件的目录:
app/assets/stylesheets/
app/assets/stylesheets/application
共有近 100 个样式表未加载,共有 21 个。未加载的样式表正在使用散列文件名 (somefile-hash.css
) 调用,但这些散列文件不存在于 Droplet 的 public/assets/
中。
这是 application.css.scss
的要求:
/*
*= require_self
*= require chosen
*= require jquery-ui/autocomplete
*= require jquery-ui/datepicker
*= require feature-carousel
*= require_tree .
*/
出于沮丧,我将 = require_directory ./assets
添加到该列表,现在我只有大约 15 个样式表无法 compile/load。这种行为对我来说没有任何意义,因为我认为 = require_tree .
会覆盖不稳定的子目录。
单独指定文件 = require foo
或 = require foo.css.scss
似乎也没有任何影响。
我也因为沮丧而撞到了 config.assets.version
无济于事。
此外,再多的脏话也无法说服这些资产编译。
也许可以尝试在 production.rb 中更改这些内容,但不能保证,可能值得一试。
config.serve_static_files = true
config.assets.compile = false
此外,如果你在 Gemfile 中有这个,你可能想尝试将其注释掉并在部署之前在本地捆绑安装。
gem 'rails_12factor', group: :production
这是 Heroku 所要求的,但您在 DO 上可能不需要它。参见 https://github.com/heroku/rails_12factor
此外,如果可以的话,请 post 有关您的 DO 堆栈和 Capfile 的更多相关信息
只需在 production.rb
上更改此设置即可:
config.serve_static_assets = true
资产管道连接您的资产以仅生成和提供指定文件,默认为 'application.js'、'application.css' 和 images/fonts。
如果您通过 javascript_include_tag
或 stylesheet_link_tag
助手在您的应用程序中明确包含其他 css/js 文件,您需要通过 config.assets.precompile +=
在 application.rb
或初始化程序中设置。
目前,这些文件应该已经通过 require_tree .
指令包含在您的 application
清单中。因此,这些样式现在也可能正在应用。如果是这种情况,您只需删除单独添加各个样式表的代码即可摆脱 404。
仍然不确定该应用程序在 heroku 上如何正常运行,也许您有一些 heroku 配置可以为静态资产提供服务。
底部有重大更新 POST
我有一个 Rails 3-2 稳定的应用程序,我正在将其移动到新服务器,以便我可以将其升级到 Rails 5。目前,它托管在 Heroku 上,并且大多数资产都显示得很好(应用程序 Just Works (TM))。我有一些 运行dom 资产在 Digital Ocean droplet 上预编译后不会显示。我正在部署 Capist运行o.
不会显示的资产错误如下所示:
Loading failed for the <script> with source “http://stage.fancy-new-droplet.com/assets/application/application.js”.
在某些情况下,会有一个与资产关联的哈希值,如下所示:
Loading failed for the <script> with source “http://stage.fancy-new-droplet.com/assets/application/certifications-56046476595984b00d1267a4f02822e5.js
在前一种情况下,资产实际上在 public/assets/
中,而不是在 droplet 中的 public/assets/application/
中。将丢失的资产移动或符号链接到该位置似乎没有任何影响。在后一种情况下,据我所知,资产根本不存在于液滴上。
对于文件名中没有散列的情况,将我的包含标签更改为:
<%= javascript_include_tag "application/application" %>
像这样:
<%= javascript_include_tag "application" %>
会解决这个问题,但我觉得这是一个转移注意力的问题,因为其他资产在预编译后似乎不存在。
我 运行 解决了一个深奥的问题,其中 droplet 运行 内存不足,并且在资产编译中途默默地失败了,但我增加了可用内存,它甚至没有使用一半现在的记忆。不过,它确实最大化了 CPU 100%。我可能会尝试增加 droplet 上的 CPU 和内存。
以下是来自 config/environments/production.rb
的相关资产编译行:
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = true
config.assets.digest = true
以及来自 application.rb
的相关资产编译行:
config.assets.enabled = true
config.assets.version = '1.0'
在本地,一切都 100% 正常,没有错误。资产加载正常,我们都很好。这是我的 development.rb
文件中的资产管道位:
config.assets.compile = true
config.assets.compress = false
config.assets.debug = true
我在生产服务器上(在生产环境中)运行 rake assets:clean
、rake assets:precompile
和 rake assets:precompile:all
的各种组合,我什至用核弹public/assets/ 文件夹重新开始。都无济于事。
什么可能导致这些资产无法在我们的 Droplet 上创建,而它们设法在 Heroku 上创建?
编辑
根据要求,我的 DO 堆栈只是一个 droplet(2vcpu,2gb ram),我使用的是 Puma 和 Nginx。这是我的 Capfile:
# Load DSL and Setup Up Stages
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/scm/git'
install_plugin Capistrano::SCM::Git
require 'capistrano/rails'
require 'capistrano/bundler'
require 'capistrano/rvm'
require 'capistrano/puma'
install_plugin Capistrano::Puma
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
进一步编辑
我已经在 application.rb
和 运行 的 rake assets:clean, assets:precompile
和 assets:precompile:all
与 [=32= 的各种排列中使用了几次 config.assets.initialize_on_precompile
] 本地无果。
又一次编辑
此时我注意到预编译生产资产似乎没有编译四个 javascript 文件和大约七个 css 文件。它似乎也没有将 application.js 放入 public/assets/application/application.js
(应用程序查找的位置),而是放在 public/assets/application.js
中。
更多编辑
我通过修复 application.js
中的 require_tree
语句解决了 JavaScript 资产未加载的问题,现在唯一的问题似乎是缺少几个 CSS文件。
在此应用程序中,有两个包含 css 个文件的目录:
app/assets/stylesheets/
app/assets/stylesheets/application
共有近 100 个样式表未加载,共有 21 个。未加载的样式表正在使用散列文件名 (somefile-hash.css
) 调用,但这些散列文件不存在于 Droplet 的 public/assets/
中。
这是 application.css.scss
的要求:
/*
*= require_self
*= require chosen
*= require jquery-ui/autocomplete
*= require jquery-ui/datepicker
*= require feature-carousel
*= require_tree .
*/
出于沮丧,我将 = require_directory ./assets
添加到该列表,现在我只有大约 15 个样式表无法 compile/load。这种行为对我来说没有任何意义,因为我认为 = require_tree .
会覆盖不稳定的子目录。
单独指定文件 = require foo
或 = require foo.css.scss
似乎也没有任何影响。
我也因为沮丧而撞到了 config.assets.version
无济于事。
此外,再多的脏话也无法说服这些资产编译。
也许可以尝试在 production.rb 中更改这些内容,但不能保证,可能值得一试。
config.serve_static_files = true
config.assets.compile = false
此外,如果你在 Gemfile 中有这个,你可能想尝试将其注释掉并在部署之前在本地捆绑安装。
gem 'rails_12factor', group: :production
这是 Heroku 所要求的,但您在 DO 上可能不需要它。参见 https://github.com/heroku/rails_12factor
此外,如果可以的话,请 post 有关您的 DO 堆栈和 Capfile 的更多相关信息
只需在 production.rb
上更改此设置即可:
config.serve_static_assets = true
资产管道连接您的资产以仅生成和提供指定文件,默认为 'application.js'、'application.css' 和 images/fonts。
如果您通过 javascript_include_tag
或 stylesheet_link_tag
助手在您的应用程序中明确包含其他 css/js 文件,您需要通过 config.assets.precompile +=
在 application.rb
或初始化程序中设置。
目前,这些文件应该已经通过 require_tree .
指令包含在您的 application
清单中。因此,这些样式现在也可能正在应用。如果是这种情况,您只需删除单独添加各个样式表的代码即可摆脱 404。
仍然不确定该应用程序在 heroku 上如何正常运行,也许您有一些 heroku 配置可以为静态资产提供服务。