← Tous les exemples
Shell environment
direnvmiseasdf

Charger .envrc ou mise.toml avant de démarrer un service

Votre projet dépend de direnv, mise ou asdf pour gérer ses variables d'environnement, ses secrets et ses versions d'outils. Dans un terminal tout fonctionne parce que les hooks d'init de votre shell s'occupent du chargement. Runyard, lui, démarre votre service avec un environnement vierge : aucun de ces hooks ne se déclenche, et le service tourne avec une configuration manquante ou périmée.

Le piège

direnv et mise exposent tous deux une sous-commande exec qui applique l'env propre au projet à un processus enfant, sans aucun hook shell. Vous encapsulez votre vraie commande avec. asdf n'a pas d'équivalent propre, donc pour asdf la voie la plus simple reste d'encapsuler la commande dans un shell de connexion.

Configuration qui fonctionne

direnv

{
  "name": "API",
  "type": "service",
  "directory": "~/Code/votre-projet",
  "startCommands": [{
    "label": "Dev",
    "command": "direnv",
    "args": ["exec", ".", "npm", "run", "dev"]
  }],
  "paths": ["/opt/homebrew/bin"]
}

direnv exec <chemin> <cmd...> charge <chemin>/.envrc, applique ses variables, puis exécute cmd dans cet environnement. Le . signifie « utilise le répertoire courant » (qui est le directory de l'outil).

mise

{
  "startCommands": [{
    "label": "Dev",
    "command": "mise",
    "args": ["exec", "--", "npm", "run", "dev"]
  }]
}

mise exec -- <cmd...> applique les versions d'outils et l'env du projet définis dans mise.toml ou .mise.toml, puis exécute cmd. Le séparateur -- est requis : sans lui, mise tente d'interpréter npm run dev comme ses propres drapeaux.

asdf (sans exec natif)

asdf n'expose pas de sous-commande exec, alors on revient au schéma du shell de connexion. Assurez-vous que le répertoire des shims d'asdf est dans paths, ou chargé par votre shell de connexion.

{
  "startCommands": [{
    "label": "Dev",
    "command": "/bin/zsh",
    "args": ["-lc", "npm run dev"]
  }]
}

Pourquoi ça fonctionne

Prérequis

Piège : l'invite direnv allow est invisible depuis Runyard

direnv invite normalement dans le terminal quand il détecte un .envrc nouveau ou modifié. À l'intérieur de Runyard, il n'y a pas de terminal pour cette invite : direnv journalise un « blocked » silencieusement et utilise l'env du parent à la place. Si votre service démarre mais se comporte comme si les variables d'env étaient absentes, ouvrez un terminal dans le répertoire du projet et exécutez direnv status.