ruby – 如何将命令行参数传递给rake任务

我有一个需要将值插入多个数据库的rake任务。

我想通过命令行或其他 rake任务将此值传递给rake任务。

我怎样才能做到这一点?


选项和依赖关系需要在数组内部:

namespace :thing do
  desc "it does a thing"
  task :work, [:option, :foo, :bar] do |task, args|
    puts "work", args
  end

  task :another, [:option, :foo, :bar] do |task, args|
    puts "another #{args}"
    Rake::Task["thing:work"].invoke(args[:option], args[:foo], args[:bar])
    # or splat the args
    # Rake::Task["thing:work"].invoke(*args)
  end

end

然后

rake thing:work[1,2,3]
=> work: {:option=>"1", :foo=>"2", :bar=>"3"}

rake thing:another[1,2,3]
=> another {:option=>"1", :foo=>"2", :bar=>"3"}
=> work: {:option=>"1", :foo=>"2", :bar=>"3"}

注意:变量task是任务对象,除非你知道/关心Rake内部,否则不是很有用。

铁轨注意:

如果从rails运行任务,则最好通过添加=> [:environment]这种方法预先加载环境,这是设置依赖任务的一种方式。

  task :work, [:option, :foo, :bar] => [:environment] do |task, args|
    puts "work", args
  end

您可以通过向任务调用添加符号参数来指定rake中的形式参数。例如:

require 'rake'

task :my_task, [:arg1, :arg2] do |t, args|
  puts "Args were: #{args}"
end

task :invoke_my_task do
  Rake.application.invoke_task("my_task[1, 2]")
end

# or if you prefer this syntax...
task :invoke_my_task_2 do
  Rake::Task[:my_task].invoke(3, 4)
end

# a task with prerequisites passes its 
# arguments to it prerequisites
task :with_prerequisite, [:arg1, :arg2] => :my_task #<- name of prerequisite task

# to specify default values, 
# we take advantage of args being a Rake::TaskArguments object
task :with_defaults, :arg1, :arg2 do |t, args|
  args.with_defaults(:arg1 => :default_1, :arg2 => :default_2)
  puts "Args with defaults were: #{args}"
end

然后,从命令行:

> rake my_task [1,2]
参数是:{:arg1 =>“1”,:arg2 =>“2”}

>耙“my_task [1,2]”
参数是:{:arg1 =>“1”,:arg2 =>“2”}

> rake invoke_my_task
参数是:{:arg1 =>“1”,:arg2 =>“2”}

> rake invoke_my_task_2
参数是:{:arg1 => 3,:arg2 => 4}

> rake with_prerequisite [5,6]
参数是:{:arg1 =>“5”,:arg2 =>“6”}

> rake with_defaults
默认值为:{:arg1 =>:default_1,:arg2 =>:default_2}

> rake with_defaults ['x','y']
默认值为:{:arg1 =>“x”,:arg2 =>“y”}

如第二个例子所示,如果要使用空格,则目标名称周围的引号是必要的,以防止shell将空间中的参数分开。

看看rake.rb中的代码,看起来rake不会解析任务字符串来为先决条件提取参数,所以你不能这样做task :t1 => "dep[1,2]"。为先决条件指定不同参数的唯一方法是在依赖任务操作中显式调用它,如在:invoke_my_task和中:invoke_my_task_2

请注意,某些shell(如zsh)需要您转义括号: rake my_task\['arg1'\]


除了由kch回答(我没有找到如何发表评论,对不起):

您不必ENVrake命令之前将变量指定为变量。你可以像通常那样将它们设置为命令行参数:

rake mytask var=foo

并从你的rake文件中以ENV变量的形式访问它们:

p ENV['var'] # => "foo"

添加评论

友情链接:蝴蝶教程