Rakeの名前空間のデフォルトタスク


87

次のようなものが与えられた:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

  task :all => [:foo, :bar]
end

どのようにし:allてデフォルトのタスクにして、実行rake my_tasksすることでそれを呼び出すことができrake my_tasks:allますか?


名前空間にデフォルトを設定してみましたか(タスク:default =>:all)
Jim Deville '16年

Jimが説明することを実行してください。デフォルトのタスクのみが名前空間の外に出て、名前空間とタスク名を含める必要があります。(task:default => "my_tasks:all")実際の例については、以下の私の回答を参照してください。
Randy Eppinger 2013年

回答:


86

次のように名前空間の外側に配置します。

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

end

task :all => ["my_tasks:foo", "my_tasks:bar"]

また...タスクに引数が必要な場合:

namespace :my_tasks do
  task :foo, :arg1, :arg2 do |t, args|
    do_something
  end

  task :bar, :arg1, :arg2  do |t, args|
    do_something_else
  end

end

task :my_tasks, :arg1, :arg2 do |t, args|
  Rake::Task["my_tasks:foo"].invoke( args.arg1, args.arg2 )
  Rake::Task["my_tasks:bar"].invoke( args.arg1, args.arg2 )
end

2番目の例では、タスクに名前空間と同じ名前、つまり「my_tasks」を呼び出す方法に注意してください。


4
これは、として呼び出されるようにするだけrake allです。この場合、私は他の名前空間を持っているので、タスクをmy_tasks:allとしてrake my_tasksではなくとして呼び出すことができるようにしたいのですrake all
Helder S Ribeiro、

53
したがって、次のように使用します:task:my_tasks => ["my_tasks:foo"、 "my_tasks:bar"]
SzymonLipiński

2
サイモンのコメントに賛成票を投じたが、これが私のやり方であることを忘れていた。
ジムデビル

51

あまり直感的ではありませんが、同じ名前の名前空間とタスクを使用でき、それによって事実上、必要なものが得られます。例えば

namespace :my_task do
  task :foo do
    do_foo
  end
  task :bar do
    do_bar
  end
end

task :my_task do
  Rake::Task['my_task:foo'].invoke
  Rake::Task['my_task:bar'].invoke
end

これで、次のようなコマンドを実行できます。

rake my_task:foo

そして

rake my_task

3
これはすばらしいことであり、質問で述べられているすべての要件をカバーしています。
Ivar 2014年

1
:私は、呼び出しが過度に複雑になっていると思うと、それだけで、タスクの依存関係でなければなりませんtask :my_task => ['my_task:foo', 'my_task:bar']
アレクサンダーPresber

8

名前空間に多くのタスクがある場合は、これを使用することをお勧めします。

task :my_tasks do
  Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end

そして、あなたは名前空間ですべてのタスクを実行することができます:

rake my_tasks

これにより、その名前空間に新しいタスクを追加するときに:allタスクを変更することを心配する必要はありません。


3

私はこのRakefileをキュウリに使用します:

require 'cucumber'
require 'cucumber/rake/task'

namespace :features do
  Cucumber::Rake::Task.new(:fast) do |t|
    t.profile = 'fast'
  end

  Cucumber::Rake::Task.new(:slow) do |t|
    t.profile = 'slow'
  end

  task :ci => [:fast, :slow]
end

task :default => "features:ci"

それから私がちょうどタイプすると:

rake

デフォルトのタスクが実行され、高速テストと低速テストの両方が実行されます。

これCheezyのブログで学びました。


3

私がobvio171の質問を読んでいる方法は、彼が1)名前空間をタスクとして呼び出すことによって名前空間の特定のタスクを呼び出す体系的な方法を求めているということです。

私は同じニーズに頻繁に遭遇しました。タスクを名前空間に論理的にグループ化するのが好きです。多くの場合、そのグループは階層に似ています。したがって、グループを呼び出すという欲求は、私には非常に理にかなっています。

これが私の見解です。

module Rake::DSL
  def group(name, &block)
    ns = namespace name, &block
    default = ns[:default]
    task name => "#{name}:default" if default
    ns
  end
end

group :foo do
  task :foo1 do |t| puts t.name end
  task :foo2 do |t| puts t.name end
  task :default => [:foo1, :foo2]
end

task :default => :foo

1) ...または何年も前に尋ねていました。それでもなお興味深い質問です。


1

名前空間の外に次のタスクを追加します。

desc "Run all my tasks"
task :my_tasks => ["my_tasks:all"]

名前空間と同じ名前のタスクを作成できることに注意してください。

さらに大きな例として、名前空間をネストしている場合でも、名前空間と同じ名前のタスクをどのように利用できるかを示します。

namespace :job1 do
  task :do_something1 do
        puts "job1:do_something1"
    end

  task :do_something2 do
        puts "job1:do_something2"
    end
  task :all => [:do_something1, :do_something2]
end

desc "Job 1"
task :job1 => ["job1:all"]

# You do not need the "all"-task, but it might be handier to have one.
namespace :job2 do
  task :do_something1 do
        puts "job2:do_something1"
    end

  task :do_something2 do
        puts "job2:do_something2"
    end
end

desc "Job 2"
task :job2 => ["job2:do_something1", "job2:do_something2"]

namespace :superjob do
    namespace :job1 do
        task :do_something1 do
            puts "superjob:job1:do_something1"
        end

        task :do_something2 do
            puts "superjob:job1:do_something2"
        end
    end

    desc "Job 1 in Superjob"
    task :job1 => ["job1:do_something1", "job1:do_something2"]

    namespace :job2 do
        task :do_something1 do
            puts "superjob:job2:do_something1"
        end

        task :do_something2 do
            puts "superjob:job2:do_something2"
        end
    end

    desc "Job 2 in Superjob"
    task :job2 => ["job2:do_something1", "job2:do_something2"]
end

desc "My Super Job"
task :superjob => ["superjob:job1", "superjob:job2"]

# Do them all just by calling "$ rake"
task :default => [:job1, :job2, :superjob]

コピーして試してみてください。



0

SzymonLipińskiの回答とShyam Habarakadaの回答を組み合わせると、最も慣用的で簡潔な回答は次のとおりです。

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

end

task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]

rake my_tasksサブタスクの面倒な呼び出しを回避しながら実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.