Aller au contenu

Licence

Gérez les licences dans votre espace de travail : synchronisez les fichiers LICENSE et les en-têtes de code source pour votre propre code (license.source), et vérifiez que chaque dépendance respecte une liste de licences autorisées (license.dependencies).

  1. Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
  2. Ouvrez la console Nx dans VSCode
  3. Cliquez sur Generate (UI) dans la section "Common Nx Commands"
  4. Recherchez @aws/nx-plugin - license
  5. Remplissez les paramètres requis
    • Cliquez sur Generate
    ParamètreTypePar défautDescription
    license Apache-2.0 | MIT | ASLApache-2.0Identifiant de licence SPDX pour la licence choisie
    copyrightHolder stringAmazon.com, Inc. or its affiliatesLe détenteur des droits d'auteur, inclus dans le fichier LICENSE et les en-têtes des fichiers source par défaut.
    dependencyCheck booleantrueConfigure une cible license-check qui échoue lorsque les dépendances déclarent des licences en dehors de la liste autorisée configurée.
    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 de l'exécution de plusieurs générateurs en lot (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.

    Le générateur créera ou mettra à jour les fichiers suivants :

    • nx.json La cible lint est configurée pour exécuter le générateur de synchronisation des licences et dépend de la cible license-check
    • aws-nx-plugin.config.mts Configuration pour la synchronisation des sources de licence (license.source) et la vérification des dépendances (license.dependencies)

    Le générateur enregistre un générateur de synchronisation qui s’exécute dans le cadre de vos cibles lint pour garantir que vos fichiers sources contiennent les en-têtes de licence corrects, que vos projets contiennent des fichiers LICENSE, et que les métadonnées de licence sont définies dans package.json et pyproject.toml.

    Lorsque vous construisez vos projets (et qu’une cible lint s’exécute), le générateur de synchronisation des licences vérifiera que les licences correspondent à votre configuration. Si des incohérences sont détectées, vous recevrez un message tel que :

    Fenêtre de terminal
    NX The workspace is out of sync
    [@aws/nx-plugin:license#sync]: Project LICENSE files are out of sync:
    - LICENSE
    - packages/<my-project>LICENSE
    Project package.json files are out of sync:
    - package.json
    Project pyproject.toml files are out of sync:
    - pyproject.toml
    - packages/<my-python-project>/pyproject.toml
    License headers are out of sync in the following source files:
    - packages/<my-project>/src/index.ts
    - packages/<my-python-project>/main.py
    This will result in an error in CI.
    ? Would you like to sync the identified changes to get your workspace up to date?
    Yes, sync the changes and run the tasks
    No, run the tasks without syncing the changes

    Sélectionnez Yes pour synchroniser les modifications.

    Le générateur effectue trois tâches principales :

    Le générateur vérifie que tous les fichiers sources contiennent l’en-tête de licence approprié. L’en-tête est écrit comme premier commentaire de bloc ou série de commentaires linéaires (après un shebang le cas échéant).

    Le générateur vérifie que le fichier racine LICENSE et ceux des sous-projets correspondent à la licence configurée.

    3. Synchronisation des informations de licence dans les fichiers de projet

    Section intitulée « 3. Synchronisation des informations de licence dans les fichiers de projet »

    Le générateur met à jour les champs license des fichiers package.json et pyproject.toml selon la licence configurée.

    La configuration se trouve dans aws-nx-plugin.config.mts à la racine.

    La licence peut être modifiée via la propriété spdx :

    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    spdx: 'MIT',
    },
    },
    } satisfies AwsNxPluginConfig;

    Les fichiers LICENSE, package.json et pyproject.toml seront mis à jour en conséquence.

    Le détenteur du copyright et l’année peuvent aussi être configurés :

    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    spdx: 'MIT',
    copyrightHolder: 'Amazon.com, Inc. or its affiliates',
    copyrightYear: 2025,
    },
    },
    } satisfies AwsNxPluginConfig;

    Le contenu peut être défini de deux façons :

    1. Contenu inline :
    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    header: {
    content: {
    lines: [
    'Copyright: My Company, Incorporated.',
    'Licensed under the MIT License',
    'All rights reserved',
    ];
    }
    // ... format configuration
    }
    }
    }
    } satisfies AwsNxPluginConfig;
    1. Chargement depuis un fichier :
    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    header: {
    content: {
    filePath: 'license-header.txt'; // relatif à la racine
    }
    // ... format configuration
    }
    }
    }
    } satisfies AwsNxPluginConfig;

    Le format des en-têtes peut être spécifié par type de fichier :

    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    header: {
    content: {
    lines: ['Copyright notice here'],
    },
    format: {
    // Line comments
    '**/*.ts': {
    lineStart: '// ',
    },
    // Block comments
    '**/*.css': {
    blockStart: '/*',
    blockEnd: '*/',
    },
    // Block comments with line prefixes
    '**/*.java': {
    blockStart: '/*',
    lineStart: ' * ',
    blockEnd: ' */',
    },
    // Line comments with header/footer
    '**/*.py': {
    blockStart: '# ------------',
    lineStart: '# ',
    blockEnd: '# ------------',
    },
    },
    },
    },
    },
    } satisfies AwsNxPluginConfig;

    Options supportées :

    • blockStart: Texte avant le contenu
    • lineStart: Préfixe de ligne
    • lineEnd: Suffixe de ligne
    • blockEnd: Texte après le contenu

    Pour les formats non supportés :

    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    header: {
    content: {
    lines: ['My license header'],
    },
    format: {
    '**/*.xyz': {
    lineStart: '## ',
    },
    },
    commentSyntax: {
    xyz: {
    line: '##', // Define line comment syntax
    },
    abc: {
    block: {
    // Define block comment syntax
    start: '<!--',
    end: '-->',
    },
    },
    },
    },
    },
    },
    } satisfies AwsNxPluginConfig;

    Exclusion de fichiers de la synchronisation des en-têtes

    Section intitulée « Exclusion de fichiers de la synchronisation des en-têtes »

    Fichiers exclus par défaut selon .gitignore. Exclusion supplémentaire possible :

    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    header: {
    content: {
    lines: ['My license header'],
    },
    format: {
    '**/*.ts': {
    lineStart: '// ',
    },
    },
    exclude: ['**/generated/**', '**/dist/**', 'some-specific-file.ts'],
    },
    },
    },
    } satisfies AwsNxPluginConfig;

    Exclusion de projets de la synchronisation des fichiers

    Section intitulée « Exclusion de projets de la synchronisation des fichiers »

    Exclusion de projets/fichiers via motifs glob :

    aws-nx-plugin.config.mts
    export default {
    license: {
    source: {
    files: {
    exclude: [
    // do not sync LICENSE file, package.json or pyproject.toml
    'packages/excluded-project',
    // do not sync LICENSE file, but sync package.json and/or pyproject.toml
    'apps/internal/LICENSE',
    ];
    }
    }
    }
    } satisfies AwsNxPluginConfig;

    La synchronisation des sources de licence est activée par la présence de la clé license.source dans votre configuration. Pour la désactiver :

    1. Supprimez la section license.source de votre configuration dans aws-nx-plugin.config.mts (vous pouvez conserver license.dependencies si vous souhaitez toujours vérifier les licences des dépendances)
    2. Si vous souhaitez également supprimer complètement le générateur de synchronisation, retirez le générateur @aws/nx-plugin:license#sync de targetDefaults.lint.syncGenerators

    Pour réactiver, exécutez à nouveau le générateur license.

    Le générateur license configure également une cible license-check qui échoue lorsqu’une des dépendances de votre projet (ou toute dépendance transitive) déclare une licence qui n’est pas dans votre liste autorisée.

    Le générateur écrit une cible license-check dans votre project.json racine :

    project.json
    {
    "targets": {
    "license-check": {
    "executor": "@aws/nx-plugin:license-check",
    "cache": true,
    "inputs": [
    "{workspaceRoot}/pnpm-lock.yaml",
    "{workspaceRoot}/aws-nx-plugin.config.mts"
    ],
    "options": {}
    }
    }
    }

    Les inputs sont calculés pour votre espace de travail : seuls les fichiers de verrouillage réellement présents sont inclus, ainsi que aws-nx-plugin.config.mts, plus un glob {workspaceRoot}/**/uv.lock lorsque la vérification des dépendances Python est activée (c’est-à-dire qu’un collecteur Python est configuré).

    Vous pouvez exécuter la vérification directement :

    Terminal window
    pnpm nx license-check

    Les résultats sont mis en cache par rapport à vos fichiers de verrouillage et aws-nx-plugin.config.mts — les ré-exécutions sont instantanées lorsque rien n’a changé.

    Les collecteurs déterminent ce qui est analysé. Le npmCollector utilise license-checker-rseidelsohn, et le pythonCollector utilise pip-licenses. Si aucune dépendance installée n’est trouvée, la vérification réussit sans rien à inspecter.

    La vérification des licences des dépendances s’exécute automatiquement chaque fois que vous exécutez lint ou build sur n’importe quel projet de votre espace de travail. Le générateur license configure la cible lint de chaque projet pour qu’elle dépende de la cible racine license-check, et les générateurs de projet (ts#* et py#*) font de même lorsqu’ils s’exécutent — ainsi la vérification est configurée quel que soit l’ordre d’exécution des générateurs.

    Cela signifie que vous n’avez pas besoin d’exécuter la vérification explicitement, bien que vous puissiez toujours le faire avec la cible license-check :

    Terminal window
    pnpm nx license-check

    Le câblage est un dependsOn inter-projets sur la cible lint de chaque projet qui pointe vers la cible racine license-check. Pour ignorer la vérification lors d’un lint ou d’un build, définissez la variable d’environnement LICENSE_DEPENDENCY_CHECK=skip :

    Terminal window
    pnpm LICENSE_DEPENDENCY_CHECK=skip lint

    Par défaut, la vérification utilise un ensemble intégré de licences permissives courantes (MIT, Apache-2.0, BSD, ISC, etc.) exporté sous le nom DEFAULT_LICENSE_ALLOWLIST. Vous pouvez l’étendre ou le remplacer dans votre configuration :

    aws-nx-plugin.config.mts
    import { AwsNxPluginConfig } from '@aws/nx-plugin';
    import { DEFAULT_LICENSE_ALLOWLIST } from '@aws/nx-plugin/sdk/license';
    export default {
    license: {
    // ...
    dependencies: {
    allow: [...DEFAULT_LICENSE_ALLOWLIST, { spdxId: 'LGPL-2.1-or-later', fullName: 'GNU Lesser General Public License v2.1 or later', aliases: [] }],
    exceptions: [
    { package: 'some-package', reason: 'Audited manually — ships MIT text without SPDX field' },
    ],
    },
    },
    } satisfies AwsNxPluginConfig;
    View the full list of licenses in DEFAULT_LICENSE_ALLOWLIST

    Pour restreindre la liste autorisée, remplacez DEFAULT_LICENSE_ALLOWLIST par votre propre tableau. Pour l’étendre, décomposez la valeur par défaut et ajoutez des entrées. Les entrées sont comparées par identifiant SPDX, nom complet de licence ou l’un des alias listés (insensible à la casse).

    Utilisez exceptions pour les paquets qui échouent à la vérification — soit parce que leur licence n’est pas dans la liste autorisée, soit parce qu’ils sont livrés sans métadonnées de licence détectables. Le champ reason est requis pour que les réviseurs puissent voir pourquoi l’exception a été accordée.

    exceptions: [
    {
    package: 'union',
    version: '0.5.0',
    reason: 'Package ships verbatim MIT text without declaring license',
    },
    ];

    Les générateurs qui introduisent des dépendances avec des métadonnées problématiques (par exemple le générateur de serveur MCP) ajoutent automatiquement les exceptions requises à votre configuration lorsqu’ils s’exécutent.

    Les collecteurs découvrent les dépendances et extraient les métadonnées de licence. Les collecteurs intégrés sont npmCollector() (analyse node_modules) et pythonCollector() (analyse les environnements virtuels Python). Le générateur de licence configure npmCollector() par défaut et ajoute pythonCollector() lorsque des projets Python sont présents.

    Pour implémenter un collecteur personnalisé, conformez-vous à l’interface LicenseCollector :

    import type { LicenseCollector } from '@aws/nx-plugin/sdk/license';
    const myCollector = (): LicenseCollector => ({
    name: 'my-ecosystem',
    traceCommand: 'my-tool why <package>',
    async collect({ workspaceRoot }) {
    return [
    { name: 'some-dep', version: '1.0.0', rawLicense: 'MIT', ecosystem: 'my-ecosystem' },
    ];
    },
    });

    license.dependencies accepte un callback optionnel onDependency qui est invoqué une fois pour chaque dépendance découverte, qu’elle réussisse ou échoue la vérification. Il reçoit { package, spdx }, où package est le nom du paquet et spdx est l’expression de licence SPDX résolue. Le spdx d’une exception a la priorité sur la licence brute déclarée, et spdx peut être une chaîne vide si aucune licence n’a été déclarée.

    C’est un moyen pratique d’afficher toutes les licences de votre projet. Exécutez la cible license-check pour voir la sortie :

    aws-nx-plugin.config.mts
    import { AwsNxPluginConfig } from '@aws/nx-plugin';
    import { DEFAULT_LICENSE_ALLOWLIST } from '@aws/nx-plugin/sdk/license';
    export default {
    license: {
    dependencies: {
    allow: DEFAULT_LICENSE_ALLOWLIST,
    onDependency: ({ package: pkg, spdx }) => {
    console.log(`${pkg} - ${spdx}`);
    },
    },
    },
    } satisfies AwsNxPluginConfig;

    La vérification des licences des dépendances est activée par la présence de la clé license.dependencies dans votre configuration.

    Pour désactiver les vérifications pour une seule exécution, définissez la variable d’environnement LICENSE_DEPENDENCY_CHECK=skip :

    Terminal window
    pnpm LICENSE_DEPENDENCY_CHECK=skip lint

    Pour désactiver de manière permanente, supprimez la clé license.dependencies de votre configuration dans aws-nx-plugin.config.mts. Vous pouvez également ré-exécuter le générateur license avec --dependencyCheck=false pour le générer sans cette fonctionnalité.