红宝石:从没有Rails的宝石访问rake任务(Ruby: Accessing rake task

2019-07-05 03:57发布

我知道,Rake任务可以在许多的红宝石宝石的其他地方定义:

  • 一个Rake文件内
  • 里面tasks/*.rake
  • 里面lib/tasks/*.rake

我读过,当任务是要在创业板本身执行的前两个应该被使用。 看来当任务需要的是可公开获得的第三个选项应选择。

有许多在线教程演示了多种方法使用Rails,即利用来加载从宝石Rake任务Rails::RailTie

不过,我想找到使用其他宝石中的宝石依赖的任务,而不需要导轨的一种方式。

有一个简单的解决方案呢? 会有人好心地描述适当的方法,或轮廓会是可行的办法是什么?

UPDATE

我试图创建一个文件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

有些内容是基于该SO岗位 。

可悲的是我,因为在安装宝石,然后运行做错了my-gem mytaskmytask中定义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

Answer 1:

我找到了解决办法的身体在这里 。 我已经修改了它支持任务的规格与参数,并增加了支持cucumber

所以..

在你的宝石打造bin/my_gem

这个帖子到它的底部粘贴的脚本。 见例如使用意见。

rake任务必须在你Rakefile

另外,例如添加到您的任务lib/tasks/*.rake然后添加以下到您的Rakefile

Dir.glob('lib/tasks/*.rake').each {|r| import r}

这里的秘诀:

#!/usr/bin/env ruby

# Run rake tasks and cucumber features
# from my_gem once it's installed.
#
# Example:
#
#   my_gem rake some-task
#   my_gem rake some-task[args]
#   my_gem cucumber feature1 feature2
#
# Note: cucumber features have '.feature' appended automatically,
#       no need for you to do it ;)
#
# Author:: N David Brown
gem_dir = File.expand_path("..",File.dirname(__FILE__))
$LOAD_PATH.unshift gem_dir# Look in gem directory for resources first.
exec_type = ARGV[0]
if exec_type == 'rake' then
    require 'rake'
    require 'pp'
    pwd=Dir.pwd
    Dir.chdir(gem_dir) # We'll load rakefile from the gem's dir.
    Rake.application.init
    Rake.application.load_rakefile
    Dir.chdir(pwd) # Revert to original pwd for any path args passed to task.
    Rake.application.invoke_task(ARGV[1])
elsif exec_type == 'cucumber' then
    require 'cucumber'
    features = ARGV[1,].map{|feature| "#{gem_dir}/features/#{feature}.feature"}.join(' ')
    runtime = Cucumber::Runtime.new 
    runtime.load_programming_language('rb') 
    pwd=Dir.pwd
    Dir.chdir(gem_dir) # We'll load features from the gem's dir.
    Cucumber::Cli::Main.new([features]).execute!(runtime)
    Dir.chdir(pwd) # Revert to original pwd for convenience.
end

答对了! :-)



Answer 2:

这篇文章给了我一些暗示,但也许其他人碰到这个问题,我有一些依赖性问题挣扎。 我终于摸索出如何与垃圾箱/ binstub和无需Rake文件做到这一点。 我的解决方案张贴在另一个SO问题。



文章来源: Ruby: Accessing rake task from a gem without Rails