Shr*_*ewd 6 rake rubygems ruby-on-rails ruby-on-rails-3
我有一个rails应用程序使用rake db:seed我的数据库中的一些基础知识来开始工作.这通过一些基础设施和fixtures.rb工作,其他人写道将YAML加载到数据库中.
我正在尝试做的是采用这个基础设施并将其移动到我自己的宝石中,以便我可以在其他地方再次使用它,这需要我将一些我自己的宝石模型插入宝石的种子任务(我想要的)从db:seed主应用程序中的调用或类似的东西运行)并且主应用程序使用它自己的种子推送一些gem的模型.这个的第二部分我已经工作了,这是我给出的fixtures.rb文件中的一个简单修复.我现在要做的事情:
[MyGem::Engine.root, 'lib', ...].join从那时调用一个方法的文件,其中有一个路径将YAML文件加载到数据库中,我不明白为什么它不应该工作.rake db:seed运行我的宝石中定义的任务.我已经在我的gem(它是引擎)的lib/tasks下添加了.rake文件,但我似乎无法从主应用程序rakefile中调用它们.rake db:seed在主应用程序中运行时宝石将运行额外的播种,而主应用程序开发人员甚至不必了解它们.我想要避免的脏解决方案是从主应用程序内的gem中加载.rake文件,或者从主应用程序中的gem中加载seeds.rb.
所以我要问的是基本上如何通过rake db:seed在gemfile中使用gem 来使任务在我的gemified引擎中定义?
问完这个问题后不久我就明白了。第一步是从这里开始的:如何将 gems 任务添加到主应用程序
然后在任务文件中
#lib/task/some_task.rake
Rake::Task['db:seed'].enhance ['my_seed_task']
#lib/tasks/my_seed_task.rake
task 'my_seed_task' do
...
end
Run Code Online (Sandbox Code Playgroud)
现在,当我在主应用程序中运行时,rake db:seed它会运行 my_seed_task 定义为额外费用的任何内容。