代码之家  ›  专栏  ›  技术社区  ›  Will

如何通过Rails中的环境将参数传递到Rake任务中?[副本]

  •  199
  • Will  · 技术社区  · 15 年前

    我可以传递如下论点:

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

    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
    

    但这不是一个有效的任务调用。有人知道我怎样才能做到这一点吗?

    5 回复  |  直到 7 年前
        1
  •  395
  •   Joze inger    9 年前

    只是为了跟进这个老话题;以下是我认为现在的Rakefile(很久以前)应该在那里做的事情。这是当前获奖答案(hgimenez)的升级版和错误修复版:

    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]" 
    

    注意:参数的数量没有被检查,因此奇数行星被忽略:)

        2
  •  120
  •   Joshua Pinter    7 年前

    太长,读不下去了

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

    原始答案

    当您将参数传递给rake任务时,您可以使用:needs选项要求环境。例如:

    
    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
    

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

    请使用

    任务:t,[args]=>[副署长]
    
        3
  •  60
  •   mikezter    15 年前

    为了完整起见,下面是 docs

       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
    • 先决条件不需要是 排列 .
    • args Rake::TaskArguments .
    • t 是一个例子 Rake::Task
        4
  •  21
  •   Dogweather    10 年前

    另一种方法是:使用OS环境变量。这种方法的好处:

    • 所有依赖的rake任务都会获得这些选项。
    • 语法要简单得多,不依赖于rakedsl,后者很难理解,并且随着时间的推移会发生变化。

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

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

    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 任务确实依赖于其他人,他们也可以访问这些选项。但使用普通的rake期权方法,他们不会这么做。

        5
  •  12
  •   Lonny Eachus    8 年前

    虽然这些解决方案可行,但我认为这过于复杂。

    我建议使用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"]
    

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