Les projets peuvent être configurés danspackage.json
(si vous utilisez des scripts npm et non des exécuteurs Nx) etprojet.json
(si tuutiliser des exécuteurs de tâches). Les deuxpackage.json
etprojet.json
les fichiers se trouvent dans le dossier de chaque projet. Nx fusionne les deux fichiers pour obtenir la configuration de chaque projet.
La configuration suivante créeconstruire
ettest
cibles pour Nx.
package.json
{ "nom":"mylib", "scénarios": { "test":"Est", "construire":"tsc -p tsconfig.lib.json" // la commande réelle ici est arbitraire}}
Vous pouvez invoquernx construire malib
ounx test mylib
sans aucune configuration supplémentaire.
Vous pouvez ajouter une configuration spécifique à Nx comme suit :
package.json
{ "nom":"mylib", "scénarios": { "test":"Est", "construire":"tsc -p tsconfig.lib.json",// la commande réelle ici est arbitraire "ignoré":"sortie 1"}, "nx": { "entrées nommées": { "défaut": ["{projectRoot}/**/*"], "production": ["!{projectRoot}/**/*.spec.tsx"]}, "cibles": { "construire": { "contributions": ["production","^fabrication"], "les sorties": ["{workspaceRoot}/dist/libs/mylib"], "dépend de": ["^construire"]}, "test": { "contributions": ["défaut","^fabrication"], "les sorties": [], "dépend de": ["construire"]} }, "scripts inclus": ["test","construire"]// Si vous souhaitez limiter les scripts que Nx voit, vous pouvez spécifier une liste ici.}}
entrées et entrées nommées
Lecontributions
array indique à Nx ce qu'il faut prendre en compte pour déterminer si une invocation particulière d'un script doit être un accès au cache ou non. Il existe trois types d'entrées :
Ensembles de fichiers
Exemples:
{projectRoot}/**.*.ts
- pareil que
{ensemble de fichiers : "{projectRoot}/**/*.ts"}
{workspaceRoot}/jest.config.ts
- pareil que
{ensemble de fichiers : "{workspaceRoot}/jest.config.ts}
Lecontributions
etentréesnommées
sont analysés avec les règles suivantes :
{projectRoot}
et{racine de l'espace de travail}
sont remplacés par le chemin approprié- UN
^
Le caractère au début de la chaîne signifie que cette entrée s'applique aux dépendances de projet du projet, et non au projet lui-même. - Tout le reste est traité avec lemini-matchbibliothèque
Entrées d'exécution
Exemples:
{exécution : "nœud -v"}
Notez que la valeur du résultat est hachée, elle n'est donc jamais affichée.
Variables d'environnement
Exemples:
{env : "MY_ENV_VAR"}
Notez que la valeur du résultat est hachée, elle n'est donc jamais affichée.
Dépendances externes
Pour les plugins officiels, Nx trouve intelligemment un ensemble de dépendances externes qu'il hache pour la cible.nx: commandes d'exécution
est une exception à cela. Étant donné que vous pouvez spécifier n'importe quelle commande à exécuter, il n'est pas possible de déterminer quelles dépendances externes, le cas échéant, sont utilisées par la cible. Pour être sûr, Nx suppose que la mise à jour de toute dépendance externe invalide le cache de la cible.
Remarque : les plugins communautaires sont également traités comme
nx: commandes d'exécution
Ce type d'entrée vous permet de remplacer ce comportement prudent en spécifiant un ensemble de dépendances externes à hacher pour la cible.
Exemples:
Les cibles qui n'utilisent que des commandes nativement disponibles dans le terminal ne dépendront d'aucune dépendance externe. Spécifiez un tableau vide pour ne hacher aucune dépendance externe.
{ "cibles": { "copier les fichiers": { "contributions": [{ "dépendances externes": []} ], "commande":"cp src/assets dist"} }}
Si une cible utilise une commande d'un package npm, ce package doit être répertorié.
{ "cibles": { "copier les fichiers": { "contributions": [{ "dépendances externes": ["argile"]} ], "commande":"npx apprentissage publier"} }}
Sortie des tâches dépendantes
Cette entrée nous permet de dépendre de la sortie, plutôt que de l'entrée des tâches dépendantes. Nous pouvons spécifier le modèle glob pour qu'il corresponde uniquement au sous-ensemble des fichiers de sortie. Letransitif
Le paramètre définit si la vérification et le modèle doivent être appliqués de manière récursive aux tâches dépendantes des tâches enfants.
Exemples:
{ "entrées nommées": { "défaut": ["{projectRoot}/**/*","globals partagés"], "production": ["défaut","!{projectRoot}/**/*.spec.ts"], "depp": [{« dependentTasksOutputFiles »:"**/*.d.ts","transitif":vrai}]}, "targetDefaults": { "construire": { "dépend de": ["^construire"], "contributions": ["production","depp"]} }}
Entrées nommées
Exemples:
intrants : ["production"]
- pareil que
"inputs": [{"input": "production", "projects": "self"}]
dans les versions antérieures à Nx 16, ou"entrées": [{"entrée": "production"}]
après version 16.
Souvent, le même glob apparaîtra à plusieurs endroits (par exemple, l'ensemble de fichiers prod exclura les fichiers de spécification pour tous les projets). Parce que les garder synchronisés est sujet aux erreurs, nous vous recommandons de définirentréesnommées
, que vous pouvez ensuite référencer dans tous ces endroits.
Utilisation de ^
Exemples:
entrées : ["^production"]
- pareil que
entrées : [{"input": "production", "projects": "dépendances"}]
avant Nx 16, ou"entrées": [{"entrée": "production", "dépendances": vrai }]
après version 16.
Semblable àdépend de
, les symboles "^" signifient "dépendances". C'est une idée très importante, alors illustrons-la par un exemple.
{ "cibles": { "test": { "contributions": ["défaut","^fabrication"]} }}
La configuration ci-dessus signifie que la cible de test dépend de tous les fichiers sources d'un projet donné et uniquement des sources prod (sources non test) de ses dépendances. En d'autres termes, il traite les sources de test comme privées.
les entrées et les entrées nommées sont également décrites dans la référence nx.json
Ce guide présente quelques exemples de personnalisation des entrées et des entrées nommées
Les sorties
Les cibles peuvent définir des sorties pour indiquer à Nx où la cible va créer des artefacts de fichier que Nx doit mettre en cache."outputs": ["{workspaceRoot}/dist/libs/mylib"]
indique à Nx oùconstruire
cible va créer des artefacts de fichier.
Cette configuration n'est généralement pas nécessaire. Nx est livré avec des valeurs par défaut raisonnables (importées dansnx.json
) qui implémentent la configuration ci-dessus.
Plus précisément, par défaut, les emplacements suivants sont mis en cache pour les compilations :
{workspaceRoot}/dist/{projectRoot}
,{projectRoot}/construction
,{projectRoot}/dist
,{projectRoot}/public
Exemple de base
Généralement, une cible écrit dans un répertoire ou un fichier spécifique. Ce qui suit indique à Nx de mettre en cachedist/libs/mylib
etbuild/libs/mylib/main.js
:
{ "cibles": { "construire": { "les sorties": [ "{workspaceRoot}/dist/libs/mylib", "{workspaceRoot}/build/libs/mylib/main.js"] } }}
Spécification des globs
Parfois, plusieurs cibles peuvent écrire dans le même répertoire. Lorsque cela est possible, il est recommandé de diriger ces cibles dans des répertoires distincts.
{ "cibles": { "build-js": { "les sorties": ["{workspaceRoot}/dist/libs/mylib/js"]}, "build-css": { "les sorties": ["{workspaceRoot}/dist/libs/mylib/css"]} }}
Mais si ce qui précède n'est pas possible, globs (parsé par leGlobSetBibliothèque Rust) peuvent être spécifiés comme sorties pour ne mettre en cache qu'un ensemble de fichiers plutôt que l'ensemble du répertoire.
{ "cibles": { "build-js": { "les sorties": ["{workspaceRoot}/dist/libs/mylib/**/*.{js,map}"]}, "build-css": { "les sorties": ["{workspaceRoot}/dist/libs/mylib/**/*.css"]} }}
Des modèles plus avancés peuvent être utilisés pour exclure des fichiers et des dossiers sur une seule ligne
{ "cibles": { "build-js": { "les sorties": ["{workspaceRoot}/dist/libs/!(cache|.next)/**/*.{js,map}"]}, "build-css": { "les sorties": ["{workspaceRoot}/dist/libs/mylib/**/!(secondaire).css"]} }}
dépend de
Les cibles peuvent dépendre d'autres cibles. Voici la partie pertinente du fichier de configuration :
{ "cibles": { "construire": { "dépend de": ["^construire"]}, "test": { "dépend de": ["construire"]} }}
Un scénario courant consiste à créer les dépendances d'un projet avant de générer le projet. C'est ce que le"dépend de": ["^build"]
propriété de laconstruire
cible configure. Il dit à Nx qu'avant de pouvoir construiremalib
il faut s'assurer quemalib
Les dépendances de sont également construites. Cela ne signifie pas que Nx va réexécuter ces versions. Si les bons artefacts sont déjà au bon endroit, Nx ne fera rien. S'ils ne sont pas au bon endroit, mais qu'ils sont disponibles dans le cache, Nx les récupérera dans le cache.
Un autre scénario courant est qu'une cible dépende d'une autre cible du même projet. Par exemple,"dépend de": ["construire"]
de latest
la cible indique à Nx qu'avant de pouvoir testermalib
il faut s'assurer quemalib
est construit, ce qui entraîneramalib
Les dépendances sont également en cours de construction.
Vous pouvez également exprimer des dépendances de tâches avec une syntaxe d'objet :
{ "cibles": { "construire": { "dépend de": [{ "projets":"dépendances",// "dépendances" ou "soi" "cible":"construire",// nom de la cible "paramètres":"ignorer" // "transférer" ou "ignorer", par défaut "ignorer"} ] } }}
Exemples
Vous pouvez écrire la configuration abrégée ci-dessus dans la syntaxe de l'objet comme ceci :
{ "cibles": { "construire": { "dépend de": [{"projets":"dépendances","cible":"construire"}]}, "test": { "dépend de": [{"projets":"soi","cible":"construire"}]} }}
Avec la syntaxe étendue, vous disposez également d'une troisième option disponible pour configurer la manière de gérer les paramètres transmis à la cible. Vous pouvez soit les transférer, soit les ignorer (par défaut).
{ "cibles": { "construire": { // transmet les paramètres passés à cette cible aux cibles de dépendance "dépend de": [{"projets":"dépendances","cible":"construire","paramètres":"avant"}] }, "test": { // ignore les paramètres passés à cette cible, ne sera pas transmis aux cibles de dépendance "dépend de": [{"projets":"dépendances","cible":"construire","paramètres":"ignorer"}] }, "peluche": { // ignore les paramètres passés à cette cible, ne sera pas transmis aux cibles de dépendance "dépend de": [{"projets":"dépendances","cible":"construire"}]} }}
Cela fonctionne également lors de la définition d'une relation pour la cible du projet lui-même en utilisant"projets": "moi"
:
{ "cibles": { "construire": { // transmet les paramètres passés à cette cible à la cible du projet "dépend de": [{"projets":"soi","cible":"pré-construction","paramètres":"avant"}] } }}
De plus, lorsque vous utilisez la syntaxe d'objet étendue, vous pouvez spécifier des projets individuels dans la version 16 ou supérieure.
{ "cibles": { "construire": { // Exécutez is-even:pre-build et is-odd:pre-build avant cette cible "dépend de": [{"projets": ["est même","est impair"],"cible":"pré-construction"}] } }}
Cette configuration n'est généralement pas nécessaire. Nx est livré avec des valeurs par défaut raisonnables (importées dansnx.json
) qui implémentent la configuration ci-dessus.
Mots clés
Vous pouvez annoter vos projets avecMots clés
comme suit:
package.json
{ "nom":"mylib", "nx": { "Mots clés": ["portée:monéquipe"]}}
Tu peuxconfigurer les règles de charpie à l'aide de ces balisespour, par exemple, s'assurer que les bibliothèques appartenant àmon équipe
ne dépendent pas des bibliothèques appartiennent àl'équipe
.
Dépendancesimplicites
Nx utilise une puissante analyse du code source pour déterminer le graphique de projet de votre espace de travail. Certaines dépendances ne peuvent pas être déduites statiquement, vous pouvez donc les définir manuellement comme ceci. LeDépendancesimplicites
la propriété est analysée avec lemini-matchbibliothèque, afin que vous puissiez revoir cette syntaxe pour des cas d'utilisation plus avancés.
package.json
{ "nom":"mylib", "nx": { "dépendances implicites": ["une autre lib"]}}
Vous pouvez également supprimer une dépendance comme suit :
package.json
{ "nom":"mylib", "nx": { "dépendances implicites": ["!une autre lib"] # indépendamment de ce que pense Nx,"mylib"ne dépend pas de"une autre lib"}}
Une dépendance implicite pourrait également être un modèle glob :
package.json
{ "nom":"mylib", "nx": { "dépendances implicites": ["boutique-*"] #"mylib"dépend de tous les projets commençant par"boutique-"}}
Inclure les fichiers package.json en tant que projets dans le graphique
N'importe quelpackage.json
fichier référencé par leespaces de travail
propriété à la racinepackage.json
fichier sera inclus en tant que projet dans le graphique. Si vous utilisez Lerna, les projets définis dansclay.json
sera inclus. Si vous utilisez pnpm, les projets définis danspnpm-workspace.yml
sera inclus.
Si vous souhaitez ignorer unpackage.json
fichier, excluez-le de ces outils. Par exemple, vous pouvez ajouter!packages/monprojet
auespaces de travail
propriété.
Ignorer les scripts package.json
Nx fusionne les scripts package.json avec vos cibles définies dans project.json. Si vous souhaitez que certains scripts ne soient utilisés que comme cibles Nx, vous pouvez les spécifier dans le champscripts inclus
propriété du package.json du projet.
{ "nom":"ma bibliothèque", "version":"0.0.1", "scénarios": { "construire":"tsc", "post-installation":"nœud ./tâches/postinstall"}, "nx": { "scripts inclus": ["construire"]}}