이 질문에는 이미 답변이 있습니다.
저는 다음과 같이 논증을 전달할 수 있습니다 :
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
그러나 이것은 유효한 작업 호출이 아닙니다. 아무도 내가 이것을 어떻게 달성 할 수 있는지 안다?
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
@ Peiniau 님의 댓글 당 업데이트 됨
Rails> 3.1에 관해서
task :t, arg, :needs => [deps] # deprecated
사용 해주세요
task :t, [args] => [deps]
:needs
이 방식은 : "해당 형식은 여전히 호환성을 위해 지원되지만 사용하는 것은 바람직하지 않습니다." (나는 미래의 브라우저들에 대해서만 언급한다.:needs
더 이상 지원되지 않습니다. 이 섹션은 & quot; 사용되지 않는 작업 매개 변수 형식 & quot;이라고합니다 ...) - Telemachustask :hello, [:message] => [:environment] do |t, args|
. - Jason Swetttask :hello, [:message1, :message2] => [:environment] do |t, args|
작품을 사용하고rake hello['message #1','message #2']
. 경고 : 인수 목록에 일반 텍스트가 포함 된 경우 레이크가 실패하는 것으로 나타났습니다 (예 :rake hello['message #1', 'message #2']
(쉼표 뒤에 공백을 적어 두십시오). - Steve Wilhelm
이 오래된 주제에 대해 후속 조치를 취하십시오. 여기 내가 현재의 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]"
참고 : 인수의 수는 확인되지 않으므로 이상한 행성은 빠져 있습니다. :)
rake 'webp:convert["hello", "world"]'
경고 : 나는 지금 이것을 시도하지 않았지만 효과가있다. - inger
완전성을 위해 여기에서워드 프로세서위에 언급했듯이:
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
.args.empty?
저에게 이상한 결과를주었습니다.args
해시처럼 보이지만Rake::TaskArguments
. 따라서 args가 전달되지 않을 때 특별한 동작을 원하면 call#to_hash
또는#to_s
다음을 확인하기 전에args
비었다. - Dennis
이것에 대한 다른 방법 : OS 환경 변수를 사용하십시오. 이 접근법의 이점 :
세 가지 명령 줄 옵션이 필요한 레이크 작업이 있습니다. 다음은 내가 호출하는 방법입니다.
$ 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
작업이 다른 작업에 의존했기 때문에 이러한 옵션에 액세스 할 수도있었습니다. 그러나 일반적인 레이크 옵션 방법을 사용하면 그렇지 않을 것입니다.
country=us ruby -e "puts ENV['country']"
같지 않다.ruby -e "puts ENV['country']" country=us
(첫 번째 환경 변수와 두 번째 환경 변수). - Djunzu
이러한 솔루션이 작동하는 동안 내 의견으로는 지나치게 복잡합니다.
또한 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는 그가 왜 그 규정을 포함 시켰는지 진술하지 않았으므로 그의 유스 케이스에도 여전히 적용될 수 있습니다.
:environment
Rails 애플리케이션 코드를로드하는 데 필요합니다. Rails 앱에서이 기능을 사용하면 다음과 같은 결과를 얻을 수 있습니다.["my_example:my_task", "1", "2", "3"] rake aborted! Don't know how to build task '1' (see --tasks)
- Djunzu