Question [Module] Forge: générateur de code PowerShell

Plus d'informations
il y a 7 ans 4 mois #22582 par Broeglin Dominique
Je souhaiterais partager avec la communauté un module générateur de code PowerShell.

C'est un module très simple basé sur des exemples existants dans d'autres langages comme yeoman ou les générateurs Rails.

Le module principal \"Forge\" github.com/dbroeglin/Forge implémente les fonctions de support pour d'autres modules \"Générateurs\". Il expose un seul cmdlet directement utilisable: New-ForgeScript (simplement à titre d'exemple).

Le premier module générateur un peu abouti est \"Forge.Module\" github.com/dbroeglin/Forge.Module . Sa fonction est de générer un squelette de module, comme par exemple:

[code:1]New-ForgeModule -Name PoshTodo -License MIT -Author Léa -Email Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.[/code:1]

qui génère:

[code:1]./PoshTodo
+
LICENSE
+
PoshTodo
| +---- PoshTodo.psd1
| +---- PoshTodo.psm1
+---- README.md
+---- Tests[/code:1]

On peut ensuite ajouter des squelettes de cmdlet à ce module de la manière suivante:

[code:1]cd PoshTodo
New-ForgeModuleFunction -Name New-PoshTodo[/code:1]

avec pour résultat le fichier contenant le cmdlet et le fichier de tests Pester:

[code:1]./PoshTodo
+
LICENSE
+
PoshTodo
| +---- New-PoshTodo.ps1
| +---- PoshTodo.psd1
| +---- PoshTodo.psm1
+---- README.md
+---- Tests
+---- Manifest.Tests.ps1
+---- New-PoshTodo.Tests.ps1[/code:1]

Forge.Module n'est pas très souple pour l'instant, il a une certaine opinion sur la forme que doit prendre un module. Mais il est très simple à customiser. Il suffit d'en prendre une copie et d'adapter les patrons de génération (écris en EPS : github.com/straightdave/eps ). Il suffit alors de l'appeler, par exemple, Forge.AcmeModule et de le publier dans le repository nuget interne de l'entreprise.

Pour ceux qui souhaitent générer un nouveau module générateur le module Forge.Generator github.com/dbroeglin/Forge.Module devrait permettre de générer un squelette de générateur (il est moins abouti que les autres).

Forge est mon premier module, je l'ai fait à la fois pour combler un besoin de générateur de module simple dans mon environnement professionnel et pour apprendre PowerShell et son système de modules. Du coup, toutes critiques, remarques, suggestions, aide (ou pull requests ;-)) sont les bienvenues. J'ai du commettre pas mal d'erreurs. Notamment, j'ai conçu ce module dans un cadre assez restreint, je ne suis pas certain qu'il puisse être généralisé. Ceci dit, si c'est le cas autant en faire profiter le plus grand nombre.<br><br>Message édité par: dbroeglin, à: 5/11/16 00:21

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 4 mois #22595 par Laurent Dardenne
Salut,
Plaster me semble offrir plus de possibilités pour la génération de squelette de projet. Notamment la construction d'un projet (Psake,PSSA, Publishing), son intégration dans VSCode et la publication de template sur la galery.
Ceci dit je n'ai pas regardé ton code.

Et pour EPS j'ai hésité à l'utiliser pour contourner les contraintes de remplacement (Runspace constraint) de Plaster. Je trouve que les exemples de EPS obscurcissent un peu la compréhension de son usage.
Surtout ils ne génèrent pas de code PS, mais du texte...

Ayant déjà eu ce besoin j'ai du coup continué sur ce que j'utilisais déjà . Principalement dans des 'build'.

Surtout que le templating de Plaster est d'un usage privé au manifeste (fichier XML de description), pas terrible :/

C'est dommage car chacun crée un 'moteur' de transformation de texte à sa sauce ;-).

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 4 mois #22599 par Broeglin Dominique
Hello!

Merci beaucoup pour ton retour!

Effectivement, j'avais vu Plaster dans ce forum un peu après avoir commencé à travailler sur Forge et j'avais discuté rapidement avec eux pour voir s'il y avait moyen de mutualiser les efforts. Mais, les contraintes de design qu'ils se fixent sont assez riches. Notamment, le manifest XML et toute la mécanique autour. J'avais besoin de quelque chose de tout simple.

Le templating devait également être très simple pour l'utilisateur. La contrainte que se fixe Plaster de limiter fortement ce qui est possible dans le template pour des raisons de sécurité n'est pas un problème dans mon contexte. D'autant que EPS est déjà utilisé.

Par ailleurs je voulais aussi l'aspect incrémental:
1. Je créé le module
2. Dans le module je peux créer une fonction autant de fois que nécessaire

