无法在 Rails 引擎中获取虚拟应用程序以从其他 gem 加载资产

Trouble getting dummy app in a Rails engine to load assets from other gems

我有一个 rails 引擎,在过去的一年里一直运行良好。我决定是时候向应用程序添加一些自动化测试了,我 运行 遇到了将虚拟应用程序设置为 运行 的问题。

我在我的引擎中使用 rspec,并且我在 spec/dummy 上安装了虚拟应用程序。我的原始引擎不是使用 rails plugin new 命令生成的。我使用 bundle gem 创建它,并随着时间的推移通过添加所需的文件来构建它。为了让自动化测试工作,我使用 rails plugin new 创建了一个新引擎,这样我就可以看到虚拟 rails 应用程序是如何创建的。我将所有相关文件复制到我的新引擎中,几乎一切正常。我能够针对虚拟应用程序执行一些简单的 rspec 示例,但是,这些是启动虚拟应用程序的非常基本的示例,但实际上不会触发任何控制器操作。

我想看看我是否可以 运行 虚拟应用程序,这样我就可以开始使用水豚添加更多有趣的 rspec 测试。我的引擎向其主机 rails 应用程序添加了一些控制器和视图,因此我应该能够转到浏览器中的相关路径并加载视图。当我切换到 spec/dummy 文件夹并启动 rails 服务器时,应用程序可以正常启动。但是,一旦我尝试调出一个页面,我就会收到以下错误:

File to import not found or unreadable: font-awesome

同样,引擎在常规 Rails 应用程序中没有问题 运行ning。这个虚拟应用程序有些不对劲。 spec/dummy/config/application.rb 文件有:

require "my_engine"

如果我理解正确,这应该需要 lib/my_engine.rb 文件,在该文件中我有:

require "font-awesome-rails"

所以此时,my_engine 应该与其所有组件 gem 一起加载,例如 font-awesome-rails。我在 $LOAD_PATH 中看到对 font-awesome 的引用,所以这似乎有效。

发生错误是因为引擎有一个 app/assets/stylesheets/my_engine.scss 文件,其中包含:

@import "font-awesome";
@import "another-file-from-another-engine-I-wrote";

加载此文件是因为 app/assets/stylesheets/application.scss 虚拟文件具有:

@import "my_engine";

因此,虚拟应用程序在引擎中导入 scss 文件,这反过来又会拉入超棒的字体样式表。这种技术对常规 Rails 应用程序非常有用,但它似乎对虚拟应用程序失败了,我不知道为什么。

这不是字体问题。如果我注释掉 my_engine.scss 中的 @import "font-awesome",我会在下一个组件资产上得到完全相同的错误:

File to import not found or unreadable: another-file-from-another-engine-I-wrote

我已经对 my_engine 中的文件进行了三次检查,以确保它们与我最初使用 rails plugin new 创建 gem 时生成的文件相匹配。虚拟应用程序似乎无法从子组件 gems 加载资产。我错过了什么?

我明白了。没有告诉引擎加载 sass-rails gem。将此添加到我的 gemspec 修复了所有问题:

spec.add_development_dependency "sass-rails", "~> 5.0.4"

'sass-railsis added to theGemfile` 用于新的 Rails 应用程序,这就是为什么在常规 rails 应用程序中一切正常的原因。