2009-08-31 4 views
185

私は次のように引数を渡すことができています:Railsの環境に引数を渡すには?

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 

しかし、これは有効なタスクコールではありません。誰も私がこれを達成する方法を知っていますか?

+14

ingerの新しい回答を受け入れるように更新してください。 – mahemoff

答えて

100

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 
Railsのためとして

以下Peiniauさんのコメント@ごとに更新

> 3.1

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

からの例ここでは、ただ、完全を期すため

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

最新のドキュメントは ':needs'メソッドを以下のように記述しています:"そのフォーマットはまだ互換性のためにサポートされていますが、使用することはお勧めしません。 " (これは将来のブラウザでのみ言及していますが、最終的に ':needs'がサポートされなくなることを示唆しているためです)。 – Telemachus

+6

そのコードのバグ:puts" Hello# {User.first.name}。#{:message} "...これは、"ログオンしていただきありがとうございました "、単に"メッセージ "を表示しません。修正:#{args.message}最後の代入。 – inger

+53

Rails 3.1のタスクについては、t、arg、:needs => [deps] 'は推奨されていません。代わりに 'task:t、[args] => [deps]'を使用してください。 – Peiniau

52

を使用してください上述した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コールを省略することができます。
  • 引数が1つしかない場合でも、引数にはArrayを使用する必要があります。
  • 前提条件はArrayである必要はありません。
  • argsは、Rake::TaskArgumentsのインスタンスです。
  • tは、Rake::Taskのインスタンスです。
+1

これはなぜ 'args.empty?'が私に奇妙な結果をもたらしたのかを説明します。 'args'はハッシュのように見えますが、' Rake :: TaskArguments'です。したがって、argsが渡されていないときに特別な振る舞いが必要な場合は、 'args'が空であるかどうかをチェックする前に'#to_hash'か '#to_s'を呼び出してください。 – Dennis

346

この古いトピックをフォローアップしてください。ここに私は現在のRakefile(ずっと前から)がそこで行うべきだと思うものがあります。これは、あなたがそれを呼び出す方法です(http://guides.rubyonrails.org/v4.2/command_line.html#rakeを)

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 

:それは、現在の勝利の答えのアップグレードとバグフィックスバージョン(hgimenez)だ複数の引数については

rake "hello[World]" 

、ちょうど配列に彼らのキーワードを追加します

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

注:コンマ区切りタスク宣言(task :hello, [:a,:b,:c]...)、およびそれらを渡すの奇妙な惑星がルであるように、引数の数が、チェックされていませんft out :)

+36

この回答は受け入れられるものでなければなりません。 – samvermette

+22

男...レイクはいつも私にルビーのように感じます。ルビの最初の推測では、実際にどのように動作するのかが分かります。この構文はちょっと奇妙です。 –

+0

私は間違いなくゴミがないことに同意します(真実ではないシンタックスのために) - 真剣に、私はあなたの懸念を見ますが、IMHOは内部DSLの単なる限界です:あなたは完全に自由にシンタックスを再定義することはできませんが、行く(リスプではないにもかかわらず)。ところで、より直感的なAPI/DSLが上記の目的のためにどのように見えると思いますか? – inger

16

別のやり方として、OS環境変数を使用します。このアプローチのメリット:

  • すべての依存するレーキタスクがオプションを取得します。
  • 構文ははるかに簡単で、時間の経過とともに把握しにくいレーキDSLに依存するものではありません。

私は3つのコマンドラインオプションを必要とするレーキタスクを持っています。私がそれを呼び出す方法は次のとおりです:

これは私が好きな、非常にクリーンで、シンプルで、ちょうど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タスクが他のタスクに依存していた場合、これらのオプションにもアクセスできます。しかし、通常のレーキ・オプション・メソッドを使用すると、そうしないでしょう。

+0

これは間違いなく環境変数です!レーキはそれを環境変数として示していますが、* rake * arguments *です。巨大な概念(と実用的な)の違いがあります! 'country = us ruby​​ -e 'とすると、ENV [' country ']' 'は' ruby​​ -e'と同じではないことに注意してください。ENV ['country'] "country = us'二番目)。 – Djunzu

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にはその規定が含まれている理由が述べられていないので、彼のユースケースにも適用される可能性があります。

+0

Railsアプリケーションコードをロードするには、 ':environment'が必要です。また、Railsアプリケーションで試してみると、 '[" my_example:my_task "、" 1 "、" 2 "、" 3 "] rake aborted! タスク '1'を構築する方法がわからない( - タスクを参照) ' – Djunzu

関連する問題