Les scripts (batch .bat, bash .sh, php .php…) permettent de laisser la machine se charger de certaines tâches répétitives. N’hésitez pas à mettre en script toute opération un peu complexe et régulièrement requise.

La ligne de commande

Comme dit dans un post récent sur JeuWeb par l’Omniscient, la ligne de commande est un outil essentiel de l’ordinateur, bien que trop peu abordé à l’école (ce serait un autre débat). Son intérêt réside dans sa capacité à lancer une succession de programmes pour accomplir une tâche donnée (commandes) et dans la possibilité de sauver l’ensemble de ces commandes dans un fichier (script) que l’on pourra alors ré-exécuter plus tard. Un script ne sert donc pas à faire, mais à faire faire.

Exemple avec Dracca

Voyons un peu l’exemple de Dracca. Dans ce projet, mes sources sont au format XML, et je dois donc les “compiler” pour en sortir les fichiers html (utilisés dans la version en ligne), le epub et le mobi (pour la version hors ligne). La transformation des XML en HTML se faire par le biais de fichiers XSL.

Screenshot de Netbeans
La structure de Dracca

Mais comment faire pour appliquer ces XSL aux XML? Par un script, bien sûr! Ainsi, j’ai un script .sh qui permet de faire toutes les opérations nécessaires à la compilation du gamebook. Par exemple, voici la partie qui se charge d’appliquer les XSL aux fichiers XML en utilisant xsltproc, et qui sauve le résultat dans des fichiers HTML:

#    Online Gamebook
function generateOnline {
	local startTime=$SECONDS
	
	echo -e "Generating online gamebook ($clang)..."
	
	if [ "$quick" = "0" ] ; then
		[[ "$bookOnlinePath" =~ ^(/[a-z0-9-]+){4,} ]] && rm -rf "$bookOnlinePath"
	fi
	
	[ -d "$bookOnlinePath" ] || mkdir "$bookOnlinePath"
	
	xsltproc --stringparam "gentype" "online" --stringparam "paragraphe" "regles" --stringparam "date" "$date" -o "$bookOnlinePath/rules.html" "$builderPath/xsl/$clang/gamebook-html.xsl" "$bookRootOutputPath/book-full.xml"
	buildAllParagraphs "online" "online/"
	xsltproc --stringparam "gentype" "online" --stringparam "bookinfospath" "$bookRootPath/resume.xml" -o "$bookOnlinePath/action-chart.html" "$builderPath/xsl/$clang/action-chart.xsl" "$basePath/univers/gameplay/feuille-aventure.xml"
	xsltproc --stringparam "gentype" "online" -o "$bookOnlinePath/fighting-table.html" "$builderPath/xsl/$clang/fighting-table.xsl" "$basePath/univers/gameplay/table-de-combat.xml"
	xsltproc --stringparam "gentype" "online" -o "$bookOnlinePath/elements-table.html" "$builderPath/xsl/$clang/elements-table.xsl" "$basePath/univers/gameplay/table-des-elements.xml"
	
	duration "Online generationg ($clang) done" "$startTime"
}
La validation des XML par le script

D’autres parties du script servent à faire d’autres choses, comme construire le graphe des chemins possibles, en utilisant DOT, ou bien vérifier que chaque XML est bien valide en se servant de fichiers XSD. Les scripts permettent donc de réaliser tout un tas de commandes complexes en un seul clic (une fois que vous avez écrit le script, bien évidemment!).

Les scripts dans NetBeans

On gagne donc énormément de temps en créant des scripts pour les tâches récurrentes, mais peut-on en gagner encore plus en les exécutant sans quitter son IDE? Oui! Pour cela, il suffit de créer une configuration [1], puis d’indiquer qu’il s’agit d’un script [2] (CLI). Si votre script est un batch, utilisez-le en guise d’interpréteur [3]; si c’est un script PHP, laissez l’interpréteur par défaut et indiquez votre script en guise d’index; si c’est un script .sh, créez un fichier .bat en charge de le lancer et utilisez ce .bat comme interpréteur. Après, passez les arguments nécessaires à votre script [4], et indiquez son répertoire de travail si nécessaire [5]. Vérifiez que la commande finale est cohérente [6] et sauvez votre configuration. Il ne vous restera alors plus qu’à la lancer d’un clic [7] ou via le raccourcis (F6 chez moi). Vous pouvez ensuite passer d’une configuration à l’autre via le menu déroulant [1].

Créer la configuration NetBeans pour lancer son script

Pour ma part, Dracca possède énormément de configuration qui peuvent lancer les tests Selenium, ou Gzipper le projet, ou compiler uniquement les pages que j’ai modifiées, ou compiler tout le gamebook (générant les epub et mobi dans la foulée), etc.

En conclusion, n’hésitez pas à vous servir de scripts pour lancer des traitements complexes ou successifs. Vous pourrez alors soit les lancer depuis NetBeans, soit les lancer directement depuis Windows (en double-cliquant dessus, ou en créant un raccourcis vers votre script, ce qui vous permettra de lui passer des arguments).

Le raccourci de déploiement d’ECLERD lance un script de déploiement

Ant et Phing

Quand on commence à mettre en place des scripts en ligne de commande, écrits en shell, en Windows Batch ou en PHP, on finit par se poser la question de leur intégration dans l’IDE, et par tomber sur “Ant” et “Phing”. Ces deux frameworks permettent justement de faire de l’automatisation de tâches. Quel différence avec un script? Ant et Phing sont souvent bien intégrés aux IDEs et au process de développement d’un projet web.

Du coup, lequel choisir? Je vous répondrai: aucun. Vous n’en avez peut-être juste pas besoin. Pour ma part, je n’ai utilisé aucun de ces outils-là… jusqu’à ce que je découvre IntelliJ. En effet, dans NetBeans, l’intégration Ant ou Phing était fastidieuse. Avec IntelliJ, je l’ai trouvée très simple: on crée un fichier XML via l’interface de l’IDE, on le marque comme étant un script “Phing”, et c’est prêt. Je me suis donc tourné vers Phing (pourquoi pas Ant? honnêtement: c’est au pif) pour intégrer mes scripts PHP existants à mon process de développement. Maintenant, via l’interface Phing de l’IDE, je peux déployer un jeu web, lancer un check dessus, ou exécuter tout autre script PHP que j’ai créé pour une tâche spécifique.

IntelliJ intègre très bien Phing, et vous pouvez donc facilement créer une tâche Phing qui lancera l’un de vos scripts PHP, pour faire le déploiement de votre jeu par exemple.