我正在将一个大型的商业(专有)Rails 6应用程序升级到Rails 7。我们从来没有使用过Webpacker,而是直接从Bootstrap之类的捆绑gem升级到“Rails 7方式”。
事实证明,Rails 7的“无Node”工作流对于同时包含CSS和JS组件的组件没有很好的解决方案。在我们的案例中,最明显的违规者是Bootstrap。面对通过导入Map维护Bootstrap的JS“一半”,以及通过类似旧的Bootstrap gem或手动调试维护CSS“一半”的问题,(是的,有really is no other solution without Node here)我们最终回到了完整的Node工作流。
所有提供CSS和/或JS的前端组件都已经可以在NPM中愉快地使用,所以现在都通过package.json
和Yarn进行管理,bin/dev
驱动Sass和esbuild
编译从app/assets
,app/javascript
或node_modules/...
提取的SCSS和JS组件;因此,资产管道manifest.js
仅包含对app/assets
内的build
和images
文件夹的引用。
这感觉有点倒退,所有重量级的手动维护文件名列表(不再支持导入),沿着的是现在在Foreman下运行的多个进程的复杂性,而不是在每个请求的基础上在Sprockets中同步处理事情,但随着所有这些东西都被弃用/放弃,显然是时候更新了。
这一切在开发和生产模式下都很好,但是测试呢?我们使用RSpec;在CI中,没有构建的资产,开发人员不想记住运行esbuild
或者assets:precompile
或者其他什么东西。除了别的,它非常慢。
在基于Yarn/Node的工作流中,特别是使用cssbundling-rails
和jsbundling-rails
的工作流中,当您想要使用最新的资产运行测试时,官方的惯用Rails 7解决方案是什么?
3条答案
按热度按时间mm9b1k5b1#
jsbundling-rails
和cssbundling-rails
都将自己附加到一个名为test:prepare
的rake任务中。有几种方法可以使
test:prepare
运行,具体取决于您的整个构建过程。1.直接调用:
bundle exec rails test:prepare test
个或者,如果在
rails
命令之外运行rspec:bundle exec rails test:prepare && bundle exec rspec
个1.使用已经调用
test:prepare
的测试任务。奇怪的是,只有一些测试任务调用(依赖于)
test:prepare
,而其他任务(包括默认的test
任务)不调用。bundle exec rails test:all
个1.使
test:prepare
成为您首选测试任务的依赖项。例如,如果您通常通过运行
bundle exec rails spec
来使用spec
任务,请将此添加到新的或现有的任务文件(如lib/tasks/tests.rake
)中:task spec: ['css:build', 'javascript:build']
个背景
test:prepare
是Rails定义的空任务。cssbundling-rails
和jsbundling-rails
都将自己添加为该任务的依赖项。一般来说,
test:prepare
是添加运行测试所需的任何类型的依赖项的有用位置,但需要注意的是,只有一些Rails的默认测试任务依赖于它。但如上所述,您始终可以直接调用它或添加自己的依赖项。在大多数情况下,调用
test:prepare
将等同于调用css:build
和javascript:build
,这就是为什么我在上面的大多数示例中展示了test:prepare
。有时,其他gem或您的应用程序也可能使用附加命令扩展test:prepare
,在这种情况下,这些命令也会运行(并且可能需要)。还要注意,
assets:precompile
还依赖于css:build
和javascript:build
。(或分别为css:build
和javascript:build
)运行速度比assets:precompile
快,这可能是因为我们运行的是sprockets-rails
的轻量级配置(与propshaft
相对),而assets:precompile
运行整个编译过程。mzaanser2#
这是相当糟糕的,但总比现在什么都没有好;它将确保CI始终构建资产,并确保本地开发始终拥有最新的资产,即使在
bin/dev
未运行时修改了内容。字符串
(编辑)正如下面的评论者指出的,你需要确保Rake任务加载在你的
spec_helper.rb
中,例如:型
cwdobuhd3#
我最近在一个新的Rails7.1.2应用程序上使用RSpec时遇到了同样的困境。
在阅读了@tm上面写的很棒的答案之后,我运行
rails -T
为RSpec寻找类似的任务,并“发现”了这个:字符串
它还调用
test:prepare
,如@tm所述。