私は糸を使ってモノレポをセットアップしようとしています。物事が適切に解決されるようにプロジェクト参照でTypeScriptを設定する方法について混乱しています。
たとえば、次のようなフォルダ構造がある場合
/cmd
/client
そして、私はcmd
がclient
に依存することを望みます:
cmd/tsconfig.json
:
{
"compilerOptions": {
"types": ["reflect-metadata", "jest"],
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": "node",
"declaration": true,
"importHelpers": true,
"composite": true,
"target": "esnext"
"sourceRoot": "src",
"outDir": "dist"
},
"references": [
{
"path": "../client"
}
],
"include": [
"src/**/*"
]
}
とともに package.json
{
"name": "cmd",
"version": "1.0.0",
"dependencies": {
"client": "^1.0.0",
}
}
このモデルでは、cmd
とclient
の両方が、tsconfigでoutDir
とsourceRoot
フィールドを設定してコンパイルされます。これは、コンパイルされたすべてのJavaScriptがdist/
のサブフォルダcmd/dist
およびclient/dist
もし今私がclient
からcmd
にクラスを参照してみてください
import Foo from 'client/src/foo'
IDEはTypeScript references
プロパティを介してマップされているように見えるため、これを解決して問題ありません。
ただし、コンパイルされたjavascriptは、
const foo_1 = require("client/src/foo");
ただし、実際にビルドされたJavaScriptはclient/dist/src/foo
なので、実行時にこれは機能しません。
反対に、sourceRootsとoutDirsを使用せず、同じフォルダーでJavaScriptをTypeScriptファイルにインライン化すると、すべてが機能します(ただし、リポジトリがダーティになり、除外するためにカスタムgitignoreが必要になります)。
TypeScript 3.xのモノレポを糸のワークスペースで適切に設定し、物事がうまく機能するようにする方法について誰かが光を当てることはできますか?
Github Repository を作成して、次のコードの説明を簡単に実行できるようにしました。
TypeScript _Project References
_を使用すると、複数のより小さなTypeScriptプロジェクトで構成されるTypeScriptプロジェクトをコンパイルできます。各プロジェクトには_tsconfig.json
_ファイルがあります。 (出典: プロジェクト参照ドキュメント )
ルート_tsconfig.json
_ファイルがあり、そのサブプロジェクトのみを管理しています。 references
プロパティは、それぞれが有効な_tsconfig.json
_ファイルを含むディレクトリを指定します。 _--build
_オプション(_tsc --build tsconfig.json
_)を使用してプロジェクトをビルドする場合、コンパイルする必要があるプロジェクトを指定しましたが、build orderを指定していません。プロジェクトをコンパイルする必要があります。
_{
"references": [
{ "path": "./client" },
{ "path": "./cmd" }
],
"files": [],
"include": [],
"exclude": ["**/node_modules"]
}
_
ビルド順序を正しく指定するには、__cmd/tsconfig.json
_ファイルにreferences
プロパティを追加する必要があります。これは、_client/
_をコンパイルする前に、まず_cmd/
_をコンパイルする必要があることをコンパイラーに通知します。
_cmd/tsconfig.json
_:
_{
"extends": "../tsconfig.packages.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist"
},
"references": [
{
"path": "../client"
}
]
}
_
ビルド順序
_client/
^
|
|
cmd/
_
ベストプラクティスは、各サブプロジェクトに main
プロパティと を含む独自の_package.json
_ファイルがあることです。 name
セット。この例では、両方のパッケージ(_cmd/
_および_client/
_)に、TypeScriptの_index.js
_ファイルを指すmain
プロパティがあります outDir
ディレクトリ(_cmd/dist/index.js
_および_client/dist/index.js
_)。
プロジェクトの構造:
_tsconfig.json
cmd/
tsconfig.json
package.json
src/
index.ts
dist/ #artifacts
index.js
client/
tsconfig.json
package.json
src/
index.ts
dist/ #artifacts
index.js
_
_client/packages.json
_
_{
"name": "client",
"version": "1.0.0",
"main": "dist/index",
...
}
_
_client/
_への依存関係として_cmd/packages.json
_を追加するのは重要なので、モジュール解決アルゴリズムは_client/dist/index.js
_をTypeScriptコードにインポートすると_import Foo from 'client';
_:
_cmd/packages.json
_
_{
"name": "cmd",
"version": "1.0.0",
"main": "dist/index",
"dependencies": {
"client": "1.0.0" // important
}
}
_
_cmd/src/index.ts
_
_import Foo from 'client';
console.log(Foo())
_
糸のセットアップは簡単です。 Yarnは次の代わりに_node_modules
_の下にすべてのパッケージを追加します:
cmd/node_modules
_client/node_modules
_糸を有効にするには workspacesworkspaces
プロパティと_private: true
_プロパティを_<root>/package.json
_ファイルに追加します。
_<root>/package.json
_
_{
"private": true,
"workspaces": [
"cmd",
"client"
],
"name": "yarn_workplace",
"version": "1.0.0"
...
}
_
_cmd/
_および_client/
_パッケージは、_<root>/node_modules/
_ディレクトリの下にsymlinked
です。
cmd/
_パッケージは、TypeScriptファイルを直接使用する代わりに、型情報に_client/dist/index.d.ts
_定義ファイルを使用します。