22

Rake タスクは、Ruby gem 内のさまざまな場所で定義できることを認識しています。

  • Rakefile 内
  • 中身tasks/*.rake
  • 中身lib/tasks/*.rake

gem 自体でタスクを実行する場合は、最初の 2 つを使用する必要があることを読みました。タスクを公開したい場合は、3 番目のオプションを選択する必要があるようです。

Rails を使用して gem から Rake タスクをロードするさまざまな方法、つまりRails::RailTie.

ただし、Rails を必要とせずに別の gem 内で依存性 gem のタスクを使用する方法を見つけたいと思います。

これに対する簡単な解決策はありますか?誰かが適切なアプローチを説明したり、実行可能なアプローチを概説したりするのに十分親切でしょうか?

アップデート

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 投稿に基づいています。

悲しいことに、gem をインストールして定義済みで実行my-gem mytaskすると、次のように出力されるため、何か間違ったことをしています。mytasklib/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
4

2 に答える 2

14

ここでソリューションの本体を見つけました。引数付きのタスクの指定をサポートするように変更し、 のサポートを追加しましたcucumber

そう..

gem 内で作成するbin/my_gem

この投稿の下部にあるスクリプトを貼り付けます。使用例についてはコメントを参照してください。

タスクrakeRakefile.

または、タスクを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

ビンゴ!:-)

于 2012-12-13T12:43:43.910 に答える
2

この投稿は私にいくつかのヒントを与えてくれましたが、おそらくこれにぶつかった他の人にとっては、いくつかの依存関係の問題に苦労しました. 最後に、rakefile を必要とせずに bin/binstub を使用してこれを行う方法を考え出しました。 私の解決策は別のSOの質問に投稿されています。

于 2013-08-22T00:01:45.773 に答える