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

标签 ruby command-line rake command-line-arguments

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

我想从命令行或从另一个 rake 任务将这个值传递到 rake 任务。

我该怎么做?

最佳答案

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

require 'rake'

task :my_task, [:arg1, :arg2] do |t, args|
  puts "Args were: #{args} of class #{args.class}"
  puts "arg1 was: '#{args[:arg1]}' of class #{args[:arg1].class}"
  puts "arg2 was: '#{args[:arg2]}' of class #{args[:arg2].class}"
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,false]
Args were: {:arg1=>"1", :arg2=>"false"} of class Rake::TaskArguments
arg1 was: '1' of class String
arg2 was: 'false' of class String

> rake "my_task[1, 2]"
Args were: {:arg1=>"1", :arg2=>"2"}

> rake invoke_my_task
Args were: {:arg1=>"1", :arg2=>"2"}

> rake invoke_my_task_2
Args were: {:arg1=>3, :arg2=>4}

> rake with_prerequisite[5,6]
Args were: {:arg1=>"5", :arg2=>"6"}

> rake with_defaults
Args with defaults were: {:arg1=>:default_1, :arg2=>:default_2}

> rake with_defaults['x','y']
Args with defaults were: {: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'\]

关于ruby - 如何将命令行参数传递给 rake 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825748/

相关文章:

ruby - ruby 中的 callcc 导致无限循环?

docker - 将命令从 docker 容器公开到主 shell

ruby-on-rails - 如何在rails中为rake任务编写单元测试用例?

ruby-on-rails - Rake 未初始化常量 RDoc::RDoc

ruby-on-rails - Rails 一个有 2 个返回值的方法 - 如何获得它们?

ruby - 未初始化的常量 Twitter (NameError)

ruby - ~/在 Ruby 中指向哪里?

batch-file - WinSCP "Too many parameters for command ' 打开'。”错误

command-line - 使用 DOS 命令替换字符串中的一个字符

ruby-on-rails - 不了解 Bundler 与 Gems 的交互