Skip to content

License

ワークスペース全体のライセンス管理:自分のコードのLICENSEファイルとソースコードヘッダーを同期し(license.source)、すべての依存関係がライセンス許可リストに準拠しているかをチェックします(license.dependencies)。

Terminal window
pnpm nx g @aws/nx-plugin:license
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:license --dry-run
パラメータデフォルト説明
license Apache-2.0 | MIT | ASLApache-2.0選択したライセンスのSPDXライセンス識別子
copyrightHolder stringAmazon.com, Inc. or its affiliates著作権者。デフォルトでLICENSEファイルとソースファイルのヘッダーに含まれます。
dependencyCheck booleantrue設定された許可リストの外側のライセンスを宣言する依存関係が存在する場合に失敗するlicense-checkターゲットを設定します。
preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

ジェネレーターは以下のファイルを作成または更新します:

  • nx.json lintターゲットがライセンス同期ジェネレーターを実行するように設定され、license-checkターゲットに依存します
  • aws-nx-plugin.config.mts ライセンスソース同期(license.source)と依存関係チェック(license.dependencies)の設定

ライセンスヘッダーとファイル

Section titled “ライセンスヘッダーとファイル”

ジェネレーターは、lintターゲットの一部として実行されるsync generatorを登録し、ソースファイルに正しいライセンスヘッダーが含まれ、プロジェクトにLICENSEファイルが含まれ、package.jsonpyproject.tomlにライセンスメタデータが設定されていることを保証します。

プロジェクトをビルドするたび(lintターゲットが実行されるとき)、ライセンス同期ジェネレーターはプロジェクトのライセンスが設定と一致していることを確認します。何かが同期されていないことを検出すると、次のようなメッセージが表示されます:

Terminal window
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

Yesを選択して変更を同期します。

ライセンス同期ジェネレーターは3つの主要なタスクを実行します:

1. ソースファイルのライセンスヘッダーの同期

Section titled “1. ソースファイルのライセンスヘッダーの同期”

同期ジェネレーターが実行されると、ワークスペース内のすべてのソースコードファイル(設定に基づく)に適切なライセンスヘッダーが含まれていることを確認します。ヘッダーは、ファイルの最初のブロックコメントまたは連続する行コメントとして書き込まれます(ファイルにshebang/hashbangが存在する場合はその後)。

同期ジェネレーターが実行されると、ルートのLICENSEファイルが設定されたライセンスに対応していることを確認し、ワークスペース内のすべてのサブプロジェクトにも正しいLICENSEファイルが含まれていることを確認します。

3. プロジェクトファイル内のライセンス情報の同期

Section titled “3. プロジェクトファイル内のライセンス情報の同期”

同期ジェネレーターが実行されると、package.jsonpyproject.tomlファイルのlicenseフィールドが設定されたライセンスに設定されていることを確認します。

設定は、ワークスペースのルートにあるaws-nx-plugin.config.mtsファイルで定義されます。

選択したライセンスは、spdx設定プロパティを使用していつでも更新できます:

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

同期ジェネレーターが実行されると、すべてのLICENSEファイル、package.jsonpyproject.tomlファイルが設定されたライセンスを反映するように更新されます。

さらに、一部のLICENSEファイルに含まれる著作権者と著作権年を設定できます:

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

ライセンスヘッダーの内容は2つの方法で設定できます:

  1. インラインコンテンツを使用:
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. ファイルから読み込む:
aws-nx-plugin.config.mts
export default {
license: {
source: {
header: {
content: {
filePath: 'license-header.txt'; // relative to workspace root
}
// ... format configuration
}
}
}
} satisfies AwsNxPluginConfig;

globパターンを使用して、異なるファイルタイプに対してライセンスヘッダーをどのようにフォーマットするかを指定できます。フォーマット設定は、行コメント、ブロックコメント、またはその両方の組み合わせをサポートします:

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;

フォーマット設定は以下をサポートします:

  • blockStart: ライセンスコンテンツの前に書き込まれるテキスト(例:ブロックコメントの開始)
  • lineStart: ライセンスコンテンツの各行の前に追加されるテキスト
  • lineEnd: ライセンスコンテンツの各行の後に追加されるテキスト
  • blockEnd: ライセンスコンテンツの後に書き込まれるテキスト(例:ブロックコメントの終了)

ネイティブにサポートされていないファイルタイプの場合、カスタムコメント構文を指定して、同期ジェネレーターがこれらのファイルタイプで既存のライセンスヘッダーを識別する方法を指示できます。

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;

ヘッダー同期からファイルを除外

Section titled “ヘッダー同期からファイルを除外”

デフォルトでは、gitリポジトリでは、すべての.gitignoreファイルが尊重され、バージョン管理で管理されているファイルのみが同期されます。非gitリポジトリでは、設定で明示的に除外されない限り、すべてのファイルが考慮されます。

globパターンを使用して、ライセンスヘッダーの同期から追加のファイルを除外できます:

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;

ファイル同期からプロジェクトを除外

Section titled “ファイル同期からプロジェクトを除外”

すべてのLICENSEファイル、package.jsonファイル、pyproject.tomlファイルはデフォルトで設定されたライセンスと同期されます。

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;

