Aller au contenu

Ajouter à un projet existant

Tous les projets ne commencent pas avec pnpm create @aws/nx-workspace. Si vous avez déjà un espace de travail Nx — ou un monorepo auquel vous pouvez ajouter Nx — vous pouvez adopter @aws/nx-plugin de manière incrémentale sans recréer votre projet.

  • Git
  • Node >= 22 (Nous recommandons d’utiliser quelque chose comme NVM pour gérer vos versions de node)
    • vérifiez en exécutant node --version
  • UV >= 0.5.29
    1. installez Python 3.14 en exécutant : uv python install 3.14.0
    2. vérifiez avec uv python list --only-installed

Si votre projet n’utilise pas encore Nx, ajoutez-le d’abord avec nx init. C’est une étape que Nx lui-même gère ; le plugin s’appuie sur un espace de travail Nx fonctionnel. Cela fonctionne sur un package simple, un espace de travail npm/pnpm/yarn/bun, un Turborepo ou un monorepo Lerna :

Terminal window
pnpm dlx nx@23.1.1 init

Suivez les invites pour ajouter Nx à votre espace de travail. Pour plus de détails, consultez la documentation Nx.

Nx et le plugin sont distribués sous forme de packages npm, donc un projet sans outillage Node.js a besoin d’un package.json racine minimal avant que nx init puisse faire quoi que ce soit d’utile :

package.json
{
"name": "my-project",
"private": true,
"type": "module"
}

Créez ce fichier, puis exécutez nx init et ajoutez le plugin comme d’habitude. Votre outillage de langage existant reste intact — les projets Nx générés par le plugin (y compris les projets Python) cohabitent avec votre code existant, et vous pouvez intégrer votre build existant dans Nx de manière incrémentale.

Pour placer vos projets existants sous Nx, vous avez plusieurs options selon le langage :

  • Langages avec un plugin Nx officielJava (Gradle ou Maven) et .NET ont des plugins dédiés qui infèrent automatiquement les tâches de vos projets. Ajoutez celui qui convient, par exemple nx add @nx/gradle, nx add @nx/maven ou nx add @nx/dotnet.
  • Langages avec un plugin communautaire — par exemple Go (@nx-go/nx-go) ou Rust (@monodon/rust). Parcourez le registre de plugins Nx pour d’autres.
  • Tout autre langage — ajoutez un project.json à chaque projet et définissez ses targets pour exécuter vos commandes de build existantes, afin que nx build <project> (et nx run-many) les pilotent. Consultez le guide de l’espace de travail pour savoir comment project.json et les targets sont configurés.

