【问题标题】:Requiring a gem inside a gem's rake task在 gem 的 rake 任务中需要一个 gem
【发布时间】:2010-11-15 17:33:55
【问题描述】:

我正在使用jeweler 为Rails 3 创建一个gem。gem 包含一个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

【问题讨论】:

  • 你能从 gem 中发布 mygem.gemspec 并从空的 rails 应用程序中发布 Gemfile.lock 吗?
  • 嘿!我已将链接添加到 github 存储库。谢谢!

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


【解决方案1】:

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

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 中

【讨论】:

  • 链接现在是404。您能否详细说明一下:您在这里具体做了什么以及为什么?
  • 用Rails 6,方法一样吗?我已经尝试过您的建议,但对我不起作用;使用 Rails 6。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多