EDIT: S'il vous plaît, s'il vous plaît , veuillez lire les deux exigences énumérées au bas de cet article avant de répondre. Les gens continuent d'afficher leurs nouveaux joyaux et bibliothèques, etc., qui ne répondent clairement pas aux exigences.
Parfois, je veux pirater à peu de frais certaines options de ligne de commande dans un simple script. Une façon amusante de le faire, sans avoir à gérer les getopts ou l'analyse ou quoi que ce soit du genre, 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 la syntaxe normale des options Unix, car elle acceptera les paramètres de ligne de commande d'options sans option, comme dans " myprog -i foo bar -q
", mais je peux vivre avec cela. (Certaines personnes, comme les développeurs Subversion, préfèrent cela. Parfois moi aussi.)
Une option qui est simplement présente ou absente ne peut pas être implémentée beaucoup plus simplement que ce qui précède. (Une affectation, un appel de fonction, un effet secondaire.) Existe-t-il un moyen tout aussi simple de traiter les options qui prennent un paramètre, tel que " -f
filename "?
ÉDITER:
Un point que je n’ai pas souligné plus tôt, car il ne m’était pas devenu clair jusqu’à ce que l’auteur de Trollop ait mentionné que la bibliothèque tenait «dans un fichier [800 lignes]», c’est que je ne cherche pas seulement à nettoyer syntaxe, mais pour une technique qui présente les caractéristiques suivantes:
L'intégralité du code peut être inclus dans le fichier de script (sans surcharger le script lui-même, qui peut ne contenir que quelques dizaines de lignes), de sorte que l'on puisse déposer un seul fichier dans un répertoire
bin
sur n'importe quel système avec un Ruby 1.8 standard . [5-7] installation et utilisez-le. Si vous ne pouvez pas écrire un script Ruby qui n'a pas d'instructions require et où le code pour analyser quelques options se trouve sous une douzaine de lignes environ, vous échouez à cette exigence.Le code est suffisamment petit et simple pour qu'on s'en souvienne suffisamment pour taper directement du code qui fera l'affaire, plutôt que de couper et coller ailleurs. Pensez à la situation où vous êtes sur la console d'un serveur pare-feu sans accès à Internet et que vous souhaitez lancer un script rapide à utiliser par un client. Je ne sais pas pour vous, mais (en plus de ne pas répondre à l'exigence ci-dessus), mémoriser même les 45 lignes de micro-optparse simplifié n'est pas quelque chose que je veux faire.
getoptlong
etoptparse
sont dans la bibliothèque standard de ruby, vous n'avez donc pas besoin de les copier lors du déploiement de votre script - si ruby fonctionne sur cette machine, alorsrequire 'optparse'
ourequire 'getoptlong'
fonctionnera aussi.Réponses:
En tant qu'auteur de Trollop , je ne peux pas croire ce que les gens pensent raisonnable dans un analyseur d'options. Sérieusement. C'est stupéfiant.
Pourquoi devrais-je avoir à créer un module qui étend un autre module pour analyser les options? Pourquoi devrais-je devoir sous-classer quoi que ce soit? Pourquoi devrais-je devoir m'abonner à un "framework" juste pour analyser la ligne de commande?
Voici la version Trollop de ce qui précède:
Et c'est tout.
opts
est maintenant un hachage avec les touches:quiet
,:interactive
et:filename
. Vous pouvez en faire ce que vous voulez. Et vous obtenez une belle page d'aide, formatée pour s'adapter à la largeur de votre écran, des noms d'arguments courts automatiques, une vérification de type ... tout ce dont vous avez besoin.C'est un fichier, vous pouvez donc le déposer dans votre répertoire lib / si vous ne voulez pas de dépendance formelle. Il a un DSL minimal qui est facile à prendre en main.
LOC par personne en option. Cela compte.
la source
Je partage votre dégoût pour
require 'getopts'
, principalement en raison de la génialité qui estOptionParser
:la source
Voici la technique standard que j'utilise habituellement:
la source
lib
dossier ou 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 cela entrerait dans une boucle d'utilisation infiniePuisque personne ne semble le mentionner et que le titre fait référence à une analyse de ligne de commande bon marché , pourquoi ne pas laisser l'interpréteur Ruby faire le travail à votre place? Si vous passez le
-s
commutateur (dans votre shebang, par exemple), vous obtenez gratuitement des commutateurs simples, affectés à des variables globales à une seule lettre. Voici votre exemple d'utilisation de ce commutateur:Et voici le résultat lorsque je l'enregistre sous
./test
et le chmod+x
:Voir
ruby -h
pour plus de détails.Cela doit être aussi bon marché que possible. Cela lèvera une NameError si vous essayez un commutateur comme
-:
, donc il y a une validation ici. Bien sûr, vous ne pouvez pas avoir de commutateurs après un argument non-commutateur, mais si vous avez besoin de quelque chose de sophistiqué, vous devriez vraiment utiliser au minimum OptionParser. En fait, la seule chose qui m'ennuie à propos de cette technique est que vous recevrez un avertissement (si vous les avez activées) lors de l'accès à une variable globale non définie, mais c'est toujours faux, donc cela fonctionne très bien pour les outils jetables et rapide scripts.Une mise en garde signalée par FelipeC dans les commentaires de " Comment faire une analyse des options de ligne de commande vraiment bon marché dans Ruby ", est que votre shell pourrait ne pas prendre en charge le shebang à 3 jetons; vous devrez peut-être remplacer
/usr/bin/env ruby -w
par le chemin réel de votre ruby (comme/usr/local/bin/ruby -w
), ou l'exécuter à partir d'un script wrapper, ou quelque chose.la source
J'ai construit micro-optparse pour répondre à ce besoin évident d'un analyseur d'options court mais facile à utiliser. Il a une syntaxe similaire à Trollop et fait 70 lignes. Si vous n'avez pas besoin de validations et que vous pouvez vous passer de lignes vides, vous pouvez le réduire à 45 lignes. Je pense que c'est exactement ce que vous recherchiez.
Exemple court:
Appel du script avec
-h
ou--help
imprimeraIl vérifie si l'entrée est du même type que la valeur par défaut, génère des accesseurs courts et longs, imprime des messages d'erreur descriptifs si des arguments non valides sont donnés et plus encore.
J'ai comparé plusieurs analyseurs d' options en utilisant chaque analyseur d'options pour le problème que j'ai eu. Vous pouvez utiliser ces exemples et mon résumé pour prendre une décision informative. N'hésitez pas à ajouter plus d'implémentations à la liste. :)
la source
optparse
(donner ou prendre) 1937 lignes.optparse
s'agit d'une bibliothèque par défaut, c'est-à-dire qu'elle est livrée avec chaque installation de ruby.Trollop
est une bibliothèque tierce, vous devez donc importer le code complet chaque fois que vous souhaitez l'inclure dans un projet. µ-optparse ne nécessite toujours que les ~ 70 lignes, car iloptparse
est déjà là.Je comprends tout à fait pourquoi vous voulez éviter optparse - il peut en avoir trop. Mais il y a quelques solutions beaucoup plus "légères" (comparées à OptParse) qui viennent sous forme de bibliothèques, mais qui sont assez simples pour qu'une seule installation gem en vaille la peine.
Par exemple, consultez cet exemple d'OptiFlag . Juste quelques lignes pour le traitement. Un exemple légèrement tronqué adapté à votre cas:
Il existe également des tonnes d'exemples personnalisés . Je me souviens en avoir utilisé un autre qui était encore plus facile, mais cela m'a échappé pour l'instant mais je reviendrai et ajouterai un commentaire ici si je le trouve.
la source
C'est ce que j'utilise pour des arguments vraiment, vraiment bon marché:
donc si vous exécutez,
programname foo bar
il appelle foo puis bar. C'est pratique pour les scripts jetables.la source
Vous pouvez essayer quelque chose comme:
la source
Avez-vous considéré Thor par des wycats? Je pense que c'est beaucoup plus propre qu'optparse. Si vous avez déjà écrit un script, il pourrait être un peu plus de travail de le formater ou de le refactoriser pour Thor, mais cela rend les options de gestion très simples.
Voici l'exemple d'extrait du README:
Thor mappe automatiquement les commandes comme telles:
Cela est converti en:
la source
--help
sortie? Et si "head myprogram.rb" était la sortie d'aide?Voici mon analyseur d'options rapide et sale préféré:
Les options sont des expressions régulières, donc "-h" correspondra également à "--help".
Lisible, facile à retenir, pas de bibliothèque externe et code minimal.
la source
/-h(\b|elp)
Trollop est assez bon marché.
la source
Si vous voulez un analyseur de ligne de commande simple pour les commandes clé / valeur sans l'utilisation de gemmes:
Mais cela ne fonctionne que si vous avez toujours des paires clé / valeur.
Si vous n'avez pas besoin de vérification, vous pouvez simplement utiliser:
la source
Voici l'extrait de code que j'utilise en haut de la plupart de mes scripts:
Je déteste aussi avoir besoin de fichiers supplémentaires dans mes scripts rapides et sales. Ma solution est très proche de ce que vous demandez. Je colle un extrait de code de 10 lignes en haut de l'un de mes scripts qui analyse la ligne de commande et colle les arguments positionnels et bascule dans un objet Hash (généralement attribué à un objet que j'ai nommé arghash dans les exemples ci-dessous).
Voici un exemple de ligne de commande que vous voudrez peut-être analyser ...
Ce qui deviendrait un Hash comme celui-ci.
En plus de cela, deux méthodes pratiques sont ajoutées au hachage:
argc()
renverra le nombre d'arguments non-switch.switches()
renverra un tableau contenant les clés des commutateurs présentsC'est moyen pour permettre des trucs rapides et sales comme ...
arghash.argc == 2
)arghash[1]
obtient toujours le deuxième argument non-commutateur).arghash['--max=']
qui donne une valeur de '15' à partir de l'exemple de ligne de commande.arghash['-s']
qui prend la valeur true s'il est présent et nul s'il est absent.Testez la présence d'un interrupteur ou d'alternatives d'interrupteurs à l'aide d'opérations de réglage telles que
puts USAGETEXT if !(%w(-h --help) & arghash.switches()).empty?
Identifiez l'utilisation de commutateurs non valides à l'aide d'opérations définies telles que
puts "Invalid switch found!" if !(arghash.switches - %w(-valid1 -valid2)).empty?
Spécifiez les valeurs par défaut pour les arguments manquants à l'aide d'un simple
Hash.merge()
comme l'exemple ci-dessous qui remplit une valeur pour -max = si l'un n'a pas été défini et ajoute un quatrième argument de position s'il n'a pas été transmis.with_defaults = {'-max=' => 20, 3 => 'default.txt'}.merge(arghash)
la source
=
) peut faire une différence dans le code dont vous avez besoin.Ceci est très similaire à la réponse acceptée, mais
ARGV.delete_if
c'est ce que j'utilise dans mon analyseur simple . La seule vraie différence est que les options avec des arguments doivent être ensemble (par exemple-l=file
).la source
Apparemment, @WilliamMorgan et moi pensons pareillement. Je viens de publier hier soir sur Github ce que je vois maintenant est une bibliothèque similaire à Trollop (nommée comment?) Après avoir fait une recherche d'OptionParser sur Github, voir Switches
Il y a quelques différences, mais la philosophie est la même. Une différence évidente est que Switches dépend d'OptionParser.
la source
Je développe ma propre gemme d'analyseur d'options appelée Acclaim .
Je l'ai écrit parce que je voulais créer des interfaces de ligne de commande de style git et pouvoir séparer proprement les fonctionnalités de chaque commande en classes distinctes, mais il peut également être utilisé sans le cadre de commande complet:
Aucune version stable pour le moment, mais j'ai déjà implémenté certaines fonctionnalités telles que:
L'accent est mis sur les commandes, donc cela peut être un peu lourd pour une simple analyse de ligne de commande, mais cela fonctionne bien et je l'ai utilisé sur tous mes projets. Si vous êtes intéressé par l'aspect de l'interface de commande, consultez la page GitHub du projet pour plus d'informations et d'exemples.
la source
Supposons qu'une commande ait au plus une action et un nombre arbitraire d'options comme ceci:
L'analyse sans validation peut être comme ceci:
la source
https://github.com/soveran/clap
46LOC (à 1.0.0), aucune dépendance à l'analyseur d'options externe. Fait le travail. Probablement pas aussi complet que d'autres, mais c'est 46LOC.
Si vous vérifiez le code, vous pouvez facilement dupliquer la technique sous-jacente - attribuez des lambdas et utilisez l'arity pour vous assurer que le nombre correct d'arguments suit l'indicateur si vous ne voulez vraiment pas de bibliothèque externe.
Facile. Pas cher.
EDIT : le concept sous-jacent se résume car je suppose que vous pouvez le copier / coller dans un script pour créer un analyseur de ligne de commande raisonnable. Ce n'est certainement pas quelque chose que je consacrerais à la mémoire, mais utiliser la lambda arity comme un analyseur bon marché est une idée nouvelle:
la source
Je vais partager mon propre analyseur d'options simple sur lequel je travaille depuis un certain temps. Il ne s'agit que de 74 lignes de code, et il fait les bases de ce que fait l'analyseur d'options interne de Git. J'ai pris OptionParser comme inspiration, ainsi que celle de Git.
https://gist.github.com/felipec/6772110
Cela ressemble à ceci:
la source
EasyOptions ne nécessite aucun code d'analyse d'option. Écrivez simplement le texte d'aide, exigez, c'est fait.
la source