mkdist.php
mkdist est un générateur d'arborescence. En suivant les instructions d'un fichier spécial appelé manifest, il permet de générer une arborescence complète à partir d'une autre, de copier des fichiers d'un endroit à un autre, en les passant éventuellement par le pré-processeur.
Cela est utile pour générer une version précise d'une application php. Par exemple, si on veut faire deux versions de son application, une à destination de développeurs, et une autre optimisée pour un usage en production, la première aura certainement plus de fichiers (fichier de tests, outils etc...) que la deuxième. En réalisant un manifest pour chacune des versions, vous pouvez alors générer vos deux versions avec deux simples commandes.
Combiné avec l'usage d'un Makefile, vous avez alors un système de génération de versions évolué et rapide.
Exécution
mkdist est un script à exécuter en ligne de commande. Il prend trois arguments :
- le nom du fichier manifest à analyser
- le chemin d'un répertoire source (A)
- le chemin d'un répertoire destination (B)
Il copiera alors tous les fichiers indiqués dans le manifest, de A vers B. En les passant éventuellement au préprocesseur.
php mkdist.php monManifest.mn /home/laurent/sources/trunk/ /home/laurent/dist/
Vous avez aussi la possibilité d'indiquer l'option -v pour que mkdist affiche la liste des fichiers qu'il copiera
php mkdist.php -v monManifest.mn /home/laurent/sources/trunk/ /home/laurent/dist/
Les manifests
Les fichiers manifests ne sont rien d'autre qu'une liste de fichiers que mkdist doit copier d'un répertoire à un autre.
Chaque ligne d'un fichier manifest indique une commande à mkdist. Voici ces commandes :
- cd, dd ou sd suivi d'un chemin : indique des changements de répertoires à faire à partir des répertoires indiqués en argument à mkdist
- un espace suivi d'un nom de fichier : copie le fichier indiquer à partir du répertoire source courant vers le répertoire destination courant.
- une étoile (*) suivit d'un espace et d'un nom de fichier : idem que précédemment, mais passe aussi le fichier au préprocesseur.
Commandes cd, dd, sd
mkdist garde en mémoire à tout instant deux chemins de répertoires : un chemin de répertoire où prendre un fichier, et un chemin de répertoire où copier les fichiers. Au départ, ces deux chemins sont ceux donnés en argument, mais il est possible de les modifier en leur ajoutant des chemins de sous-répertoires. Ces modifications se font avec les commandes cd, dd, et sd.
- cd permet d'indiquer un même sous répertoire aux deux chemins
- dd permet de modifier uniquement le chemin du répertoire destination
- sd permet de modifier uniquement le chemin du répertoire source.
Exemple. Imaginons que l'on appelle mkdist comme ceci :
php mkdist.php monManifest.mn /home/laurent/sources/ /home/laurent/dist/
Voici ce que valent les chemins après chacune des commandes suivantes exécutées dans l'ordre :
| cd foo | /home/laurent/sources/foo/ | /home/laurent/dist/foo |
| sd bar | /home/laurent/sources/bar/ | /home/laurent/dist/foo |
| dd blob | /home/laurent/sources/bar/ | /home/laurent/dist/blob |
| cd foo/lib | /home/laurent/sources/foo/lib/ | /home/laurent/dist/foo/lib/ |
| dd foo/lib/core/ | /home/laurent/sources/foo/lib/ | /home/laurent/dist/foo/lib/core/ |
Bien sûr, normalement, après chaque commande cd/dd/sd, vous indiquez généralement une liste de fichiers à copier.
Exemple de fichier manifest
Voici un extrait d'un fichier manifest de jelix. La plupart du temps, l'arborescence du répertoire cible est la même que le répertoire source. C'est pourquoi on utilise souvent que la commande cd :
cd . README cd lib .htaccess cd lib/jelix CHANGELOG CREDITS * init.php INSTALL LICENCE VERSION cd lib/jelix/auth jAuth.class.php jAuthDriverDb.class.php jAuthUser.class.php cd lib/jelix/acl jAcl.class.php jAclUserGroup.class.php jAclManager.class.php cd lib/jelix/core jConfig.class.php jContext.class.php jController.class.php jCoordinator.class.php
Si on exécute mkdist comme ceci :
php mkdist.php jelix.mn /home/laurent/sources/ /home/laurent/dist/
On obtient alors dans le répertoire /home/laurent/dist :
README lib/.htaccess lib/jelix/ lib/jelix/CHANGELOG lib/jelix/CREDITS lib/jelix/init.php lib/jelix/INSTALL lib/jelix/LICENCE lib/jelix/VERSION lib/jelix/auth/ lib/jelix/auth/jAuth.class.php lib/jelix/auth/jAuthDriverDb.class.php lib/jelix/auth/jAuthUser.class.php lib/jelix/acl/ lib/jelix/acl/jAcl.class.php lib/jelix/acl/jAclUserGroup.class.php lib/jelix/acl/jAclManager.class.php lib/jelix/core/ lib/jelix/core/jConfig.class.php lib/jelix/core/jContext.class.php lib/jelix/core/jController.class.php lib/jelix/core/jCoordinator.class.php
Il arrive parfois que l'on veuille une arborescence différente dans le répertoire cible. Les commandes sd et dd sont alors utiles :
dd . sd lib/jelix/tpl/ * jTpl.class.php * jTplCompiler.class.php jtpl_standalone_prepend.php VERSION CREDITS LICENCE sd lib/jelix/tpl/plugins/common dd plugins/common function.include.php modifier.cat.php modifier.count_characters.php sd lib/jelix/tpl/plugins/html dd plugins/html modifier.nl2br.php sd lib/jelix/tpl/plugins/text dd plugins/text
Si on exécute mkdist comme ceci :
php mkdist.php jtpl.mn /home/laurent/sources/ /home/laurent/dist/
mkdist s'attend alors à trouver dans /home/laurent/sources/ l'arborescence suivante :
lib/jelix/tpl/ lib/jelix/tpl/jTpl.class.php lib/jelix/tpl/jTplCompiler.class.php lib/jelix/tpl/jtpl_standalone_prepend.php lib/jelix/tpl/VERSION lib/jelix/tpl/CREDITS lib/jelix/tpl/LICENCE lib/jelix/tpl/plugins/common/ lib/jelix/tpl/plugins/common/function.include.php lib/jelix/tpl/plugins/common/modifier.cat.php lib/jelix/tpl/plugins/common/modifier.count_characters.php lib/jelix/tpl/plugins/html/ lib/jelix/tpl/plugins/html/modifier.nl2br.php lib/jelix/tpl/plugins/text/
et génèrera l'arborescence suivante dans /home/laurent/dist/ :
jTpl.class.php jTplCompiler.class.php jtpl_standalone_prepend.php VERSION CREDITS LICENCE plugins/common/ plugins/common/function.include.php plugins/common/modifier.cat.php plugins/common/modifier.count_characters.php plugins/html/ plugins/html/modifier.nl2br.php plugins/text/
Remarques
- si vous indiquez un répertoire cible (avec dd ou cd), il sera créé, même si vous n'indiquez pas par la suite de fichiers à copier.
- il n'y a pour le moment pas de possibilité de renommage de fichier
- mkdist n'efface pas au préalable le contenu du répertoire cible. Il écrase les fichiers existants. Ce qui veut dire que les fichiers copiés par un manifest précédent mais non présents dans un nouveau manifest, ne seront pas effacés.
