【发布时间】:2012-12-01 06:18:52
【问题描述】:
我知道 Rake 任务可以在 Ruby gem 中的许多地方定义:
- 在 Rakefile 中
- 内
tasks/*.rake - 内
lib/tasks/*.rake
我已经读过,当要在 gem 本身上执行任务时,应该使用前两个。当需要公开任务时,似乎应该选择第三个选项。
有许多在线教程演示了使用 Rails 从 gem 加载 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
部分内容基于this SO post。
遗憾的是,我做错了,因为在安装 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
【问题讨论】:
-
感谢您的链接,但这是用于执行 ruby 脚本而不是 Rake 任务。它也不会为带有参数的 rake 任务提供支持。我希望能找到一个明确的
rake gem::task[args]风格的执行方法。
标签: ruby-on-rails ruby rake task