Exécuter des services avec une version Node précise (nvm / fnm)
Vous pointez Runyard vers votre projet, il démarre le service, et vous obtenez command not found: node ou pire, Node système (la mauvaise version) s'exécute et votre build échoue. La cause est la même dans les deux cas.
Le piège
nvm et fnm sont des fonctions shell, pas des binaires autonomes. Ils s'installent en ajoutant du code d'init à votre .zshrc ou .bashrc. L'environnement de Runyard est nettoyé et ne charge pas ces fichiers, donc ni l'un ni l'autre ne s'initialisent et le node qu'ils exposent reste invisible.
Il existe deux solutions propres, chacune avec ses compromis.
Option A : épingler une version Node dans paths
Ajoutez le répertoire exact du binaire node au tableau paths de Runyard. Fonctionne pour n'importe quel service. Aucun shell à encapsuler.
{
"paths": [
"~/.nvm/versions/node/v22.0.0/bin",
"/opt/homebrew/bin"
],
"tools": [
{
"name": "API",
"type": "service",
"directory": "~/Code/votre-projet",
"startCommands": [{
"label": "Dev",
"command": "npm",
"args": ["run", "dev"],
"startupCheck": "http://localhost/health",
"startupFallbackPort": 3000
}]
}
]
}
Avantages : Simple. Pas de surcoût de démarrage shell. Fonctionne pareil pour tous les services qui ont besoin de ce Node.
Inconvénients : Le chemin est codé en dur. Quand vous mettez Node à jour, il faut modifier config.json pour la nouvelle version. Des projets différents sur des Node différents nécessitent des tableaux paths distincts par outil (utilisez paths au niveau de l'outil avec pathsOverride: false pour fusionner).
Option B : encapsuler la commande dans un shell de connexion (recommandé)
Laissez les fichiers d'init de votre shell faire leur travail. Runyard exécute la commande, votre shell source .zshrc, nvm / fnm s'initialise, et le .nvmrc / .node-version est respecté automatiquement.
{
"name": "API",
"type": "service",
"directory": "~/Code/votre-projet",
"startCommands": [{
"label": "Dev",
"command": "/bin/zsh",
"args": ["-lc", "npm run dev"],
"startupCheck": "http://localhost/health",
"startupFallbackPort": 3000
}]
}
Avantages : Bascule automatiquement la version Node selon .nvmrc / .node-version. Aucune dérive de configuration quand vous mettez Node à jour. Fonctionne identiquement à npm run dev lancé dans votre terminal.
Inconvénients : Démarrage légèrement plus lent (quelques centaines de millisecondes pour l'init du shell). Tout votre .zshrc s'exécute à chaque fois, y compris des invites et alias sans rapport.
Pourquoi ça fonctionne
/bin/zsh -lc 'cmd'démarre zsh comme shell de connexion (-l), ce qui charge.zprofile,.zshrcet les autres fichiers d'init.-c 'cmd'exécute ensuite votre commande dans ce shell.- Les scripts d'init de nvm et fnm enregistrent des hooks qui lisent
.nvmrc/.node-versiondepuis le répertoire courant. Comme Runyard fixe le répertoire de travail àdirectory, la bonne version est choisie automatiquement. - Une fois votre commande terminée, le shell se ferme. Pas d'invite interactive.
Prérequis
- nvm ou fnm installé et correctement configuré dans les fichiers d'init de votre shell (vous pouvez vérifier en lançant
node --versiondans une nouvelle fenêtre de terminal, depuis votre projet) - Un fichier
.nvmrcou.node-versionà la racine du projet (facultatif mais recommandé pour l'Option B)