如何传递参数与环境在Rails Rake任务? [重复] 如何传递参数与环境在Rails Rak

2019-05-12 15:49发布

这个问题已经在这里有一个答案:

  • 如何通过命令行参数rake任务 18个回答

我能够在参数传递,如下所示:

desc "Testing args"
task: :hello, :user, :message do |t, args|
  args.with_defaults(:message => "Thanks for logging on")
  puts "Hello #{args[:user]}. #{:message}"
end

我还能够加载当前环境的Rails应用程序

desc "Testing environment"
task: :hello => :environment do 
  puts "Hello #{User.first.name}."
end

我想要做的是能有变量和环境

desc "Testing environment and variables"
task: :hello => :environment, :message do |t, args|
  args.with_defaults(:message => "Thanks for logging on")
  puts "Hello #{User.first.name}. #{:message}"
end

但是,这并不是一个有效的任务调用。 有谁知道我能做到这一点?

Answer 1:

TLDR;

task :t, [args] => [deps] 

原来的答案

当您在参数传递给耙任务,您可以要求使用环境:需要选择。 例如:


desc "Testing environment and variables"
task :hello, :message, :needs => :environment do |t, args|
  args.with_defaults(:message => "Thanks for logging on")
  puts "Hello #{User.first.name}. #{args.message}"
end

每更新@如下Peiniau的评论

至于滑轨> 3.1

task :t, arg, :needs => [deps] # deprecated

请用

task :t, [args] => [deps] 


Answer 2:

只是为了跟进这个老话题; 这里就是我认为当前的Rake文件(因为很久以前)应该做在那里。 这是当期中奖答案(hgimenez)的升级和bugfixed版本:

desc "Testing environment and variables"
task :hello, [:message]  => :environment  do |t, args|
  args.with_defaults(:message => "Thanks for logging on")
  puts "Hello #{User.first.name}. #{args.message}"   # Q&A above had a typo here : #{:message}
end

这是你如何调用它( http://guides.rubyonrails.org/v4.2/command_line.html#rake ):

  rake "hello[World]" 

对于多个参数,只需添加任务声明(数组中的关键字task :hello, [:a,:b,:c]... ),并通过他们逗号分隔:

  rake "hello[Earth,Mars,Sun,Pluto]" 

注:未选中的参数个数,所以奇星球留下了:)



Answer 3:

只是为了完整性,这里从例子文档上面提到的:

   task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
     args.with_defaults(:first_name => "John", :last_name => "Dough")
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

笔记:

  • 您可以省略#with_defaults通话,效果显着。
  • 你必须使用一个Array为你的论点,哪怕只有一个。
  • 先决条件不需要是一个Array
  • args是实例Rake::TaskArguments
  • t是实例Rake::Task


Answer 4:

另一种方式去这样的:使用操作系统环境变量。 这种方法的优点:

  • 所有的从属耙任务获得的选项。
  • 语法是简单了很多,不依赖于耙DSL这是很难搞清楚,并随时间的变化。

我有这需要三个命令行选项的rake任务。 以下是我调用它:

$ rake eaternet:import country=us region=or agency=multco

这是非常干净,简单,只是bash的语法,这是我喜欢的。 这是我的rake任务。 也很干净,没有魔法:

task import: [:environment] do
  agency = agency_to_import
  puts "Importing data for #{agency}..."
  agency.import_businesses
end

def agency_to_import
  country_code = ENV['country'] or raise "No country specified"
  region_slug  = ENV['region']  or raise "No region specified"
  agency_slug  = ENV['agency']  or raise "No agency specified"
  Agency.from_slugs(country_code, region_slug, agency_slug)
end

这个特殊的例子不显示使用依赖。 但是,如果:import任务,并依赖于他人,他们也不得不访问这些选项。 但是,使用正常方法耙选项,他们不会。



Answer 5:

虽然这些解决方案的工作,在我看来,这是过于复杂。

另外,如果你在的zsh这样做,你会如果你的数组中的括号不转义得到错误“\”。

我建议使用argv数组,其做工精细,要简单得多,而且不容易出错。 例如:

namespace :my_example do
  desc "Something"
  task :my_task => :environment do
    puts ARGV.inspect
  end
end

然后

rake my_example:my_task 1 2 3

#=>  ["my_example:my_task", "1", "2", "3"]

你需要记住的唯一的事情就是ARGV [0]是进程名称,所以只使用ARGV [1 ..- 1]。

我认识到,严格的说这不回答这个问题,因为它不使用的:环境作为解决方案的一部分。 但OP没有说明为什么他认为包括规定所以它仍然可能适用于他的用例。



文章来源: How to pass arguments into a Rake task with environment in Rails? [duplicate]