ライセンスソース同期は、設定にlicense.sourceキーが存在することで有効になります。無効にするには:

  1. aws-nx-plugin.config.mtsの設定からlicense.sourceセクションを削除します(依存関係のライセンスチェックが必要な場合はlicense.dependenciesを保持できます)
  2. 同期ジェネレーターを完全に削除したい場合は、targetDefaults.lint.syncGeneratorsから@aws/nx-plugin:license#syncジェネレーターを削除します

ライセンス同期を再度有効にするには、単にlicenseジェネレーターを再度実行します。

依存関係のライセンスチェック

Section titled “依存関係のライセンスチェック”

licenseジェネレーターは、プロジェクトの依存関係(または推移的な依存関係)のいずれかが許可リストにないライセンスを宣言している場合に失敗するlicense-checkターゲットも設定します。

ジェネレーターは、ルートのproject.jsonlicense-checkターゲットを書き込みます:

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": {}
}
}
}

inputsはワークスペースに合わせて計算されます:実際に存在するロックファイルのみがaws-nx-plugin.config.mtsとともに含まれ、Python依存関係チェックが有効な場合(つまり、Pythonコレクターが設定されている場合)は{workspaceRoot}/**/uv.lock globが追加されます。

チェックを直接実行できます:

Terminal window
pnpm nx license-check

結果はロックファイルとaws-nx-plugin.config.mtsに対してキャッシュされます — 何も変更されていない場合、再実行は即座に完了します。

コレクターがスキャン対象を決定します。npmCollectorlicense-checker-rseidelsohnを使用し、pythonCollectorpip-licensesを使用します。インストールされた依存関係が見つからない場合、チェックは検査するものがないまま成功します。

依存関係のライセンスチェックは、ワークスペース内のプロジェクトをlintまたはbuildするたびに自動的に実行されます。licenseジェネレーターは、各プロジェクトのlintターゲットがルートのlicense-checkターゲットに依存するように配線し、プロジェクトジェネレーター(ts#*py#*)も実行時に同じことを行います — したがって、ジェネレーターが実行される順序に関係なくチェックが配線されます。

つまり、チェックを明示的に実行する必要はありませんが、license-checkターゲットで実行することもできます:

Terminal window
pnpm nx license-check

配線は、各プロジェクトのlintターゲット上のクロスプロジェクトdependsOnで、ルートのlicense-checkターゲットを指します。lintまたはbuild中にチェックをスキップするには、LICENSE_DEPENDENCY_CHECK=skip環境変数を設定します:

Terminal window
pnpm LICENSE_DEPENDENCY_CHECK=skip lint

デフォルトでは、チェックは一般的な寛容なライセンス(MIT、Apache-2.0、BSD、ISCなど)の組み込みセットを使用し、DEFAULT_LICENSE_ALLOWLISTとしてエクスポートされています。設定でこれを拡張またはオーバーライドできます:

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;
DEFAULT_LICENSE_ALLOWLISTのライセンスの完全なリストを表示

許可リストを制限するには、DEFAULT_LICENSE_ALLOWLISTを独自の配列に置き換えます。拡張するには、デフォルトをスプレッドしてエントリを追加します。エントリは、SPDX id、完全なライセンス名、またはリストされたエイリアスのいずれかで照合されます(大文字小文字を区別しません)。

チェックに失敗するパッケージにはexceptionsを使用します — ライセンスが許可リストにない場合、または検出可能なライセンスメタデータなしで出荷されている場合のいずれかです。reasonフィールドは必須で、レビュアーが例外が付与された理由を確認できるようにします。

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

問題のあるメタデータを持つ依存関係を導入するジェネレーター(例:MCPサーバージェネレーター)は、実行時に必要な例外を設定に自動的に追加します。

コレクターは依存関係を検出し、ライセンスメタデータを抽出します。組み込みのコレクターはnpmCollector()node_modulesをスキャン)とpythonCollector()(Python仮想環境をスキャン)です。licenseジェネレーターはデフォルトでnpmCollector()を設定し、Pythonプロジェクトが存在する場合はpythonCollector()を追加します。

カスタムコレクターを実装するには、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は、チェックに合格するか失敗するかに関係なく、検出されたすべての依存関係に対して一度呼び出されるオプションのonDependencyコールバックを受け入れます。{ package, spdx }を受け取り、packageはパッケージ名、spdxは解決されたSPDXライセンス式です。例外のspdxは生の宣言されたライセンスよりも優先され、ライセンスが宣言されていない場合、spdxは空の文字列になる可能性があります。

これは、プロジェクト全体のすべてのライセンスを出力する便利な方法です。license-checkターゲットを実行して出力を確認します:

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;

依存関係のライセンスチェックは、設定にlicense.dependenciesキーが存在することで有効になります。

単一の実行でチェックを無効にするには、LICENSE_DEPENDENCY_CHECK=skip環境変数を設定します:

Terminal window
pnpm LICENSE_DEPENDENCY_CHECK=skip lint

永続的に無効にするには、aws-nx-plugin.config.mtsの設定からlicense.dependenciesキーを削除します。また、licenseジェネレーターを--dependencyCheck=falseで再実行して、それなしでスキャフォールドすることもできます。