将来自其他 gem 的 rake 任务分组

Grouping rake tasks from other gems

为了避免在我想重新初始化我的项目时触发许多 rake 任务,我在 lib/task/twiddle.rake 中创建了以下任务:

task :twiddle => %w(db:drop db:create railties:install:migrations db:migrate db:seed spree_sample:load)

从命令行触发这些命令中的每一个都有效。 但是 运行 rake twiddle 在到达 spree_sample:load 时挂起并出现以下错误:

NoMethodError: undefined method `slug' for #<Spree::Product:0x0000000ec9b9f0>

有人可以解释为什么 运行 一组特定任务可以在 CLI 上运行,而不是通过 rake 任务运行吗?我应该需要一些图书馆吗?

实际上答案相对简单 - Rails 仅在启动时从数据库加载模式信息。 (你可以做类似 reset_schema_information 的事情来强制它重新加载)

您通常永远不会在 db:migrate 之后立即执行 db:seed,因为 Rails 不会在迁移和播种之间重新加载应用程序。因此,当 db:seed 运行 时,它将没有 table 信息。这就是为什么如果你单独 运行 它们会看到不同的结果 - 运行 单独设置它们的行为会使 Rails 重新加载自身并修复尝试使用模式的 catch-22仅通过上一个命令可用。

此外,railties:install:migrations 在您的任务中毫无意义——您只 运行 作为开发人员 1 次,它会创建多个迁移文件(您签入到 git),然后这些文件将永远存在于您的应用程序中。您不必定期重新运行 railties:install:migrations,因为您已经创建了这些迁移文件。 (升级spree的时候确实要重新运行,但那是另外一回事)