我知道Rake任务可以在Ruby gem的许多地方定义:
- 在Rakefile中 - 在 tasks/*.rake 中 - 在 lib/tasks/*.rake 中
当任务要在gem本身上执行时,应使用前两个选项。当希望公开任务时,应选择第三个选项。
有许多在线教程演示了从一个gem中使用Rails加载Rake任务的各种方法,即利用 Rails::RailTie。
然而,我想找到一种在不需要Rails的情况下在另一个gem中使用依赖gem的任务的方法。
这是否有一个简单的解决方案?是否有人能够描述正确的方法,或者概述哪些方法是可行的?
更新:
我尝试创建一个文件 bin/my-gem,以便在系统上可用于执行 my-gem 的 Rake 任务。我在其中放置了以下内容;
- 在Rakefile中 - 在 tasks/*.rake 中 - 在 lib/tasks/*.rake 中
当任务要在gem本身上执行时,应使用前两个选项。当希望公开任务时,应选择第三个选项。
有许多在线教程演示了从一个gem中使用Rails加载Rake任务的各种方法,即利用 Rails::RailTie。
然而,我想找到一种在不需要Rails的情况下在另一个gem中使用依赖gem的任务的方法。
这是否有一个简单的解决方案?是否有人能够描述正确的方法,或者概述哪些方法是可行的?
更新:
我尝试创建一个文件 bin/my-gem,以便在系统上可用于执行 my-gem 的 Rake 任务。我在其中放置了以下内容;
#!/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
这篇文章的部分内容基于这篇 Stack Overflow 帖子。
不幸的是,我做错了什么。在安装完 gem 后,运行 my-gem mytask
,并在 lib/test.rake
中定义了 mytask
,然后输出以下结果:
/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
rake gem::task[args]
风格的执行方法。 - KomodoDave