Vraiment pas Cher Option de Ligne de Commande l'Analyse en Ruby
EDIT: s'il vous Plaît, veuillez, veuillez lire les deux exigences figurant au bas de ce post avant de répondre. Les gens continuer à poster leurs nouvelles gemmes et les bibliothèques et autres joyeusetés, qui, manifestement, ne répondent pas aux exigences.
Parfois, je veux à très bon marché, hack certaines options de ligne de commande dans un script simple. Une façon amusante de le faire, sans traiter getopts ou de l'analyse ou de quoi que ce soit, est:
...
$quiet = ARGV.delete('-d')
$interactive = ARGV.delete('-i')
...
# Deal with ARGV as usual here, maybe using ARGF or whatever.
Ce n'est pas tout à fait normal Unix syntaxe des options, car il va accepter les options non-option paramètres de ligne de commande, comme dans "myprog -i foo bar -q
", mais je peux vivre avec ça. (Certaines personnes, comme par exemple la Subversion développeurs préfèrent cette. Parfois, je le fais aussi).
Une option qui est tout simplement la présence ou l'absence ne peut pas être mis en œuvre de façon beaucoup plus simple que le précédent. (Une affectation, un appel de fonction, un effet de bord.) Est-il aussi un moyen simple de traiter avec des options qui prend un paramètre, tel que "-f
nom de fichier"?
EDIT:
Un point que je n'ai pas fait plus tôt, car il n'était pas devenu clair pour moi jusqu'à ce que l'auteur de Gourgandine mentionné que la bibliothèque tenir "dans un [800-ligne] fichier," c'est que je suis à la recherche non seulement pour le nettoyage de la syntaxe, mais une technique qui a les caractéristiques suivantes:
-
L'intégralité du code peuvent être inclus dans le fichier de script (sans submerger le script lui-même, qui peut être seulement un couple de douzaine de lignes), de sorte que l'on peut supprimer un seul fichier dans un
bin
dir sur n'importe quel système avec un standard de Ruby 1.8.[5-7] installation et utilisation. Si vous ne pouvez pas écrire un script Ruby qui n'a pas d'exiger des déclarations et où le code pour parser un couple d'options est en vertu d'une douzaine de lignes, vous ne parvenez pas à cette exigence. -
Le code est petit et assez simple que l'on peut se rappeler assez pour taper directement dans le code qui fera l'affaire, plutôt que de couper et coller à partir de quelque part d'autre. Pensez à la situation où vous vous trouvez sur la console d'un pare-feu rompre avec aucun accès à Internet, et que vous voulez jeter un rapide script pour un client à utiliser. Je ne sais pas pour vous, mais (en plus de l'échec à l'exigence ci-dessus), la mémorisation de même les 45 lignes simplifiées en matière de micro-optparse n'est pas quelque chose que j'ai des soins à faire.
- Juste curieux de la protestation contre getoptlong?
- Le niveau de verbosité des il. Avec getoptlog, parfois, les options de code d'analyse est plus longue que la partie du script qui fait réellement le travail. Ce n'est pas seulement un enjeu esthétique, mais un coût de maintenance question.
- Je ne comprends pas l'inclusion de script exigence à la fois
getoptlong
etoptparse
sont dans la norme de rubis de la bibliothèque, de sorte que vous n'avez pas BESOIN de copier lors du déploiement de votre script si ruby fonctionne sur cette machine, puisrequire 'optparse'
ourequire 'getoptlong'
sera trop de travail. - Voir stackoverflow.com/questions/21357953/..., ainsi que William Morgan réponse ci-dessous à propos de Gourgandine.
- Je ne peux pas croire combien de gens n'ont pas la réponse à votre question. De toute façon, a finalement obtenu une bonne réponse sur les 3 postes en bas XD XD
Vous devez vous connecter pour publier un commentaire.
Comme l'auteur de Gourgandine, je ne peux pas CROIRE les choses que les gens pensent que ce qui est raisonnable dans une option analyseur. Sérieusement. Cela dépasse l'entendement.
Pourquoi devrais-je faire un module qui s'étend sur quelque autre module pour analyser les options? Pourquoi devrais-je avoir à la sous-classe quoi que ce soit? Pourquoi devrais-je souscrire à certaines "cadre" pour analyser la ligne de commande?
Voici la Gourgandine version de la ci-dessus:
Et c'est tout.
opts
est maintenant une valeur de hachage avec des touches de:quiet
,:interactive
, et:filename
. Vous pouvez faire ce que vous voulez avec elle. Et vous obtenez une belle page d'aide, mis en forme pour s'adapter à votre largeur de l'écran, réglage automatique de court les noms d'argument, la vérification du type... tout ce dont vous avez besoin.C'est un fichier, de sorte que vous pouvez déposer dans votre répertoire lib/si vous ne voulez pas un formelle de dépendance. Il a un minimum de LIS qui est facile à ramasser.
LOC par option de gens. C'questions.
foo bar
où foo est l'utilité et de la bar est un fichier, et que vous souhaitez ajouter un drapeau-t
, je ne peux pas comprendre comment le faire, Gourgandine de mettre le nom de fichier dans une partie de laopts
de hachage. Le nom de fichier arg n'a pas de drapeau, et je ne veux pas avoir à en indiquer un. Les Docs ne sont pas claires sur la façon de le faire, ou si je dois juste mordre la balle et de la forcer à avoir un drapeau.Je partage votre aversion pour
require 'getopts'
, principalement en raison de l'awesomeness qui estOptionParser
:Voici la technique que j'utilise habituellement:
lib
dossier ou d'un code et l'utiliser sans même toucher rubygems.when /^-/ then usage("Unknown option: #{ARGV[0].inspect}")
àwhen /^-/ then usage("Unknown option: #{ARGV.shift.inspect}")
ou il serait aller dans un infini d'utilisation de la boucleexit(2)
ligne deusage()
.Puisque personne ne semble le mentionner, et le titre ne reportez-vous à pas cher de ligne de commande de l'analyse, pourquoi ne pas simplement laisser l'interpréteur ruby faire le travail pour vous? Si vous passer le
-s
switch (dans votre arborescence, par exemple), vous obtenez la saleté de simples contacts gratuitement, attribué à une seule lettre de variables globales. Voici l'exemple d'utilisation de ce commutateur:Et voici la sortie lorsque j'enregistre que
./test
et la commande chmod+x
:Voir
ruby -h
pour plus de détails. 🙂Que doit être aussi bon marché qu'il obtient. Il va soulever une NameError si vous essayez un commutateur, comme
-:
, donc, il y a quelques validation. Bien sûr, vous ne pouvez pas avoir tous les interrupteurs après un non-switch argument, mais si vous avez besoin de quelque chose de fantaisie, vous devez vraiment être à l'aide d'au minimum OptionParser. En fait, la seule chose qui me dérange à propos de cette technique est que vous aurez un avertissement (si vous avez activé eux) lors de l'accès à un unset variable globale, mais il est encore falsey, de sorte qu'il fonctionne parfaitement pour du jetable outils et rapide des scripts.Une mise en garde ( comme l'a souligné FelipeC dans les commentaires ), c'est que votre shell pourraient ne pas soutenir la 3-jeton arborescence; vous devrez peut-être remplacer
/usr/bin/env ruby -w
avec le chemin de votre ruby (comme/usr/local/bin/ruby -w
), ou exécuter à partir d'un script ou quelque chose.J'ai construit micro-optparse pour combler ce besoin évident pour une courte, mais facile à utiliser l'option-analyseur. Il a une syntaxe similaire à la Gourgandine et est de 70 lignes courtes. Si vous n'avez pas besoin de validations et peut faire sans les lignes vides, vous pouvez le couper à 45 lignes. Je pense que c'est exactement ce que vous cherchez.
Court exemple:
De l'appel du script avec
-h
ou--help
imprimeIl vérifie si l'entrée est du même type que la valeur par défaut, génère à court et à long accesseurs, estampes descriptif des messages d'erreur si les arguments non valides sont donnés et plus.
Je comparé plusieurs option-analyseur par l'utilisation de chaque option analyseur syntaxique pour le problème que j'ai eu.
Vous pouvez utiliser ces exemples et mon résumé à faire un arrêt instructif.
N'hésitez pas à ajouter plus implémentations de la liste. 🙂
optparse
qui est (donner ou prendre) 1937 lignes.optparse
est une bibliothèque par défaut, c'est à dire qu'il est livré avec tous les rubis de l'installation.Trollop
est une bibliothèque tierce, par conséquent, vous devez importer le code complet à chaque fois que vous souhaitez l'inclure dans un projet. µ-optparse toujours ne requiert que la ~70 lignes, depuisoptparse
est déjà là.Je comprends tout à fait pourquoi vous voulez éviter optparse - il peut arriver beaucoup trop. Mais il y a un peu de loin la plus "légère" des solutions (par rapport à OptParse) qui viennent comme les bibliothèques, mais sont assez simples à faire une seule gemme d'installation de la peine.
Par exemple, découvrez cette OptiFlag exemple. Juste quelques lignes pour le traitement. Un peu tronquée exemple adaptés à votre cas:
Il y a des tonnes d'exemples adaptés trop. Je me souviens d'utiliser un autre qui était encore plus facile, mais il ne m'a pas échappé pour l'instant mais je vais revenir et ajoutez un commentaire ici si je le trouve.
C'est ce que j'utilise vraiment, vraiment pas cher args:
donc, si vous exécutez
programname foo bar
il appelle foo et puis bar. C'est pratique pour les jetables scripts.Vous pouvez essayer quelque chose comme:
Avez-vous envisagé de Thor par wycats? Je pense que c'est beaucoup plus propre que optparse. Si vous avez déjà un script écrit, il pourrait être un peu plus de travail pour le formater ou de refactoriser le code de thor, mais il ne font d'options de traitement de très simple.
Voici l'exemple extrait du README:
Thor mappe automatiquement les commandes en tant que tel:
Qui est converti en:
--help
de sortie? Si "la tête myprogram.rb" a la sortie de l'aide?Voici mon préféré quick-and-dirty option analyseur:
Les options sont des expressions régulières, "- h" aussi pourrait correspondre à "--help".
Lisible, facile à retenir, pas de bibliothèque externe, et un minimum de code.
--host
.../-h(\b|elp)
Gourgandine est assez bon marché.
Si vous voulez une simple ligne de commande analyseur de clé/valeur des commandes, sans l'utilisation de gemmes:
Mais ce seulement fonctionne si vous avez toujours des paires clé/valeur.
Si vous n'avez pas besoin de tout vérification vous pouvez simplement utiliser:
Voici l'extrait de code que j'utilise au début de la plupart de mes scripts:
Je déteste aussi d'exiger d'autres fichiers dans mon quick-and-dirty scripts. Ma solution est très près de ce que vous me demandez. Je colle un 10 ligne extrait de code en haut de l'un de mes scripts qui analyse la ligne de commande et des bâtons de position args et bascule dans un objet de Hachage (habituellement attribué à un objet que j'ai nommé arghash dans les exemples ci-dessous).
Voici un exemple de ligne de commande, vous pourriez vouloir analyser...
Qui allait devenir un Hachage de ce genre.
En plus de cela, deux méthodes pratiques sont ajoutés à la valeur de Hachage:
argc()
sera de retour le nombre de non-commutateur arguments.switches()
retourne un tableau contenant les clés de commutateurs qui sont présentsC'est un moyen de permettre à certains "rapide et sale" des trucs comme...
arghash.argc == 2
)arghash[1]
obtient toujours la seconde non-switch argument).arghash['--max=']
qui donne une valeur de '15' donné l'exemple de la ligne de commande.arghash['-s']
qui évalue à true si il est présent et nul si son absence.Tester la présence d'un commutateur ou des solutions de rechange de commutateurs à l'aide des opérations définies comme
puts USAGETEXT if !(%w(-h --help) & arghash.switches()).empty?
La détection de l'utilisation de l'invalidité de commutateurs à l'aide des opérations définies comme
puts "Invalid switch found!" if !(arghash.switches - %w(-valid1 -valid2)).empty?
Spécifier des valeurs par défaut pour les arguments manquants à l'aide d'un simple
Hash.merge()
comme l'exemple ci-dessous qui se remplit à une valeur de -max= si l'on n'était pas ensemble et ajoute un 4e position argument si l'on n'a pas été adopté.with_defaults = {'-max=' => 20, 3 => 'default.txt'}.merge(arghash)
=
) peut faire une différence dans le code dont vous avez besoin.Ceci est très similaire à la accepté de répondre, mais à l'aide de
ARGV.delete_if
qui est ce que j'utilise dans mon simple analyseur. La seule vraie différence est que les options avec des arguments qui doivent être réunies (par exemple,-l=file
).Apparemment @WilliamMorgan et je pense de même. Je viens juste de sortir de la nuit dernière pour Github ce que je vois maintenant est une bibliothèque semblable à Gourgandine (Appelé comment?) après avoir fait une recherche pour OptionParser sur Github, voir Les commutateurs
Il y a quelques différences, mais la philosophie est la même. Une différence évidente est que les Interrupteurs dépend de OptionParser.
Je suis le développement de mon propre option de parser du gem appelé Acclaim.
Je l'ai écrit parce que je voulais créer git-style de ligne de commande interfaces et être en mesure de séparer proprement de la fonctionnalité de chaque commande dans des classes séparées, mais il peut également être utilisé sans la totalité de la commande de cadre:
Pas de version stable pour le moment, mais je l'ai déjà mis en œuvre certaines fonctionnalités comme:
Il y a beaucoup d'accent sur les commandes de sorte qu'il pourrait être un peu lourd pour une simple ligne de commande de l'analyse, mais il fonctionne bien et je l'ai utilisé sur mes projets. Si vous êtes intéressé par l'interface de commande de l'aspect de vérifier ensuite le projet GitHub page pour plus d'informations et d'exemples.
Supposons qu'une commande a au plus une action et nombre arbitraire d'options comme ceci:
L'analyse sans validation peut être comme ceci:
https://github.com/soveran/clap
46LOC (à 1.0.0), aucune dépendance externe option analyseur. Fait le travail. Probablement pas aussi complet que les autres, mais c'est 46LOC.
Si vous examinez le code, vous pouvez très facilement dupliquer la technique sous-jacente -- attribuer des lambdas et l'utilisation de l'arité d'assurer le bon nombre d'arguments de suivre l'option si vous ne voulez vraiment pas une bibliothèque externe.
Simple. À bas prix.
MODIFIER: le concept sous-jacent bouilli vers le bas comme je suppose que vous pourriez les copier/coller dans un script de ligne de commande de l'analyseur. C'est certainement pas quelque chose que je puisse commettre à la mémoire, mais à l'aide de la lambda arité comme un bon analyseur est une idée de roman:
Je vais partager mon propre simple option analyseur qui j'ai travaillé pendant un certain temps. C'est simplement 74 lignes de code, et il ne les bases de ce que l'Git interne de l'option analyseur ne. J'ai pris OptionParser comme source d'inspiration, et aussi Git est.
https://gist.github.com/felipec/6772110
Il ressemble à ceci:
EasyOptions ne nécessite aucune option d'analyse du code. Il suffit d'écrire le texte d'aide, besoin, c'est fait.