Je n'ai pas d'état d'âme, si dans quelques mois Plaster offre tout ça j'arrêterai de travailler sur le sujet. C'est un peu l'objet de mon message, recueillir des avis pour savoir s'il existe une niche pour Forge. En attendant, il remplit le rôle que je souhaitais, donner aux admins de ma société un outil simple qui leur permet de générer un module standardisé.

Pour EPS et la compréhension de son fonctionnement, pourrais-tu me donner quelques exemples. Pour moi ça semblait assez clair la première fois que je suis tombé dessus. Mais, pour être honnête, venant de Rails, je cherchais un équivalent à ERB, donc ça a cliqué tout de suite. C'est un bon petit outil de templating généralise tout simple et très puissant (nous l'utilisons par exemple pour générer facilement des configurations texte très compliquées). J'avais contribué un peu au projet, je lui ferai un PR avec des corrections sur la documentation.

Je vais regarder ton outil, ça me donnera de la perspective.

Sinon, à propos de \&quot;ils ne génèrent pas de code PS, mais du texte\&quot;, je n'ai pas compris ta remarque. Pourrais-tu élaborer ce point ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 4 mois #22606 par Broeglin Dominique
Hello!

J'ai fait quelques améliorations sur Forge.Module. Le contenu provient presque à l'identique de Plaster, c'est la manière d'écrire le générateur et les templates qui changent. La version 0.2.0 permet d'écrire:

[code:1]New-ForgeModule -Name PoshTodo -License MIT -Author Léa -Email Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. ``
-Editor VSCode -Build PSake `
-Description \&quot;A Powershell TODO list handler\&quot;[/code:1]

Ce qui va générer le module, l'intégration Pester, ajouter le support pour Visual Studio Code et le même build PSake que Plaster. J'ai également ajouté l'option InvokeBuild pour le paramètre Build qui génère un build identique mais pour le module InvokeBuild.

Suite à une discussion avec Arnaud Petitjean, je me rends bien compte que Forge ou Plaster donnent (ou donnerons si je continue un peu à travailler dessus) le même résultat pour l'utilisateur final: Générer un module ou une resource en un appel. La différence est uniquement pour les utilisateurs qui produiraient ou modifieraient les générateurs. Pour eux, j'ai le sentiment que c'est plus simple à faire lorsqu'on fait du pur PowerShell (y compris dans les templates) plutôt que d'apprendre une mécanique comme Plaster. Il y a aussi le fait de pouvoir générer des \&quot;sous-composants\&quot; comme des fonctions à l'intérieur des modules déjà générés, etc. (par exemple: github.com/dbroeglin/Forge.Netscaler me permet de générer des fonctions avec leurs paramètres et leur documentation pour le module Netscaler sur lequel je travaille par ailleurs)

Si vous avez du temps, j'apprécierais un retour de la communauté, positif et négatif ;-) Les deux m'intéressent beaucoup. Mon objectif premier, qui était d'apprendre PowerShell et la manière dont on écrit un module, est atteint. Je peux donc laisser le projet disparaître sans regret s'il n'y a pas d'intérêt au delà.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 4 mois #22607 par Laurent Dardenne
Salut,
désolé pour la réponse tardive.

&gt;&gt;Le templating devait également être très simple pour l'utilisateur.
Oui mais si on veut qq chose de puissant sans mot-clés ou DSL les regex sont de rigueur, c'est ce qui fait la relative compléxité.


&gt;&gt;Dans le module je peux créer une fonction autant de fois que nécessaire
ça je n'ai pas compris et le premeir exemple donné ne fonctionne pas :/

&gt;&gt;C'est un peu l'objet de mon message, recueillir des avis pour savoir s'il existe une niche pour Forge.
L'intérêt de Plaster est surtout l'uniformatisation/standardisation comme peut l'être PSake ou Pester.

&gt;&gt;Pour moi ça semblait assez clair la première fois que je suis tombé dessus.
Le principe oui.

&gt;&gt;Pourrais-tu élaborer ce point ?
Ton exemple dans le répertoire Template démontre bien mieux l'usage de EPS que les exemples du site qui sont plus proche d'un mailing.

&gt;&gt;Le contenu provient presque à l'identique de Plaster
A voir. Dans Plaster les paramètres sont dynamiques et portés par le manifeste XML.

&gt;&gt;mais pour le module InvokeBuild.
Il y a eu une discussion sur le site du projet Plaster à ce sujet.
Je l'avais regardé il y qq temps mais je le trouvais un peu difficile d'accès.
L'outil a peut être évolué entre temps.

&gt;&gt;Pour eux, j'ai le sentiment que c'est plus simple à faire lorsqu'on fait du pur PowerShell (y compris dans les templates)
&gt;&gt;plutôt que d'apprendre une mécanique comme Plaster.

Oui lors de la rédaction d'un manifeste de test j'ai eu l'impression de faire du Powershell en XML !

L'implémentation de la rédaction et du paramétrage est effectivement à améliorer dans Plaster.

&gt;&gt;Je peux donc laisser le projet disparaître
Tu parles du module Forge ?

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 4 mois #22615 par Broeglin Dominique
Hello!

Merci beaucoup pour tes réponses.

&gt;&gt;Dans le module je peux créer une fonction autant de fois que nécessaire
&gt;ça je n'ai pas compris et le premeir exemple donné ne fonctionne pas :/

Désolé, pour ça, j'avais un bug dans la partie chargement du module et pas de test unitaire pour cette partie. C'est corrigé et testé automatiquement pour éviter une autre régression de ce genre.

Pour le fait de pouvoir créer une fonction, je reprends un principe des générateurs Rails. La génération ne s'arrête pas lors de la création initiale du module. Mais ensuite, dans le module, je vais vouloir ajouter une fonction (avec ses tests Pester et sa documentation), ou dans un autre type de module, une resource DSC. Dans le module Netscaler sur lequel je travail, je sais que j'ai 5 ou 6 cas typiques pour lesquels je veux générer du code. Du coup le workflow de travail est d'initialement créer le module:

[code:1]New-ForgeModule -Name PoshTodo -License MIT -Author Léa -Email Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. ``

-Editor VSCode -Build PSake `

