我知道Rake任务可以在Ruby gem中的许多地方定义:
tasks/*.rakelib/tasks/*.rake我已经读过,当要在gem本身执行任务时,应该使用前两个.当希望公开任务时,似乎应该选择第三种选择.
网上有很多教程演示了使用Rails从gem加载Rake任务的各种方法,即利用Rails::RailTie.
但是,我想找到一种在不需要Rails的情况下在另一个gem中使用依赖gem的任务的方法.
有一个简单的解决方案吗?有人会善意地描述正确的方法,或概述哪些方法可行?
我已经尝试创建一个文件bin/my-gem,以便在系统上用于执行Rake任务my-gem.我把以下内容放在里面;
#!/usr/bin/env ruby
require 'rubygems'
require 'rake'
task=ARGV[0]
spec = Gem::Specification.find_by_name('dsi_core')
Dir["#{spec.gem_dir}/lib/tasks/*.rake"].each {|file| puts file and Rake::load_rakefile(file)}
Rake::Task.clear # Avoid tasks being loaded several times in dev mode
Rake::Task[task].reenable # Support re-execution of a task.
Rake::Task[task].invoke
Run Code Online (Sandbox Code Playgroud)
部分内容基于此SO帖子.
可悲的是我,因为在安装宝石,然后运行做错事my-gem mytask与mytask定义lib/test.rake再下面是输出:
/var/lib/gems/1.8/gems/rake-0.9.2/lib/rake/task_manager.rb:49:in `[]': Don't know how to build task 'mytest' (RuntimeError)
from /var/lib/gems/1.8/gems/rake-0.9.2/lib/rake/task.rb:298:in `[]'
from /var/lib/gems/1.8/gems/my_gem-0.0.1/bin/my_gem:8 …Run Code Online (Sandbox Code Playgroud) 如果我以通常的方式指向gem,将它安装在我的环境中
gem 'activerecord_datawarehouse'
Run Code Online (Sandbox Code Playgroud)
rake -T不显示我的rake任务,但如果我直接指向gem源代码,就像
gem 'activerecord_datawarehouse', :path => "/home/acras/code/activerecord_datawarehouse"
Run Code Online (Sandbox Code Playgroud)
它显示和rake任务完美地工作.
我在这里可以缺少什么?我做了双重检查,安装的gem与我在源代码中的相同.