【问题标题】:Precompile Rails 5 to Include all Assets预编译 Rails 5 以包含所有资产
【发布时间】:2017-09-08 03:58:43
【问题描述】:

我正在尝试预编译我的所有资产以进行生产。当我运行RAILS_ENV=production bundle exec rake assets:precompile 时,并不是我所有的资产都在预编译。我尝试使用其他人在其他类似问题中建议的方法,但它们对我没有用。首先,我的 assets.rb 是这样的:

Rails.application.config.assets.version = '1.0'


Rails.application.config.assets.paths << Rails.root.join('node_modules')



Rails.application.config.assets.precompile += %w(creative/manifest.js creative/manifest.css images/* bootstrap/* fonts/* magnific-popup/* morphext/* owlcarousel2/* rs-plugin-5/* stylesheets/* javascripts/*)

如您所见,我在哪里进行预编译,例如我尝试添加 directory/* 以包含所有内容。以下是我要包含的文件以及其中的所有内容(这些文件位于 Assets 目录中):

bootstrap  
fonts   
javascripts     
morphext      
rs-plugin-5
config     
images  
magnific-popup  
owlcarousel2  
stylesheets

这是我运行预编译时在我的公共目录中预编译的内容 看看公共下的图像,你可以看到许多目录不在那里,我什至打开了每个文件夹以查看它们是否是在另一个文件夹中,什么都没有:

最后一部分是当我运行 rails s -e production 并导航到 Localhost:3000 时,我不断收到 500 错误并且没有显示任何内容。 chrome 的控制台和终端都没有错误,所以我看不到我的页面在本地生产时的样子。任何帮助将不胜感激。

更新

这是我的 production.log,看起来它没有获得必要的资产:

I, [2017-09-12T18:43:54.606853 #7393]  INFO -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c] Started GET "/" for 127.0.0.1 at 2017-09-12 18:43:54 -0700
I, [2017-09-12T18:43:54.625461 #7393]  INFO -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c] Processing by CreativesController#index as HTML
I, [2017-09-12T18:43:54.642161 #7393]  INFO -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c]   Rendering creatives/index.html.erb within layouts/application
I, [2017-09-12T18:43:54.644418 #7393]  INFO -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c]   Rendered creatives/index.html.erb within layouts/application (2.1ms)
I, [2017-09-12T18:43:54.644629 #7393]  INFO -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c] Completed 500 Internal Server Error in 19ms
F, [2017-09-12T18:43:54.645433 #7393] FATAL -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c]   
F, [2017-09-12T18:43:54.645478 #7393] FATAL -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c] ActionView::Template::Error (The asset "AdobeStock_95578405.jpeg" is not present in the asset pipeline.):
F, [2017-09-12T18:43:54.645761 #7393] FATAL -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c]     17:                 <li data-transition="slidehorizontal" data-slotamount="default" data-masterspeed="default" data-title="Next Generation Care">
[b2f4fb53-c1ea-4d59-8045-44167c60416c]     18:                 
[b2f4fb53-c1ea-4d59-8045-44167c60416c]     19:                 <!-- main image -->
[b2f4fb53-c1ea-4d59-8045-44167c60416c]     20:                 <%= image_tag "AdobeStock_95578405.jpeg" ,alt: "slidebg1", :data => {bgposition: "center bottom",bgrepeat: "no-repeat", bgfit: "cover"} , :class => "rev-slidebg" %>
[b2f4fb53-c1ea-4d59-8045-44167c60416c]     21: 
[b2f4fb53-c1ea-4d59-8045-44167c60416c]     22:                 <!-- Transparent Background -->
[b2f4fb53-c1ea-4d59-8045-44167c60416c]     23:                 <div class="tp-caption dark-translucent-bg"
F, [2017-09-12T18:43:54.645799 #7393] FATAL -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c]   
F, [2017-09-12T18:43:54.645828 #7393] FATAL -- : [b2f4fb53-c1ea-4d59-8045-44167c60416c] app/views/creatives/index.html.erb:20:in `_app_views_creatives_index_html_erb___200307797594027740_70304554688000'
I, [2017-09-12T18:43:54.734601 #7393]  INFO -- : [8f353cbb-4884-4c2c-896d-ba60b58caa61] Started GET "/favicon.ico" for 127.0.0.1 at 2017-09-12 18:43:54 -0700
F, [2017-09-12T18:43:54.735010 #7393] FATAL -- : [8f353cbb-4884-4c2c-896d-ba60b58caa61]   
F, [2017-09-12T18:43:54.735048 #7393] FATAL -- : [8f353cbb-4884-4c2c-896d-ba60b58caa61] ActionController::RoutingError (No route matches [GET] "/favicon.ico"):
F, [2017-09-12T18:43:54.735071 #7393] FATAL -- : [8f353cbb-4884-4c2c-896d-ba60b58caa61]   
F, [2017-09-12T18:43:54.735100 #7393] FATAL -- : [8f353cbb-4884-4c2c-896d-ba60b58caa61] actionpack (5.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:63:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] actionpack (5.1.3) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] railties (5.1.3) lib/rails/rack/logger.rb:36:in `call_app'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] railties (5.1.3) lib/rails/rack/logger.rb:24:in `block in call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] activesupport (5.1.3) lib/active_support/tagged_logging.rb:69:in `block in tagged'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] activesupport (5.1.3) lib/active_support/tagged_logging.rb:26:in `tagged'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] activesupport (5.1.3) lib/active_support/tagged_logging.rb:69:in `tagged'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] railties (5.1.3) lib/rails/rack/logger.rb:24:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] actionpack (5.1.3) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] actionpack (5.1.3) lib/action_dispatch/middleware/request_id.rb:25:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] rack (2.0.3) lib/rack/method_override.rb:22:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] rack (2.0.3) lib/rack/runtime.rb:22:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] activesupport (5.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] actionpack (5.1.3) lib/action_dispatch/middleware/executor.rb:12:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] rack (2.0.3) lib/rack/sendfile.rb:111:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] railties (5.1.3) lib/rails/engine.rb:522:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] puma (3.10.0) lib/puma/configuration.rb:225:in `call'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] puma (3.10.0) lib/puma/server.rb:605:in `handle_request'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] puma (3.10.0) lib/puma/server.rb:437:in `process_client'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] puma (3.10.0) lib/puma/server.rb:301:in `block in run'
[8f353cbb-4884-4c2c-896d-ba60b58caa61] puma (3.10.0) lib/puma/thread_pool.rb:120:in `block in spawn_thread'
I, [2017-09-12T18:43:58.249911 #7393]  INFO -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26] Started GET "/" for 127.0.0.1 at 2017-09-12 18:43:58 -0700
I, [2017-09-12T18:43:58.251066 #7393]  INFO -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26] Processing by CreativesController#index as HTML
I, [2017-09-12T18:43:58.252212 #7393]  INFO -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26]   Rendering creatives/index.html.erb within layouts/application
I, [2017-09-12T18:43:58.253079 #7393]  INFO -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26]   Rendered creatives/index.html.erb within layouts/application (0.7ms)
I, [2017-09-12T18:43:58.253250 #7393]  INFO -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26] Completed 500 Internal Server Error in 2ms
F, [2017-09-12T18:43:58.254061 #7393] FATAL -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26]   
F, [2017-09-12T18:43:58.254123 #7393] FATAL -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26] ActionView::Template::Error (The asset "AdobeStock_95578405.jpeg" is not present in the asset pipeline.):
F, [2017-09-12T18:43:58.254377 #7393] FATAL -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26]     17:                 <li data-transition="slidehorizontal" data-slotamount="default" data-masterspeed="default" data-title="Next Generation Care">
[2e6342ac-ec61-410c-98ba-ae205fb9cc26]     18:                 
[2e6342ac-ec61-410c-98ba-ae205fb9cc26]     19:                 <!-- main image -->
[2e6342ac-ec61-410c-98ba-ae205fb9cc26]     20:                 <%= image_tag "AdobeStock_95578405.jpeg" ,alt: "slidebg1", :data => {bgposition: "center bottom",bgrepeat: "no-repeat", bgfit: "cover"} , :class => "rev-slidebg" %>
[2e6342ac-ec61-410c-98ba-ae205fb9cc26]     21: 
[2e6342ac-ec61-410c-98ba-ae205fb9cc26]     22:                 <!-- Transparent Background -->
[2e6342ac-ec61-410c-98ba-ae205fb9cc26]     23:                 <div class="tp-caption dark-translucent-bg"
F, [2017-09-12T18:43:58.254415 #7393] FATAL -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26]   
F, [2017-09-12T18:43:58.254442 #7393] FATAL -- : [2e6342ac-ec61-410c-98ba-ae205fb9cc26] app/views/creatives/index.html.erb:20:in `_app_views_creatives_index_html_erb___200307797594027740_70304554688000'

更新 2

这是我的资产文件夹结构的图像:

我还注意到还有另一个 assets 文件夹,因为它正在预编译 rs-plugin 的结构,而不是其他文件夹见图片:

这是我的 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 Cnd
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1
    config.assets.paths << Rails.root.join("app", "assets", "fonts")
    config.assets.paths << Rails.root.join("app", "assets", "images")
    config.assets.paths << Rails.root.join("app", "assets", "bootstrap")
    config.assets.paths << Rails.root.join("app", "assets", "rs-plugin-5")
    config.assets.paths << Rails.root.join("app", "assets", "magnific-popup")
    config.assets.paths << Rails.root.join("app", "assets", "owlcarousel2")
    config.assets.paths << Rails.root.join("app", "assets", "morphext")

    # 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.
  end
end

【问题讨论】:

  • 您的问题只是在生产中?你跑RAILS_ENV=production bundle exec rake assets:precompile了吗?此外,如果问题来自开发,请包括您收到的错误消息。生产会压制一些细节。在某些情况下,资产管道的某些错误可能仅在生产中显示。我需要了解资产管道中什么不起作用。资产管道中未包含任何文件或某些特定文件未包含?
  • 不得不编辑我的问题,这是我运行的代码 RAILS_ENV=PRODUCTION... 并且开发方面工作正常我唯一的问题是试图让一切在生产中正常运行。
  • 启用生产和日志中的错误消息,以便您更好地了解错误。您没有发布任何错误,或者您没有告诉我们哪些文件未包含在内。例如,特定文件没有得到预编译。 application.jsapplication.scss 中缺少它?但是您的应用程序无法运行,它有 500 内部服务器错误。可能意味着您正在尝试加载文件并且 rails 没有找到它们。通常当您需要在 assets.rb 中包含一些资产或在该路径中找不到资产时会出现此错误
  • 另一个问题是,开发中的rails有时会在app/assets/文件夹中找到文件,如果它在public/assets/文件夹中没有找到它。所以它回退到非指纹资产。要对此进行测试,您可以从 guides.rubyonrails.org/asset_pipeline.html#turning-digests-off 的指南第 3.2 章禁用此功能 config.assets.unknown_asset_fallback = false
  • 如何在生产环境中启用错误消息?

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:
Rails.application.config.assets.precompile += %w(creative/manifest.js creative/manifest.css images/* bootstrap/* fonts/* magnific-popup/* morphext/* owlcarousel2/* rs-plugin-5/* stylesheets/* javascripts/*)

但正如我从您的屏幕截图中看到的那样,您的 public/assets 目录中有一个名为 assets 的文件夹。

您的指纹文件预编译文件位于 public/assets/assets 中,而不是 public/assets

这意味着如果这些文件被推送到生产环境(检查它们是否在您的 git 存储库中,如果没有,请执行 git add),您将无法在路径 localhost:3000/assets/&lt;nameofyourfile&gt; 中看到它们,因为你的目录结构改变了,也许你可以在localhost:3000/assets/assets/&lt;nameofyourfile&gt;显示它们,但如果我是你,我会保持正常的目录结构。

预编译资产意味着创建其指纹版本

通过说我想预编译我的所有资产,您是说您希望在资产管道中添加或编辑的所有文件都生成预编译指纹版本以用于生产。

预编译是如何工作的? 你可以阅读chapter 4.1 of the Asset Pipeline Documentation,基本上sprockets 使用一个名为.sprockets-manifest-fingerprint.json 的文件来检查哪个是用于生产的最新版本的指纹文件。这就是为什么有时删除 public/assets 文件夹可以解决问题的原因,因为您删除了所有旧文件,包括 sprockets-manifest.json,这些文件可能不会使用最新的指纹进行更新。

如果在您的public/assets 文件夹中找不到这些文件,开发将回退到您的app/assets 文件夹中的文件,这就是为什么您只在生产中收到错误。 您可以阅读了解如何禁用此行为

chapter 3.1 and 3.2

所以执行这些步骤,因为错误通常在开发中更容易解决,因为您无需推送 git 即可查看结果。有时文件包含在.gitignore 中,或者您需要使用git add app/assets/&lt;nameofthefolder&gt;/&lt;nameofthefile&gt; 手动添加该文件

我们也确实在屏幕截图中看到了您的 public 文件夹,但我们没有看到您的 app/assets 文件夹结构和您的任何 sprockets 设置,所以也许这不是为了获得解决方案而在问题中添加赏金,但只是为我们提供找到解决方案所需的信息。

现在这是一个基于一般意见的问题

另外我相信你通过config.assets.prefix = "/some_other_path"改变了/assets路径

【讨论】:

  • 它表示公共目录中的资产/资产,因为正在编译的唯一资产是 rs-plugin-5 参见我发布的最后一张图片。我不确定为什么它只编译那个而不是其他插件文件夹。
  • @JermaineSubia 您正在使用的并不是最佳实践。您应该需要 manifest.js 中的 js 文件和 manifest.scss 中的 css 文件。这样做的原因是文件加载的顺序会导致您的 Js 和 css 中出现错误。
  • 我最初是这样做的,但我发现插件有其他要求,例如图像或其他文件,如果没有它们,在本地渲染时将无法正常运行,直到我将插件放入我的应用程序中。跨度>
  • 为了完成这项工作,我必须对添加到问题中的 application.rb 文件进行一些更改。
  • 好的。您应该有 3/4 个文件夹。 javascript 文件夹,这在您的manifest.js 中都是必需的,或者您可以在您的manifest.scss 中拥有多个manifest.jsstylesheets,然后您可以拥有一个用于images 和@987654351 的文件夹@,我建议在您的assets.rb 中明确要求这些文件中的每一个
【解决方案2】:

如果您希望您的 rails 应用程序服务,请首先确保这一点。

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

关于资产编译请注意,如果您分别谈论 css 或 js,则可能需要添加到 application.css 或 .js 中。检查this

例如(如上面的链接)

app/assets/javascripts/home.js
lib/assets/javascripts/moovinator.js
vendor/assets/javascripts/slider.js
vendor/assets/somepackage/phonebox.js

将在这样的清单中引用:

//= require home
//= require moovinator
//= require slider
//= require phonebox

也可以访问子目录中的资产。

app/assets/javascripts/sub/something.js

被引用为:

//= require sub/something

我注意到的一些事情:

  1. 您在另一个资产文件夹中有一个资产文件夹。这似乎根本不对。
  2. 你能告诉我你的资产目录,你有那个AdobeStock_95578405.jpegimage吗?
  3. 在您的 config/initializers/assets.rb 文件中添加 Rails.application.config.assets.precompile
  4. 哦,顺便说一句,确保每次在测试时进行更改时都重新启动服务器。我已经花了太多时间,只是因为我完全忘记了这个简单的事情。

【讨论】:

  • 刚刚添加了我的文件结构的图像
  • 我发现它只是预编译图像和字体,而且只有 rs-plugin。查看我刚刚上传的图片
  • 您是否将其他人添加到您的清单中?你需要整棵树吗?另外,我认为如果您将资产添加到“资产”文件夹中,则无需将它们再次包含在您的 application.rb 文件中。你真的只需要在你的清单中要求它们
  • 顺便说一句,第三方库应该是内部供应商文件夹。只有特定的应用资产必须位于资产管道文件夹中。
【解决方案3】:

这可能是错误的,但看起来您从预编译目录列表中遗漏了config。尝试将您的列表更新为:

Rails.application.config.assets.precompile += %w(creative/manifest.js creative/manifest.css images/* bootstrap/* fonts/* magnific-popup/* morphext/* owlcarousel2/* rs-plugin-5/* stylesheets/* javascripts/* config/*)

【讨论】:

  • 我发现它只是预编译图像和字体,而且只有 rs-plugin。查看我刚刚上传的图片。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多