Foreman: Possible de prendre en charge les commandes multilignes en ligne ?

Créé le 7 nov. 2014  ·  9Commentaires  ·  Source: ddollar/foreman

Disons que j'ai ce stupide Procfile .

[marca@marca-mac2 ~]$ cat Procfile
find: find ./dev/git-repos -type f -mtime +3 -name '*.py' | xargs grep --max-count 1 'import' | head -n 3
[marca@marca-mac2 ~]$ foreman run find
./dev/git-repos/1pass/.tox/py26/bin/activate_this.py:import sys
./dev/git-repos/ansible/.tox/py26/lib/python2.6/site-packages/ansible/runner/action_plugins/copy.py:import os
./dev/git-repos/ansible/.tox/py34/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/timeout.py:from socket import _GLOBAL_DEFAULT_TIMEOUT

OK, c'est bête mais ça marche. Disons maintenant que je voulais le rendre plus joli, en décomposant la commande sur plusieurs lignes. La barre oblique inverse est un caractère de continuation de ligne assez standard...

[marca@marca-mac2 ~]$ cat Procfile
find: find \
          ./dev/git-repos \
          -type f \
          -mtime +3 \
          -name '*.py' | \
      xargs grep --max-count 1 'import' | \
      head -n 3
[marca@marca-mac2 ~]$ foreman run find
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

Pas d'amour.

Je peux contourner ce problème en plaçant la commande dans un script shell séparé :

[marca@marca-mac2 ~]$ cat Procfile
find: ./find.sh
[marca@marca-mac2 ~]$ cat find.sh
#!/bin/sh

find \
    ./dev/git-repos \
    -type f \
    -mtime +3 \
    -name '*.py' | \
xargs grep --max-count 1 'import' | \
head -n 3
[marca@marca-mac2 ~]$ foreman run find
./dev/git-repos/1pass/.tox/py26/bin/activate_this.py:import sys
./dev/git-repos/ansible/.tox/py26/lib/python2.6/site-packages/ansible/runner/action_plugins/copy.py:import os
./dev/git-repos/ansible/.tox/py34/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/timeout.py:from socket import _GLOBAL_DEFAULT_TIMEOUT

mais cela perd alors une partie de la simplicité et de la beauté du Procfile - ce serait bien si je pouvais le faire en ligne d'une manière ou d'une autre. foreman pourrait-il interpréter une barre oblique inverse à la fin de la ligne comme une continuation de ligne ?

Cc : @sudarkoff

Tous les 9 commentaires

Un exemple plus simple puisque le premier était un peu plus complexe pour essayer de transmettre un peu mieux la motivation.

[marca@marca-mac2 ~]$ cat Procfile
hello: echo \
    "Hello world"
[marca@marca-mac2 ~]$ foreman check
valid procfile detected (hello)
[marca@marca-mac2 ~]$ foreman run hello

[marca@marca-mac2 ~]$

Il est intéressant que foreman check pense que le fichier est valide ; cependant, il ne fonctionne pas comme on pourrait s'y attendre.

Honnêtement, je préfère le script shell séparé en termes de beauté et de simplicité. Le profil doit être court et agréable. Conservez les commandes et la logique compliquées dans les scripts shell. Personnellement, j'ai tendance à créer des scripts bin/* qui mappent 1:1 avec mes entrées Procfile.

D'accord, merci pour la réponse rapide !

Ensuite, foreman check devrait échouer si ce n'est pas un bogue, je pense.

Foreman ignore toutes les lignes qu'il n'analyse pas comme une entrée Procfile valide. Si vous souhaitez rendre cette logique plus restrictive, j'envisagerais une demande d'extraction, mais elle devrait être rétrocompatible avec tous les commentaires aléatoires, etc. que les gens ont mis dans leurs Procfiles.

S'il ignore les lignes invalides, cela semblerait rendre la commande check pas trop utile ? Ce n'est pas grave pour moi, sauf que je saurais ne pas trop m'y fier.

Et si Foreman::Engine#check_procfile et Foreman::Procfile#parse prenaient un argument optionnel strict qui serait faux par défaut sauf qu'il serait vrai pour foreman check et strict dire parse de ne pas ignorer les lignes qui ne correspondent pas à la regex ?

Ce qui précède permettrait au contremaître d'être rétrocompatible avec tout ce que les gens font de fou (par exemple : écrire des commentaires sans préfixer avec # ) tout en permettant check d'appliquer une norme plus stricte.

foreman check effectue suffisamment de vérifications pour savoir s'il serait capable de s'exécuter sur un Procfile donné et imprime les types de processus détectés. La seule information que vous devriez en tirer est de savoir si le contremaître lui-même fonctionnera avec succès ou non.

https://github.com/ddollar/foreman/blob/876354f28b0f1e182f8d0b8b67fc06307fd12631/lib/foreman/cli.rb#L68 -L71

Cette page vous a été utile?
0 / 5 - 0 notes