-Description \&quot;A Powershell TODO list handler\&quot;[/code:1]

Puis pour chaque fonction que j'ajoute:

[code:1]cd PoshTodo
New-ForgeModuleFunction -Name New-PoshTodo[/code:1]

Ce qui me créé automatiquement PoshTodo/New-PoshTodo.ps1 et Tests/New-PoshTodo.Tests.ps1

&gt; L'intérêt de Plaster est surtout l'uniformatisation/standardisation comme peut l'être PSake ou Pester.

Tout à fait d'accord, sur le contenu généré, il faut générer la même chose. Ma proposition est plus sur la manière de créer des générateurs pour nos projets. Peut-être que je n'étais pas très explicite sur un point. Mon idée est que Forge ou Plaster est un support pour créer toutes sortes de générateurs, pas juste un générateur de modules. On devrait pouvoir créer des générateurs pour des resources DSC, pour des fonctions de tests, pour des fonctions typiques dans un gros projet, etc. Idéalement, quelqu'un qui écrit un module comme github.com/PowerShell/Operation-Validation-Framework qui nécessite que ses utilisateurs suivent une arborescence bien précise devrait pouvoir très facilement produire un générateur avec Forge ou Plaster. C'est pour ça que j'ai inclu très tôt dans ma réflection le fait de pouvoir générer un générateur via Forge.Generator et le fait de pouvoir composer des générateurs. Par exemple, si je souhaite créer un module mais que j'ai un contrainte supplémentaire dû à ma société, je peux créer un générateur qui hérite de Forge.Module et simplement ajouter la partie spécifique dans mon générateur (sans copier/coller)

&gt; Ton exemple dans le répertoire Template démontre bien mieux l'usage de EPS que les exemples du site qui sont plus proche d'un mailing.

OK, je comprends, j'ai relu le README. Effectivement, les exemples ne sont pas toujours très parlants. Si j'ai un peu de temps, je vais lui faire une PR pour améliorer la doc. Après, il faut aussi garder en tête que c'est un outil de template généraliste. On peut générer n'importe quel type de texte avec. Pas forcément du PS. Par exemple, ma première utilisation d'EPS a été pour générer des fichiers de configuration Apache automatiquement.

&gt;Oui lors de la rédaction d'un manifeste de test j'ai eu l'impression de faire du Powershell en XML !
&gt; L'implémentation de la rédaction et du paramétrage est effectivement à améliorer dans Plaster.


Exactement! De mon côté j'ai eu un flashback désagréable à l'époque où je faisais du java avec des scripts de build écrits en XML (Ant). L'idée de Forge n'est vraiment pas de générer des modules différents, mais simplement de proposer aux auteurs une forme alternative pour la génération. En résumé (XML + templates maison) vs (PowerShell + templates génériques contenant du PS pour la souplesse).

&gt;&gt;Je peux donc laisser le projet disparaître
&gt; Tu parles du module Forge ?

Oui, au delà d'apprendre PS, je ne vois le projet que comme une proposition d'amélioration, je n'ai de toute façon probablement pas le temps de maintenir un projet open source sur le long terme. En gros, le but est de montrer un fonctionnement différent et de proposer son intégration. Pas de regret, si la proposition n'est pas retenue. Je me débat trop souvent avec du code où on ré-invente la roue pour venir ajouter encore une roue différente à la communauté ;-)<br><br>Message édité par: dbroeglin, à: 16/11/16 07:13

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.123 secondes
Propulsé par Kunena