在gem的rake任务中需要gem

时间:2010-11-15 17:33:55

标签: ruby-on-rails ruby ruby-on-rails-3 bundler

我正在使用珠宝商为Rails 3创建一个宝石。宝石包含一个rake任务,其中一件事就是擦除数据库,所以我使用'database_cleaner'。

我在gem的Gemfile中指定了gem依赖

gem 'database_cleaner'

在Rakefile中

Jeweler::Tasks.new do |gem|
  ...
  gem.add_dependency 'database_cleaner'
end

然后在lib里面我创建了文件my_gem.rb和tasks.rake。如下,my_gem.rb:

module MyGem
  class Railtie < Rails::Railtie
    rake_tasks do
      load 'tasks.rake'
    end
  end
end

和tasks.rake:

task :my_task do
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean
end

我安装了gem(sudo rake install),创建了一个空的rails项目,并在rails的Gemspec(gem 'my_gem')中添加了gem依赖项。但是当我尝试运行rake my_task时,我收到错误uninitialized constant DatabaseCleaner

我还尝试在任务中添加require 'database_cleaner',这会引发错误no such file to load -- database_cleanergem 'database_cleaner',从而引发错误database_cleaner is not part of the bundle. Add it to Gemfile.

有没有办法解决这个问题而不将gem 'database_cleaner'添加到rails项目的Gemspec中?

由于

更新(添加源代码的链接): https://github.com/jordinl/dummy_tasks

1 个答案:

答案 0 :(得分:3)

以下是我的工作:

https://github.com/johnmcaliley/dummy_tasks/commits/master

tasks.rake

require 'database_cleaner'
require 'dummy_tasks'

namespace :db do
  task :dummy => :environment do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.clean                                             
    Rake::Task['db:seed'].invoke    
  end
end

可能有更优雅的方法来做到这一点,但这至少可以防止你必须将database_cleaner gem添加到应用程序Gemfile

相关问题