[ruby] 레이크 작업에 명령 행 인수를 전달하는 방법

여러 데이터베이스에 값을 삽입 해야하는 레이크 작업이 있습니다.

이 값을 명령 행 또는 다른 레이크 작업 에서 레이크 작업으로 전달하고 싶습니다 .

어떻게해야합니까?



답변

옵션과 종속성은 배열 안에 있어야합니다.

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 내부를 알거나 관리하지 않는 한 크게 도움이되지 않습니다.

레일 노트 :

레일에서 작업을 실행하는 경우 종속 작업 => [:environment]을 설정하는 방법을 추가하여 환경을 미리로드하는 것이 가장 좋습니다 .

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


답변

작업 호출에 기호 인수를 추가하여 형식적인 인수를 레이크로 지정할 수 있습니다. 예를 들면 다음과 같습니다.

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

그런 다음 명령 행에서

> 레이크 my_task [1, 거짓]
Arke : 클래스 Rake :: TaskArguments의 {: arg1 => "1", : arg2 => "false"}
arg1은 다음과 같습니다 : String 클래스의 '1'
arg2는 다음과 같습니다 : String 클래스의 'false'

> "my_task [1, 2]"갈퀴
인수는 {: arg1 => "1", : arg2 => "2"}입니다.

> invoke_my_task 레이크
인수는 {: arg1 => "1", : arg2 => "2"}입니다.

> invoke_my_task_2 갈퀴
인수 : {: arg1 => 3, : arg2 => 4}

> with_prerequisite [5,6] 갈퀴
인수는 {: arg1 => "5", : arg2 => "6"}입니다.

> 레이크 with_defaults
기본값이있는 Args는 {: arg1 => : default_1, : arg2 => : default_2}입니다.

> with_defaults [ 'x', 'y'] 갈퀴
기본값이있는 Args는 {: arg1 => "x", : arg2 => "y"}입니다.

두 번째 예에서 설명했듯이 공백을 사용하려면 셸에서 공백을 인수로 나누지 않도록 대상 이름을 따옴표로 묶어야합니다.

rake.rb 의 코드를 보면 rake가 작업 문자열을 구문 분석하여 전제 조건의 인수를 추출하지 않으므로 수행 할 수없는 것으로 보입니다 task :t1 => "dep[1,2]". 전제 조건에 대해 다른 인수를 지정하는 유일한 방법은 :invoke_my_task및 에서 와 같이 종속 태스크 조치 내에서 명시 적으로 호출하는 것 :invoke_my_task_2입니다.

zsh와 같은 일부 쉘에서는 대괄호를 이스케이프해야합니다. rake my_task\['arg1'\]


답변

kch의 답변 외에도 (나는 그것에 의견을 남기는 방법을 찾지 못했습니다, 죄송합니다) :

명령 ENV전에 변수를 변수 로 지정할 필요가 없습니다 rake. 다음과 같이 일반적인 명령 줄 매개 변수로 설정할 수 있습니다.

rake mytask var=foo

다음과 같은 레이크 파일에서 ENV 변수로 액세스하십시오.

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


답변

명명 된 인수 (예 : standard OptionParser) 를 전달 하려면 다음과 같이 사용할 수 있습니다.

$ rake user:create -- --user test@example.com --pass 123

주의 --표준 레이크 인수를 우회 필요하다고. Rake 0.9.x , <= 10.3.x 와 함께 작동해야합니다 .

최신 레이크는의 구문 분석을 변경했으며 --이제는 OptionParser#parse메소드에 전달되지 않아야 합니다 (예 :parser.parse!(ARGV[2..-1])

require 'rake'
require 'optparse'
# Rake task for creating an account

namespace :user do |args|
  desc 'Creates user account with given credentials: rake user:create'
  # environment is required to have access to Rails models
  task :create do
    options = {}
    OptionParser.new(args) do |opts|
      opts.banner = "Usage: rake user:create [options]"
      opts.on("-u", "--user {username}","User's email address", String) do |user|
        options[:user] = user
      end
      opts.on("-p", "--pass {password}","User's password", String) do |pass|
        options[:pass] = pass
      end
    end.parse!

    puts "creating user account..."
    u = Hash.new
    u[:email] = options[:user]
    u[:password] = options[:pass]
    # with some DB layer like ActiveRecord:
    # user = User.new(u); user.save!
    puts "user: " + u.to_s
    puts "account created."
    exit 0
  end
end

exit 마지막에 추가 인수가 레이크 작업으로 해석되지 않도록합니다.

또한 인수 바로 가기가 작동해야합니다.

 rake user:create -- -u test@example.com -p 123

레이크 스크립트가 다음과 같이 보일 때, 즉시 사용할 수있는 다른 도구를 찾아야 할 때가 있습니다.


답변

Net ManiacAimred라는 두 웹 사이트에서 답을 찾았 습니다 .

이 기술을 사용하려면 레이크> 0.8 이상의 버전이 있어야합니다.

일반적인 레이크 작업 설명은 다음과 같습니다.

desc 'Task Description'
task :task_name => [:depends_on_taskA, :depends_on_taskB] do
  #interesting things
end

인수를 전달하려면 다음 세 가지를 수행하십시오.

  1. 작업 이름 뒤에 인수 이름을 쉼표로 구분하여 추가하십시오.
  2. : needs => […]를 사용하여 종속성을 끝에 넣으십시오.
  3. 장소 | t, args | 할 후. (t는이 작업의 대상입니다)

스크립트에서 인수에 액세스하려면 args.arg_name을 사용하십시오.

desc 'Takes arguments task'
task :task_name, :display_value, :display_times, :needs => [:depends_on_taskA, :depends_on_taskB] do |t, args|
  args.display_times.to_i.times do
    puts args.display_value
  end
end

명령 행에서이 태스크를 호출하려면 [] s의 인수를 전달하십시오.

rake task_name['Hello',4]

출력합니다

Hello
Hello
Hello
Hello

다른 작업 에서이 작업을 호출하고 인수를 전달하려면 invoke를 사용하십시오.

task :caller do
  puts 'In Caller'
  Rake::Task[:task_name].invoke('hi',2)
end

그런 다음 명령

rake caller

출력합니다

In Caller
hi
hi

다음 코드가 깨짐에 따라 종속성의 일부로 인수를 전달하는 방법을 찾지 못했습니다.

task :caller => :task_name['hi',2]' do
   puts 'In Caller'
end


답변

일반적으로 사용되는 다른 옵션은 환경 변수를 전달하는 것입니다. 코드에서을 통해 읽고 ENV['VAR'], rake명령 바로 앞에 전달할 수 있습니다.

$ VAR=foo rake mytask


답변

실제로 @Nick Desjardins는 완벽하게 대답했습니다. 그러나 교육을 위해서만 : 당신은 더러운 접근법을 사용할 수 있습니다 : ENV인수 사용

task :my_task do
  myvar = ENV['myvar']
  puts "myvar: #{myvar}"
end

rake my_task myvar=10
#=> myvar: 10