/ tools

Synchronisation de la configuration entre différentes machines.

Je suis confronté à un problème de taille depuis quelques temps. J'utilise deux macbook pro au quotidien : un au boulot et un chez moi pour les projets perso. Mon problème est que je n'arrive jamais à avoir la même configuration de mes outils sur les deux machines.

Ça doit surement arriver à d'autres personnes, tous ceux qui comme moi ont ce que l'on appelle des "side projects", les passionnés qui bossent autant pour leur patron que pour eux-même.

Ce qui est génant c'est que, du coup, on utilise deux environnements de travail. Et même si lors de l'installation on a fait l'effort de les configurer exactement de la même manière, avec l'utilisation et le temps les deux environnements diffèrent forcément.

Et ça m'arrive tout le temps ! Je suis au boulot, je met a jour ma conf vim pour satisfaire à un besoin immédiat (ajout de plugins, nouveau thème, etc.); je rentre chez moi je n'utilise pas vim mais vscode et ne pense donc pas à appliquer mes nouveaux paramètres. Petit à petit les deux environnements de développement s'écartent l'un de l'autre.

Arrive le jour où en rentrant du boulot – où j'ai utilisé vim toute la journée — je dois l'utiliser aussi sur mon mac personnel : catastrophe !! Mon environnement personnel ne ressemble pas du tout à ce que mon cerveau s'attend à utiliser. Frustrant. Je dois me rappeler de ce que j'ai changé sur l'autre ordinateur pour l'appliquer ici aussi.

Lorsque l'on parle de visuel, on ne se laisse pas berner trop longtemps mais lorsqu'il s'agit de keybindings, de raccourcis, de snippets, etc. c'est beaucoup plus subtil et sournois parce qu'on ne va pas forcément se dire tout de suite que c'est un oubli de configuration.

Dernièrement, j'en ai eu un peu marre. Du coup, je me suis fait un petit outil que j'ai nommé configfile. Son but est de simplifier la gestion et le déploiement de mes différents fichiers de configuration entre mes différentes machines.

L'outil s'appuie sur git pour fonctionner. Mes fichiers de configurations sont versionné dans un répo git (dotfiles) et configfile m'aide à les déployer.

Versionning des fichiers de configuration

L'idée est que git s'occupe de centraliser les fichiers de configuration, de gèrer leurs modifications et leur différentes versions puisque c'est ce pour quoi il a été fait. Je ne veux pas non plus réinventer la roue.

Nous allons donc versionner tous nos fichiers de configuration. Leur mise à jours passera aussi par git tel un projet normal :

$ vim /scripts/terminal.sh
$ git commit -am "New welcome header in terminal"
$ git push

On modifie, on commit, on pousse. Simple et habituel.

Pour fonctionner correctement, configfile à besoin que le repo des fichiers de configuration soit organisé selon le schema suivant :

/scripts/
    /script1.sh
    /script2.js
    /script3
/files/
    /module1/
        /settings.json
        /file1
        /file2.json
    /module2/
        /settings.json
        /file3.sh
        /file4.txt
        /data/
            /file5
            /file6.sh
            /.file7
     /module3/
         /settings.json
         /...

On retrouve deux dossiers à la racine du repo :

  • scripts où l'on va ranger différents scripts
  • files où l'on va écrire tous nos fichiers de configurations.

files est organisé par modules. Par exemple un module vim (et donc un dossier vim dans files) où je vais mettre tous mes fichiers de confiuration lié à vim.

Chaque module, pour pouvoir être chargé par configfile, doit contenir un fichier appelé settings.json. Dans ce fichier on va indiquer où doivent partir chaque fichier du module :

{
  "files": [
    {
      "source-path": "vimrc",
      "target-path": "~/.vimrc",
      "global": true
    }
  ]
}

Ici le fichier vimrc du module vim doit être "deployé" dans le répertoire de l'utilisateur courant.

Utilisation de Configfile

Maintenant que l'utilisation et l'organisation du repo de fichiers et scripts de configuration sont claires, vous pouvez utiliser Configfile sans soucis.

Configfile étant écrit en Javascript, nous allons utiliser npm pour l'installer.

npm install -g configfile@latest

Pour vérifier que l'installation s'est bien passé, vous pouvez taper configfile -V. Cette commande devrait vous afficher la version de configfile qui est 0.2.1 au moment où j'écris cet article.

Initialisation des repos

La première commande à utiliser ensuite est:

configfile init

C'est une commande interactive pour vous aider à paramétrer Configfile. Elle vous demandera où sont versionnés vos fichiers de configuration et où est ce que vous souhaitez les positionner sur votre machine.

Listing des scripts et modules

Si vous souhaitez vous assurer que l'init s'est bien déroulé, que vous avez copiez la bonne adresse git et juste vous rafraichir la mémoire parce que vous ne savez plus comment vous avez appelé un module ou un script, deux commandes sont à votre disposition:

configfile scripts list # ou configfile s l
configfile modules list # ou configfile m l

Ces commandes liste respectivement tous les scripts et tous les modules disponibles sur l'installation actuelle.

Executer un script

Configfile est capable d'executer vos scripts, pour cela tapez la commande suivante:

configfile scripts run <nom du script> # ou configfile s r <nom du script>

Notez que le nom du script est celui affiché par configfile s l. Configfile crée un slug pour votre script, il sera donc différent du nom de votre fichier si celui-ci contient des espaces, et autres charatères spéciaux.

Deployer un module

Vos fichiers de configuration étant organisés en module, vous pouvez simplement demander à configfile de déployer ceux que vous souhaitez.

configfile modules deploy [nom du module...] # ou configfile m d [nom du module...]

Comme pour executer un script, le nom du module est celui affiché par configfile m l.

Trois possibilités s'offrent à vous avec cette commande :

  • ne pas mettre de nom de module; tous les modules disponibles seront déployés
  • mettre un nom de module; le module indiqué sera deployé
  • mettre plusieurs nom de module; seul les modules indiqués seront déployés

Le déploiement local

On peut parfois vouloir déployer un fichier non pas à telle adresse à partir de la racine du disque mais tout simplement dans le répertoire courant. Par exemple pour déployer une configuration standard de Eslint dans un nouveau projet.

configfile modules deploy [nom du module...] --local # ou configfile m d [nom du module...] -l

Vous indiquez donc à configfile qu'il faut déployer les modules indiqués mais en mode local.

Attention: seul les fichiers tagués comme étant disponible en mode local dans le fichier settings.json de leur module seront deployés via cette commande.

Annuler un deploiement

Attention, cette fonctionnalité est en cours d'écriture et n'est donc pas disponible dans la dernière version de Configfile sur npmjs.org (v0.3.0 au où j'écris ces mots)

Si vous souhaitez annuler un deploiement, la commande est la suivante:

configfile modules undeploy [nom du module...] # ou configfile m u [nom du module...]

Comme pour déployer un module, le nom du module est celui affiché par configfile m l.

Seuls les déploiements globaux sont traités par cette commande. Les déploiements locaux ne sont pas annulables de façon automatisée.


Tweetez moi si vous avez des questions, des remarques ou juste pour me dire ce que vous pensez de cet outil. Et bien-sûr, n'hésitez pas à partager si vous avez aimé cet article.