Rails 5 - 如何在资产管道中包含所有供应商资产?

Posted

技术标签:

【中文标题】Rails 5 - 如何在资产管道中包含所有供应商资产?【英文标题】:Rails 5 - How to include all vendor assets in the asset pipeline? 【发布时间】:2019-11-15 12:40:00 【问题描述】:

我在vendor/assets 目录中发现了几个不同的线程,但没有找到任何对我有用的东西。以前,我将所有供应商资产放在 app/ 目录中,但将 javascript 移动到 vendor/assets/javascripts/ 目录,将 CSS 移动到 vendor/assets/stylesheets/ 目录。

我现在正尝试在开发和生产中加载我的供应商资产,但它们根本没有加载。这是我的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 += [
  Rails.root.join('vendor/assets/javascripts/*').to_s,
  Rails.root.join('vendor/assets/stylesheets/*').to_s
]

我也尝试将vendor/assets/ 目录添加到Rails.application.config.assets.paths,但没有帮助。

如何在资产管道中包含所有供应商资产?

更新

我通过将以下内容添加到 app/assets/javascripts/application.js 来加载我的供应商 JavaScript:

//= require_tree ../../../vendor/assets/javascripts/.

但是,我正在使用 Sass,但仍然无法加载 SCSS 文件。

【问题讨论】:

添加这些行时是否重新启动了服务器?您应该像这样添加文件夹:config.assets.paths &lt;&lt; Rails.root.join('vendor', 'assets') @Waclock 感谢您的评论。我确实重新启动了我的服务器,不幸的是,以这种方式添加文件夹也不起作用。 【参考方案1】:

在记住 Rails 资产加载路径和 Sprocket 是不同的系统后,我终于弄明白了。这是我所做的:

config/initializes/assets.rb 中,我添加了以下几行:

# Add additional assets to the asset load path
Rails.application.config.assets.paths += [
  Rails.root.join('vendor', 'assets').to_s
]

# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
Rails.application.config.assets.precompile += [
  Rails.root.join('vendor/assets/javascripts/*').to_s,
  Rails.root.join('vendor/assets/stylesheets/*').to_s
]

第一个块将供应商资产添加到 Rails 资产路径。这允许我在视图助手中使用供应商资产(例如:image_tag)。第二个块允许我的供应商 JavaScript 和 CSS 与我的其余资产一起预编译。

然后,我在app/assets/javascripts/application.js 上面的//= require_tree . 中添加了以下行:

//= require_tree ../../../vendor/assets/javascripts/.

这将自动将我放入 vendor/assets/javascripts 的所有 JavaScript 文件添加到我的应用程序中。

对于 Sass,我将以下内容添加到 app/assets/stylesheets/application.sass

@import "../../../vendor/assets/stylesheets/*";

我在@import "*"; 之前添加了这一行,以便我自己的应用程序的样式优先。这将包括我的应用程序中的所有供应商 Sass 文件。然后我将我的所有供应商.css 文件重命名为使用.scss 扩展名。

现在开发工作正常,我担心预编译。我在本地运行rails assets:precompile,果然,我所有的供应商资产都包括在内!

【讨论】:

以上是关于Rails 5 - 如何在资产管道中包含所有供应商资产?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 3.1 中包含供应商 js

Rails 3.1 资产管道和缓存

Rails 3.1 资产管道供应商/资产文件夹组织

Rails 3.1 资产管道和手动订购的 Javascript 需要

在 Rails 中使用 config.assets.precompile 在子目录中包含资产

Rails 5/6:如何在 webpacker 中包含 JS 函数?