在gem的rake任务中需要gem

jor*_*inl 6 ruby ruby-on-rails bundler ruby-on-rails-3

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

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

gem 'database_cleaner'
Run Code Online (Sandbox Code Playgroud)

并在Rakefile中

Jeweler::Tasks.new do |gem|
  ...
  gem.add_dependency 'database_cleaner'
end
Run Code Online (Sandbox Code Playgroud)

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

module MyGem
  class Railtie < Rails::Railtie
    rake_tasks do
      load 'tasks.rake'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

和tasks.rake:

task :my_task do
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)

我安装了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_cleaner并gem '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

joh*_*ley 3

这是我为使其发挥作用所做的工作:

任务.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
Run Code Online (Sandbox Code Playgroud)

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

  • 现在链接是404。您能否详细说明一下:您在这里到底做了什么以及为什么? (2认同)