关于ruby:如何在Rake任务中运行Rake任务?

How to run Rake tasks from within Rake tasks?

我有一个rakefile,它以两种方式编译项目,根据全局变量$build_type,可以是:debug:release(结果放在单独的目录中):

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

我希望创建一个任务,用这两种配置依次编译项目,如下所示:

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

有没有一种方法可以像调用方法一样调用任务?或者我怎样才能实现类似的目标?


如果你需要对任务的行为的方法,一种使用目前的方法如何?

1
2
3
4
5
6
7
8
9
10
11
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的习语,这里是你的答案:从过去的可能性,编译

  • 这executes任务总是在运行,但它是不是它的限制:

    1
    Rake::Task["build"].execute
  • 这一executes的限制,但它的工作,如果只executes它已不是已经被。

    1
    Rake::Task["build"].invoke
  • 在这一resets任务已经被_’s状态的任务,让。再次被执行,和所有的限制:

    1
    2
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke

    (这是没有限制的通知已被重新执行)


例如:

1
Rake::Task["db:migrate"].invoke


1
2
3
4
5
6
7
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end

这就需要你要排序的东西出来,我自己。


1
2
3
4
5
6
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end


1
2
3
4
task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end


如果你想要每个任务运行的任何故障,无论什么样的,你可以:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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


我会suggest不是一般的调试任务的创建和释放的东西,如果真的把编译好的工程文件和操作系统的方法。你应该去与这是更可行的文件在您的工作的例子,你去你的国家,这是输出到不同的目录。说你只是在test.c文件到项目compiles 10 / 10 /调试/发行/ test.out test.out和你可以设置你的项目与GCC这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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]

安装程序可以使用这个类。

1
2
3
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)

这是不小的问题会更多,但我的重点:

  • 目录创建的输出是必要的。
  • 该文件是只读(如果需要重新编译这个例子仅仅是一个正确的test.c简(文件)。
  • 你有所有的任务在手,如果你想迅速触发释放或调试版本的版本。
  • 这个例子还包括确定方法之间的差异小到调试和发布版本。
  • 在需要reenable建造任务是parametrized与全局变量,因为现在有一个不同的版本,不同的任务。在codereuse建设任务的完成是通过使用定义的码本生成的任务。国有企业如何执行任务的不同回路的二次开发,但可以创建任务,触发后(无论是通过选择一个或所有的任务是在耙他们commandline)。