Eu tenho uma tarefa de rake que precisa inserir um valor em vários bancos de dados.
Eu gostaria de passar esse valor para a tarefa rake na linha de comando ou de outra tarefa rake.
Como posso fazer isso?
ruby
command-line
rake
command-line-arguments
Tilendor
fonte
fonte
Respostas:
opções e dependências precisam estar dentro de matrizes:
Então
NOTA DOS TRILHOS:
fonte
rake thing:work[1, 2, 3]
como ele não vai funcionar e você terá um erroDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
ou estarake 'thing:work[1,2,3]'
:environment
símbolo da sua tarefa. trilhos aplicações têm um: tarefa ambiente ...t
meiostask
, por que não usartask
como o nome param?Você pode especificar argumentos formais no rake adicionando argumentos de símbolo à chamada de tarefa. Por exemplo:
Em seguida, na linha de comando:
Conforme demonstrado no segundo exemplo, se você deseja usar espaços, as aspas ao redor do nome do destino são necessárias para impedir que o shell divida os argumentos no espaço.
Observando o código em rake.rb , parece que o rake não analisa seqüências de tarefas para extrair argumentos de pré-requisitos, portanto você não pode fazer isso
task :t1 => "dep[1,2]"
. A única maneira de especificar argumentos diferentes para um pré-requisito seria invocá-lo explicitamente na ação da tarefa dependente, como em:invoke_my_task
e:invoke_my_task_2
.Observe que algumas conchas (como zsh) exigem que você escape dos colchetes:
rake my_task\['arg1'\]
fonte
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), então você precisa para escapar dos colchetes:rake my_task\['arg1'\]
. De robots.thoughtbot.com/post/18129303042/…Além de responder por kch (não achei como deixar um comentário, desculpe):
Você não precisa especificar variáveis como
ENV
variáveis antes dorake
comando. Você pode apenas defini-los como parâmetros de linha de comando usuais assim:e acesse aqueles do seu arquivo rake como variáveis ENV como estas:
fonte
p
significa?Se você deseja passar argumentos nomeados (por exemplo, com padrão
OptionParser
), pode usar algo como isto:observe o
--
que é necessário para ignorar os argumentos padrão do Rake. Deve trabalhar com Rake 0.9.x , <= 10.3.x .O Rake mais recente mudou sua análise
--
e agora você precisa garantir que não seja passado para oOptionParser#parse
método, por exemplo, comparser.parse!(ARGV[2..-1])
exit
no final, garantirá que os argumentos extras não serão interpretados como tarefa Rake.Também o atalho para argumentos deve funcionar:
Quando os scripts rake se parecem com isso, talvez seja hora de procurar outra ferramenta que permita isso imediatamente.
fonte
--option-names
. A minha única sugestão seria a utilizaçãoexit
, em vez deabort
comoabort
vai deixar você com um código de retorno de 1 para o shell. Se a tarefa rake fizer parte de um script de nível superior, é mais comum assumir que uma saída diferente de zero é algum tipo de erro.--
? Como passarrake
argumentos para a tarefa real ou algo assim? Gostatask :my_task, :*args do |t, args|
ou algo assim?{username}
serve aqui. Onde é usado? Por que não está lá-u {username}
? Cheers10.4.1
e revertida10.4.2
. github.com/ruby/rake/commit/…Encontrei a resposta desses dois sites: Net Maniac e Aimred .
Você precisa ter a versão> 0.8 do rake para usar esta técnica
A descrição normal da tarefa de rake é esta:
Para passar argumentos, faça três coisas:
Para acessar os argumentos no script, use args.arg_name
Para chamar essa tarefa na linha de comando, passe os argumentos em [] s
irá produzir
e se você quiser chamar essa tarefa de outra tarefa e passar argumentos, use invoke
então o comando
irá produzir
Não encontrei uma maneira de passar argumentos como parte de uma dependência, pois o código a seguir é quebrado:
fonte
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Outra opção comumente usada é passar variáveis de ambiente. No seu código, você os lê via
ENV['VAR']
e pode transmiti-los antes dorake
comando, comofonte
rake blah -- --these --go --to --a-program
(observe o aviso--
ao rake que seus switches terminaram), consulte stackoverflow.com/questions/5086224/…Na verdade, @Nick Desjardins respondeu perfeito. Mas apenas para a educação: você pode usar uma abordagem suja: usando
ENV
argumentosfonte
Eu não conseguia descobrir como passar argumentos e também o ambiente: até resolver isso:
E então eu chamo assim:
fonte
fonte
rake task_name[hello, world]
Eu só queria poder executar:
Simples, certo? (Não!)
O Rake interpreta
arg1
earg2
como tarefas, e tenta executá-las. Então, simplesmente abortamos antes que isso aconteça.Tome isso, suportes!
Disclaimer : Eu queria ser capaz de fazer isso em um projeto bem pequeno para animais de estimação. Não se destina ao uso no "mundo real", pois você perde a capacidade de encadear tarefas de varredura (ou seja
rake task1 task2 task3
). OMI não vale a pena. Basta usar o feiorake task[arg1,arg2]
.fonte
_, arg1, arg2 = ARGV
pois o primeiro argumento foi visto como o nome da tarefa rake. Mas esseexit
é um truque legal.rake task[arg1,arg2] && rake task2 && rake task3
Não tenho certeza se isso é menos feio do querake task[arg1,arg2] task2 task3
. Provavelmente menos eficiente._, *args = ARGV
é perfeito para capturar todos os argumentos subseqüentes! Muito obrigado!Eu uso um argumento ruby regular no arquivo rake:
em seguida, elaborei as tarefas de rake na parte inferior do arquivo (pois o rake procurará uma tarefa com base no nome do argumento)
linha de comando:
isso me parece mais limpo do que as soluções var = foo ENV var e a tarefa args [blah, blah2].
o esboço é um pouco instável, mas não muito ruim se você tiver apenas alguns ambientes que são uma configuração única
fonte
dup
no final: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
para evitar a exceção de enganar um zero.As maneiras de passar argumentos estão corretas na resposta acima. Entretanto, para executar tarefas de rake com argumentos, há um pequeno detalhe técnico envolvido na versão mais recente do rails
Ele funcionará com o rake "namespace: taskname ['argument1']"
Observe as aspas invertidas ao executar a tarefa na linha de comando.
fonte
Para passar argumentos para a tarefa padrão, você pode fazer algo assim. Por exemplo, diga "versão" é seu argumento:
Então você pode chamar assim:
ou
ou
No entanto, não encontrei uma maneira de evitar a especificação do nome da tarefa (padrão ou compilação) durante a transmissão de argumentos. Gostaria de saber se alguém sabe de uma maneira.
fonte
Eu gosto da sintaxe "querystring" para a passagem de argumentos, especialmente quando há muitos argumentos a serem passados.
Exemplo:
O "querystring" sendo:
Aviso: observe que a sintaxe é
rake "mytask[foo=bar]"
e NÃOrake mytask["foo=bar"]
Quando analisado dentro da tarefa rake usando
Rack::Utils.parse_nested_query
, obtemos umHash
:(O legal é que você pode passar hashes e matrizes, mais abaixo)
Isto é como conseguir isso:
Aqui está um exemplo mais extenso que estou usando com o Rails na minha jóia delayed_job_active_record_threaded :
Analisado da mesma maneira que acima, com uma dependência de ambiente (para carregar o ambiente Rails)
Fornece o seguinte em
options
fonte
Se você não se incomoda em lembrar qual é a posição do argumento e deseja fazer algo como um hash de argumento ruby. Você pode usar um argumento para passar uma sequência e depois regexá-la em um hash de opções.
E na linha de comando você recebe.
fonte
A maioria dos métodos descritos acima não funcionou para mim, talvez eles estejam obsoletos nas versões mais recentes. O guia atualizado pode ser encontrado aqui: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
uma cópia e colar do manual está aqui:
Invoque assim
fonte
Para executar tarefas de rake com o estilo de argumentos tradicionais:
E então use:
Adicione o seguinte patch da rake gem:
fonte
Ao passar parâmetros, a melhor opção é um arquivo de entrada, pode ser um excel a json ou o que for necessário e, a partir daí, leia a estrutura de dados e as variáveis necessárias, incluindo o nome da variável conforme a necessidade. Ler um arquivo pode ter a seguinte estrutura.
Exemplo json
Execução
fonte