427

グローバル変数 に従って、プロジェクトを 2 つの方法でコンパイルする Rakefile があり$build_typeます。:debug:release

task :build => [:some_other_tasks] do
end

次のような、両方の構成でプロジェクトを順番にコンパイルするタスクを作成したいと思います。

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    # call task :build with all the tasks it depends on (?)
  end
end

タスクをメソッドのように呼び出す方法はありますか? または、どうすれば同様のことを達成できますか?

4

7 に答える 7

656

タスクがメソッドとして動作する必要がある場合は、実際のメソッドを使用するのはどうですか?

task :build => [:some_other_tasks] do
  build
end

task :build_all do
  [:debug, :release].each { |t| build t }
end

def build(type = :debug)
  # ...
end

のイディオムに固執したい場合はrake、過去の回答からコンパイルされた可能性があります。

  • これは常にタスクを実行しますが、その依存関係は実行しません:

    Rake::Task["build"].execute
    
  • これは依存関係を実行しますが、まだ呼び出されていない場合にのみタスクを実行します。

    Rake::Task["build"].invoke
    
  • これにより、最初にタスクの already_invoked 状態がリセットされ、タスクの再実行、依存関係、およびすべてが可能になります。

    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
    
  • すでに呼び出されている依存関係は、再度有効にしない限り、自動的に再実行されないことに注意してください。Rake >= 10.3.2 では、以下を使用してそれらを再度有効にすることもできます。

    Rake::Task["build"].all_prerequisite_tasks.each(&:reenable)
    
于 2009-08-17T20:05:41.667 に答える
127

例えば:

Rake::Task["db:migrate"].invoke
于 2009-02-23T15:37:15.643 に答える
61
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end

それはあなたを整理するはずです、私自身も同じことが必要でした。

于 2009-04-29T12:35:15.900 に答える
17
task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end
于 2018-09-09T20:39:30.607 に答える
12
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end
于 2009-02-23T15:34:56.680 に答える
4

障害に関係なく各タスクを実行する場合は、次のように実行できます。

task :build_all do
  [:debug, :release].each do |t| 
    ts = 0
    begin  
      Rake::Task["build"].invoke(t)
    rescue
      ts = 1
      next
    ensure
      Rake::Task["build"].reenable # If you need to reenable
    end
    return ts # Return exit code 1 if any failed, 0 if all success
  end
end
于 2013-02-07T17:35:16.793 に答える
-1

プロジェクトが実際にコンパイルされてファイルになるものである場合は、一般的なデバッグ タスクとリリース タスクを作成しないことをお勧めします。あなたが述べているように、あなたの例では非常に実行可能なファイルタスクを使用する必要があります。出力は別のディレクトリに送られます。プロジェクトが test.c ファイルを out/debug/test.out と out/release/test.out に gcc でコンパイルするだけだとすると、次のようにプロジェクトをセットアップできます。

WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
  File.join('out', way)
end
def out_file(way)
  File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
  desc "create output directory for #{way}"
  directory out_dir(way)

  desc "build in the #{way}-way"
  file out_file(way) => [out_dir(way), 'test.c'] do |t|
    sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
  end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}

task :default => [:all]

このセットアップは次のように使用できます。

rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)

これは、要求されたとおりにもう少し機能しますが、私のポイントを示しています。

  1. 必要に応じて、出力ディレクトリが作成されます。
  2. ファイルは必要な場合にのみ再コンパイルされます (この例は、最も単純な test.c ファイルに対してのみ正しいものです)。
  3. リリース ビルドまたはデバッグ ビルドをトリガーする場合は、すべてのタスクをすぐに実行できます。
  4. この例には、デバッグ ビルドとリリース ビルドの小さな違いも定義する方法が含まれています。
  5. グローバル変数でパラメーター化されたビルドタスクを再度有効にする必要はありません。これは、異なるビルドが異なるタスクを持つようになったためです。ビルドタスクのコード再利用は、コードを再利用してビルドタスクを定義することによって行われます。ループが同じタスクを 2 回実行するのではなく、後でトリガーできるタスクを作成する方法を確認してください (すべてのタスクによって、または rake コマンドラインでそれらの 1 つを選択することによって)。
于 2014-09-11T22:51:15.643 に答える