gpt4 book ai didi

ruby-on-rails - Ruby:在没有 Rails 的情况下从 gem 访问 rake 任务

转载 作者:数据小太阳 更新时间:2023-10-29 06:30:20 25 4
gpt4 key购买 nike

我知道 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 mytasklib/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

最佳答案

我找到了解决方案的主体 here .我修改了它以支持带参数的任务规范,并添加了对 cucumber 的支持。

所以..

在你的 gem 中创建 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

宾果游戏! :-)

关于ruby-on-rails - Ruby:在没有 Rails 的情况下从 gem 访问 rake 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13858495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com