Le plugin est conçu pour les monorepos — il génère chaque projet dans son propre répertoire sous packages/. Si vous partez d’un projet à package unique (un package.json à la racine avec votre source directement en dessous, sans workspaces), déplacez votre package existant dans packages/ avant d’adopter le plugin afin que votre projet se trouve aux côtés de ceux que le plugin génère :

  1. Créez un répertoire packages/<votre-package>/ et déplacez-y votre source, package.json et tsconfig.json.

  2. Créez un nouveau package.json racine qui agit comme manifeste de l’espace de travail plutôt que comme un projet lui-même :

    package.json
    {
    "name": "<your-workspace>",
    "private": true,
    "type": "module"
    }
  3. Déclarez l’espace de travail pour que votre gestionnaire de packages découvre les projets sous packages/. Pour pnpm, ajoutez un pnpm-workspace.yaml :

    pnpm-workspace.yaml
    packages:
    - packages/*

    Pour npm/yarn/bun, ajoutez plutôt un champ workspaces au package.json racine :

    package.json
    {
    "workspaces": ["packages/*"]
    }
  4. Exécutez nx init (si ce n’est pas déjà fait), puis ajoutez le plugin.

Utilisez nx add, qui installe le plugin à une version compatible avec votre installation Nx, puis exécute son générateur init pour configurer votre espace de travail :

Terminal window
pnpm nx add @aws/nx-plugin

Une fois terminé, votre espace de travail est prêt — choisissez les générateurs dont vous avez besoin et commencez à générer des projets.

L’ajout du plugin apporte les modifications déterministes dont un espace de travail a besoin pour exécuter les générateurs du plugin. Il préserve le format de module de votre espace de travail : un espace de travail dont le package.json racine a type: "module" reste en ESM, tout le reste reste en CommonJS, et le code généré suit le mouvement. Il n’écrase pas les fichiers existants, et vous devrez peut-être apporter quelques modifications manuelles après cette étape en fonction de votre configuration existante.

Il crée ou met à jour les fichiers suivants :

  • aws-nx-plugin.config.mts enregistre votre fournisseur IaC choisi (CDK ou Terraform) et votre moteur de conteneurs ; les générateurs lisent iac.provider depuis ici
  • nx.json enregistre les générateurs de synchronisation (@nx/js:typescript-sync et @aws/nx-plugin:ts#sync) sur la target compile afin que les références de projet TypeScript restent synchronisées
  • tsconfig.json une configuration TypeScript racine référençant les projets de votre espace de travail, que la synchronisation TypeScript de Nx maintient à jour
  • tsconfig.base.json les options de compilateur partagées que les projets TypeScript du plugin étendent (voir ci-dessous pour ce qu’il contient)
  • pnpm-workspace.yaml (pnpm uniquement) autorise les scripts de build dont les dépendances du plugin ont besoin (@swc/core, esbuild, nx, sharp)
  • package.json scripts de commodité pour les tâches courantes, plus les devDependencies @aws/nx-plugin, @aws/nx-plugin-mcp, nx, @nx/js, @nx/workspace, typescript et Biome
  • biome.json configuration par défaut du formateur et du linter Biome
  • .mcp.json configure le serveur MCP pour les agents de codage pris en charge sauf si désactivé (également les équivalents .cursor/, .kiro/, .gemini/, .vscode/ et .codex/). Il exécute le @aws/nx-plugin-mcp propre à l’espace de travail, donc le serveur correspond toujours à la version installée dans votre espace de travail

La configuration du serveur MCP peut être désactivée avec --mcp=false.

Cliquez ici pour voir les options de compilateur qu'un tsconfig.base.json créé contient.
ParamètreTypePar défautDescription
iac cdk | terraformcdkLe fournisseur IaC préféré.
mcp booleantrueIndique s'il faut configurer le plugin Nx pour le serveur AWS MCP afin qu'il soit utilisé par les agents de codage.
containers infer | docker | finchinferLe moteur de conteneurs à utiliser pour build/push/login. 'infer' choisit docker s'il est installé, sinon finch (en se repliant sur docker si aucun des deux n'est installé).
preferInstallDependencies booleantrueIndique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors du traitement par lots de plusieurs générateurs (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

nx build <project> ne fonctionne plus pour une bibliothèque TypeScript existante

Section intitulée « nx build <project> ne fonctionne plus pour une bibliothèque TypeScript existante »

La première exécution de ts#project configure le plugin @nx/js/typescript pour inférer la target de build TypeScript comme compile (le plugin réserve build pour orchestrer lint, compile et test). Les bibliothèques existantes qui s’appuient sur la target build inférée sont également inférées comme compile — exécutez nx run <project>:compile, ou utilisez nx run-many --target build,compile. Les bibliothèques avec une target build explicite dans leur project.json ne sont pas affectées.

Les références de projet TypeScript nécessitent une synchronisation. init enregistre les générateurs de synchronisation ; exécutez :

Terminal window
pnpm nx sync

pnpm ignore les scripts d’installation pour les packages qui ne sont pas autorisés. init autorise ceux dont l’outillage du plugin a besoin (@swc/core, esbuild, nx, sharp) dans pnpm-workspace.yaml, mais le blocage peut se produire pendant nx add @aws/nx-plugin lui-même — avant que init ne soit exécuté. Exécutez pnpm approve-builds et approuvez les packages listés (ou ajoutez-les sous allowBuilds:), puis relancez l’installation.

nx sync se bloque, ou plugin worker ... exited before the connection was established

Section intitulée « nx sync se bloque, ou plugin worker ... exited before the connection was established »

Si deux versions différentes de nx sont présentes dans le même arbre node_modules (exécutez npm ls nx pour confirmer), leur IPC plugin-worker se bloque. Le générateur init épingle la devDependency nx racine à la version que les propres packages @nx/* du plugin résolvent, mais une installation ultérieure d’un autre package @nx/* à une version de patch différente peut réintroduire l’incompatibilité. Alignez chaque entrée nx et @nx/* dans votre package.json racine sur une seule version et réinstallez.

Votre espace de travail a TypeScript 7 installé, que Nx ne prend pas encore en charge — les plugins de Nx s’appuient sur l’API de compilateur en processus de TypeScript, que TypeScript 7 ne fournit plus. Épinglez typescript dans votre package.json racine à la version que le plugin utilise (le générateur init installe une version compatible) et réinstallez.

Votre package.json racine est enregistré comme un projet Nx (il a une clé "nx", que nx init ajoute pour un repo à package unique) et porte un script build de nx run-many --target build. Nx infère alors une target build sur la racine qui s’appelle elle-même. Déplacez votre source dans packages/<votre-package>/ pour que la racine devienne un manifeste d’espace de travail plutôt qu’un projet — voir Projets à package unique. (Les propres presets standalone de Nx évitent cela en définissant "nx": { "includedScripts": [] } sur le package racine ; vous pouvez faire de même comme alternative plus rapide.)

Erreurs TypeScript dans vos projets existants après l’ajout du plugin (TS6059, TS7016, TS5011, NG4006)

Section intitulée « Erreurs TypeScript dans vos projets existants après l’ajout du plugin (TS6059, TS7016, TS5011, NG4006) »

Les propres projets générés du plugin portent les paramètres TypeScript dont ils ont besoin dans leur tsconfig.lib.json par projet, donc ils se construisent indépendamment de votre tsconfig.base.json. Ces erreurs apparaissent plutôt dans un projet préexistant qui hérite d’un tsconfig.base.json créé par init (avec composite/emitDeclarationOnly/nodenext) mais n’est pas compatible avec ces paramètres — par exemple, le compilateur Angular rejette emitDeclarationOnly (NG4006), ou un projet qui définit outDir sans rootDir en a maintenant besoin (TS5011). Ajoutez des surcharges tsconfig par projet redéclarant les options conflictuelles pour ces projets (par exemple "rootDir": "src"), ou pointez les projets du plugin et vos projets vers des configs de base séparées.

init ne réécrit jamais un tsconfig.base.json existant, précisément pour qu’il ne puisse pas casser silencieusement les projets qui en héritent — résoudre ces incompatibilités est une décision que vous seul pouvez prendre pour votre base de code.