ローカルリンキング
ローカルの`typescript-eslint`リポジトリの変更を別のローカル("ダウンストリーム")リポジトリで試すことは、時に役立ちます。一般的な戦略は次のとおりです。
- グローバルリンキング: パッケージマネージャーのグローバルリンクコマンドを使用して、`@typescript-eslint/*`パッケージをグローバルシンボリックリンクとして利用できるようにします。
- リポジトリリンキング: パッケージマネージャーのリンクコマンドを使用して、ローカルのダウンストリームリポジトリでこれらのグローバルシンボリックリンクを参照します。
- ルールの試用: ローカルのダウンストリームリポジトリでローカルのルールとプラグインを有効にすることによって、それらをテストします。
グローバルリンキング
すべての`@typescript-eslint/*`パッケージをグローバルに利用できるようにするには、`typescript-eslint`リポジトリのルートから次のコマンドを実行します。
for package in ./packages/*; do
cd $package
# Insert your package manager's global link command here
cd ../..
done
その`#`コメントの代わりに配置するコマンドは、ローカルのダウンストリームリポジトリのパッケージマネージャーによって異なります。
- npm: `npm link`
- pnpm: `pnpm link --global`
- Yarn v1 / classic: `yarn link`
- Yarn v2 / v3 / berry: *この手順を完全にスキップします*
リポジトリリンキング
`@typescript-eslint/*`パッケージがローカルで利用できるようになったので、ローカルのダウンストリームリポジトリでそれらにリンクできます。そのリポジトリが依存している`@typescript-eslint/*`パッケージごとに、そのリポジトリのパッケージマネージャーのリンクコマンドを実行します。
- npm: `npm link @typescript-eslint/eslint-plugin @typescript-eslint/parser`
- pnpm: `pnpm link @typescript-eslint/eslint-plugin @typescript-eslint/parser --global`
- Yarn v1 / classic: `yarn link @typescript-eslint/eslint-plugin @typescript-eslint/parser`
- Yarn v2 / v3 / berry: `yarn link /path/to/your/typescript-eslint/packages/eslint-plugin /path/to/your/typescript-eslint/packages/parser`
- これにより、ローカルのダウンストリームリポジトリの`package.json`に、各パッケージの`resolutions`エントリが追加されます。
これで、ローカルのダウンストリームリポジトリでESLintを通常どおり実行し、ローカルのtypescript-eslintパッケージを参照させることができるはずです。
ローカルパッケージが使用されていることを確認するには、`./packages/eslint-plugin/dist/index.js`などのファイルに`console.log("Hello, world!");`を追加し、ローカルのダウンストリームリポジトリのリンティング時にそのログが表示されることを確認することを検討してください。
ルールの試用
`@typescript-eslint/*`パッケージをローカルのダウンストリームリポジトリにリンクしたので、次の手順は、ローカルリポジトリのESLint構成ファイルにルールを含めることです。例:
{
"rules": {
"@typescript-eslint/your-awesome-rule": "error"
}
// ...
}
その後、リポジトリの`lint`スクリプトを実行する必要があります。変更はプロジェクトに反映されます。
`@typescript-eslint/`パッケージへの変更は、ローカルでビルドされるまで、リンクされたリポジトリ内に反映されません。すべてのパッケージを再ビルドするには、ルートから`yarn build`を実行します。ESLintプラグインのみでウォッチモードビルダーを開始するには、`./packages/eslint-plugin`から`yarn build --watch`を実行します。
トラブルシューティング
パッケージが見つかりません(`Cannot find module`)
ローカルの`@typescript-eslint/*`パッケージに、公開されているnpmバージョンに存在しない依存関係がある場合、ローカルのダウンストリームリポジトリでのリンティングで別のエラーが発生する可能性があります。
Error: Failed to load parser '@typescript-eslint/parser' declared in '.eslintrc.js': Cannot find module 'ts-api-utils'
Require stack:
- /repos/typescript-eslint/packages/typescript-estree/dist/convert-comments.js
この場合、不足しているパッケージをローカルのダウンストリームリポジトリに開発依存関係(`--save-dev`)として手動でインストールできます。
yarn add ts-api-utils -D
Yarnリンクの失敗(`Cannot link ... conflicts with parent dependency`)
Yarn v2 / v3 / berryは、競合する依存関係に対して厳格になる場合があります。ローカルのダウンストリームリポジトリにインストールするために`yarn`を実行すると、競合するバージョンに関するエラーが表示される場合があります。
$ yarn
➤ YN0000: ┌ Resolution step
➤ YN0000: └ Completed
➤ YN0000: ┌ Fetch step
➤ YN0000: └ Completed
➤ YN0000: ┌ Link step
➤ YN0071: │ Cannot link @typescript-eslint/parser into eslint-plugin-import@npm:2.27.5 [6d590] dependency debug@npm:4.3.4 [531b6] conflicts with parent dependency debug@npm:3.2.7 [65bed]
➤ YN0071: │ Cannot link @typescript-eslint/parser into eslint-module-utils@npm:2.8.0 [0b7fa] dependency debug@npm:4.3.4 [531b6] conflicts with parent dependency debug@npm:3.2.7 [65bed]
➤ YN0000: └ Completed in 0s 370ms
➤ YN0000: Failed with errors in 0s 643ms
これを解決するには、ローカルのダウンストリームリポジトリの`package.json`の`resolutions`フィールドに、失敗したパッケージごとに手動でエントリを追加できます。Yarnエラーで参照されている最大のメジャーバージョンを使用します。
{
"resolutions": {
"@typescript-eslint/eslint-plugin": "portal:/path/to/your/typescript-eslint/packages/eslint-plugin",
"@typescript-eslint/parser": "portal:/path/to/your/typescript-eslint/packages/parser",
"debug": "4"
}
}
`yarn`を再実行すると成功するはずです。