我知道 Rake 任务可以在 Ruby gem 中的许多地方定义:
- 在 Rakefile 中
- 里面
tasks/*.rake
- 里面
lib/tasks/*.rake
我已经读过,当要在 gem 本身上执行任务时,应该使用前两个。当希望公开任务时,似乎应该选择第三个选项。
有许多在线教程演示了使用 Rails 从 gem 加载 Rake 任务的各种方法,即利用Rails::RailTie
.
但是,我想找到一种在不需要 Rails 的情况下在另一个 gem 中使用依赖 gem 任务的方法。
有一个简单的解决方案吗?有人会善意地描述正确的方法,或概述哪些方法是可行的吗?
更新
我尝试创建一个文件bin/my-gem
以在系统上用于从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
部分内容基于此 SO 帖子。
可悲的是,我做错了什么,因为在安装 gem 然后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
from /usr/local/bin/my_gem:19:in `load'
from /usr/local/bin/my_gem:19