J'ai une tâche de râteau qui doit insérer une valeur dans plusieurs bases de données.
Je voudrais passer cette valeur dans la tâche de râteau à partir de la ligne de commande ou d' une autre tâche de râteau.
Comment puis-je faire ceci?
ruby
command-line
rake
command-line-arguments
Tilendor
la source
la source
Réponses:
les options et les dépendances doivent être à l'intérieur des tableaux:
alors
NOTE SUR LES RAILS:
la source
rake thing:work[1, 2, 3]
car cela ne fonctionnera pas et vous obtiendrez une erreurDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
rake 'thing:work[1,2,3]'
:environment
symbole de votre tâche. les applications de rails ont une tâche d'environnement ...t
signifietask
, pourquoi ne pas simplement utilisertask
comme nom de paramètre?Vous pouvez spécifier des arguments formels dans rake en ajoutant des arguments de symbole à l'appel de tâche. Par exemple:
Ensuite, à partir de la ligne de commande:
Comme illustré dans le deuxième exemple, si vous souhaitez utiliser des espaces, les guillemets autour du nom cible sont nécessaires pour empêcher le shell de fractionner les arguments dans l'espace.
En regardant le code dans rake.rb , il semble que rake n'analyse pas les chaînes de tâches pour extraire les arguments des conditions préalables, vous ne pouvez donc pas le faire
task :t1 => "dep[1,2]"
. La seule façon de spécifier différents arguments pour une condition préalable serait de l'invoquer explicitement dans l'action de tâche dépendante, comme dans:invoke_my_task
et:invoke_my_task_2
.Notez que certains shells (comme zsh) nécessitent que vous échappiez aux crochets:
rake my_task\['arg1'\]
la source
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), de sorte que vous devez échapper aux crochets:rake my_task\['arg1'\]
. De robots.thoughtbot.com/post/18129303042/…En plus de répondre par kch (je n'ai pas trouvé comment laisser un commentaire à ça, désolé):
Vous n'avez pas besoin de spécifier des variables en tant que
ENV
variables avant larake
commande. Vous pouvez simplement les définir comme des paramètres de ligne de commande habituels comme ça:et accédez à celles de votre fichier rake en tant que variables ENV comme celles-ci:
la source
p
signifie exactement ?Si vous voulez passer des arguments nommés (par exemple avec standard
OptionParser
), vous pouvez utiliser quelque chose comme ceci:notez le
--
, qui est nécessaire pour contourner les arguments Rake standard. Devrait fonctionner avec Rake 0.9.x , <= 10.3.x .Newer Rake a changé son analyse de
--
, et maintenant vous devez vous assurer qu'il n'est pas passé à laOptionParser#parse
méthode, par exemple avecparser.parse!(ARGV[2..-1])
exit
à la fin s'assurera que les arguments supplémentaires ne seront pas interprétés comme une tâche Rake.Le raccourci pour les arguments devrait également fonctionner:
Lorsque les scripts de rake ressemblent à ceci, il est peut-être temps de chercher un autre outil qui permettrait cela tout de suite.
la source
--option-names
. Ma seule suggestion serait d'utiliserexit
plutôt queabort
deabort
vous laisser avec un code retour de 1 au shell. Si la tâche de râteau fait partie d'un script de niveau supérieur, il est plus courant de supposer qu'une sortie non nulle est un type d'erreur.--
? Comme passer desrake
arguments à la tâche réelle ou quelque chose? Commetask :my_task, :*args do |t, args|
ou quelque chose?{username}
ça sert. Où est-il utilisé? Pourquoi n'est-il pas là-u {username}
? Santé10.4.1
et rétablie10.4.2
. github.com/ruby/rake/commit/…J'ai trouvé la réponse sur ces deux sites: Net Maniac et Aimred .
Vous devez avoir la version> 0.8 de rake pour utiliser cette technique
La description de la tâche de râteau normale est la suivante:
Pour passer des arguments, faites trois choses:
Pour accéder aux arguments du script, utilisez args.arg_name
Pour appeler cette tâche à partir de la ligne de commande, passez-lui les arguments dans [] s
affichera
et si vous voulez appeler cette tâche à partir d'une autre tâche et lui passer des arguments, utilisez invoke
puis la commande
affichera
Je n'ai pas trouvé de moyen de passer des arguments dans le cadre d'une dépendance, car le code suivant se casse:
la source
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Une autre option couramment utilisée consiste à transmettre des variables d'environnement. Dans votre code, vous les lisez via
ENV['VAR']
et pouvez les transmettre juste avant larake
commande, commela source
rake blah -- --these --go --to --a-program
(notez le--
pour indiquer à rake que ses commutateurs sont terminés), voir stackoverflow.com/questions/5086224/…En fait, @Nick Desjardins a répondu parfaitement. Mais juste pour l'éducation: vous pouvez utiliser une approche sale: utiliser l'
ENV
argumentla source
Je ne pouvais pas comprendre comment passer les arguments et aussi l'environnement: jusqu'à ce que je résolve ceci:
Et puis j'appelle comme ça:
la source
la source
rake task_name[hello, world]
Je voulais juste pouvoir courir:
C'est simple, non? (Nan!)
Rake interprète
arg1
et enarg2
tant que tâches et essaie de les exécuter. Nous avortons donc juste avant.Prenez ça, crochets!
Avertissement : je voulais pouvoir le faire dans un joli petit projet pour animaux de compagnie. Non destiné à un usage «réel» car vous perdez la capacité de chaîner des tâches de râteau (c.
rake task1 task2 task3
-à-d.). L'OMI n'en vaut pas la peine. Utilisez simplement le laidrake task[arg1,arg2]
.la source
_, arg1, arg2 = ARGV
car le premier argument était considéré comme le nom de la tâche de râteau. Mais c'estexit
une astuce intéressante.rake task[arg1,arg2] && rake task2 && rake task3
Je ne sais pas si c'est moins moche querake task[arg1,arg2] task2 task3
. Probablement moins efficace cependant._, *args = ARGV
est parfait pour capturer tous les arguments suivants! Merci des tas!J'utilise un argument ruby régulier dans le fichier rake:
puis je stub sur les tâches de râteau au bas du fichier (puisque râteau cherchera une tâche basée sur ce nom d'argument).
ligne de commande:
cela me semble plus propre que le var = foo ENV var et la tâche args [blah, blah2] solutions.
le talon est un peu jenky, mais pas trop mal si vous n'avez que quelques environnements qui sont une configuration unique
la source
dup
à la fin: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
pour éviter l'exception de duper un néant.Les façons de passer l'argument sont correctes dans la réponse ci-dessus. Cependant, pour exécuter la tâche de râteau avec des arguments, une petite technicité est impliquée dans la nouvelle version des rails
Cela fonctionnera avec le rake "namespace: taskname ['argument1']"
Notez les guillemets inversés lors de l'exécution de la tâche à partir de la ligne de commande.
la source
Pour passer des arguments à la tâche par défaut, vous pouvez faire quelque chose comme ça. Par exemple, dites "version" est votre argument:
Ensuite, vous pouvez l'appeler ainsi:
ou
ou
Cependant, je n'ai pas trouvé de moyen d'éviter de spécifier le nom de la tâche (par défaut ou build) en passant des arguments. J'adorerais entendre si quelqu'un connaît un moyen.
la source
J'aime la syntaxe "querystring" pour le passage d'arguments, surtout quand il y a beaucoup d'arguments à passer.
Exemple:
La "chaîne de requête" étant:
Attention: notez que la syntaxe est
rake "mytask[foo=bar]"
et NONrake mytask["foo=bar"]
Une fois analysé à l'intérieur de la tâche de râteau en utilisant
Rack::Utils.parse_nested_query
, nous obtenonsHash
:(Ce qui est cool, c'est que vous pouvez passer des hachages et des tableaux, plus ci-dessous)
Voici comment y parvenir:
Voici un exemple plus étendu que j'utilise avec Rails dans ma gemme delay_job_active_record_threaded :
Analysé de la même manière que ci-dessus, avec une dépendance à l'environnement (pour charger l'environnement Rails)
Donne ce qui suit dans
options
la source
Si vous ne pouvez pas vous soucier de savoir quelle position d'argument est pour quoi et que vous voulez faire quelque chose comme un hachage d'argument rubis. Vous pouvez utiliser un argument pour passer une chaîne, puis regex cette chaîne dans un hachage d'options.
Et sur la ligne de commande, vous obtenez.
la source
La plupart des méthodes décrites ci-dessus ne fonctionnaient pas pour moi, peut-être qu'elles sont obsolètes dans les versions plus récentes. Le guide à jour peut être trouvé ici: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
un copier-coller ans du guide est ici:
Invoquez-le comme ça
la source
Pour exécuter des tâches de râteau avec un style d'arguments traditionnel:
Et puis utilisez:
Ajoutez le patch suivant de rake gem:
la source
En passant des paramètres, il est préférable que l'option soit un fichier d'entrée, peut-il être un excel un json ou tout ce dont vous avez besoin et à partir de là, lisez la structure de données et les variables dont vous avez besoin, y compris le nom de la variable selon les besoins. Pour lire un fichier peut avoir la structure suivante.
Exemple json
Exécution
la source