我正在计划如下的monorepo打字稿项目:
/ (root)
+--backend/
| +-src/
| \-tsconfig.json
+--shared/
| \-src/
\--frontend/
\-src/
tsconfig.json
的定义如下:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"outDir": "./dist",
"strict": true,
"baseUrl": "./src",
"paths": {
"shared": [
"../../shared/src"
]
},
"rootDirs": [
"./src",
"../shared/src"
],
"esModuleInterop": true
}
}
当我在tsc
下执行backend
时,如下图所示:
/ (root)
+-backend/
+-dist/
| +-backend/
| | +-src/
| \-shared/
| \-src/
+-src/
\-tsconfig.json
在上面,dist
包含backend
和shared
,但它们下面分别包含src
。我想要backend
下的shared
和dist
包含没有src
的已编译JS文件:
/ (root)
+-backend/
+-dist/
| +-backend/
| \-shared/
+-src/
\-tsconfig.json
有可能吗?我该怎么做?
rootDir
(而不是rootDirs
)来决定输出的目录结构(请参阅this comment from Typescript's bossman)。rootDirs
时,tsc
将找到所有它们都公用的父目录,并将that视为rootDir
。 这就是为什么要得到outDir
结构的原因。A Typescript项目由tsconfig文件定义,是自包含的,并且受[ 管理它们之间的依赖关系rootDir
]限制。这很不错,因为它与封装原理对齐。您可以在自己的目录中有多个项目(例如一个主库和一组lib),每个项目都有自己的tsconfig和自己的rootDir
。使用Typescript Project References在tsconfig文件中
[不幸的是,打字稿人选择了“项目”一词,直觉上是指整个shebang,但是已经使用了“模块”和“包”。但是,如果您将它们视为,这将更加有意义。但是我建议您像这样构造存储库:subprojects
.
├── dist
└── src
├── tsconfig.json
├── shared
│ ├── index.ts
│ └── tsconfig.json
├── backend
│ ├── index.ts
│ └── tsconfig.json
└── frontend
├── index.ts
└── tsconfig.json
这样,当您编译代码时,您会得到:
. ├── dist │ ├── shared │ ├── backend │ └── frontend └── src
tsconfigs示例
[src/tsconfig.json
tsc --build src
可以构建整个项目(并使用--force
从头开始构建它)。{
"compilerOptions": {
"rootDir": ".",
"outDir": "../dist/",
},
"files": [],
"references": [
{ "path": "./shared" },
{ "path": "./backend" },
{ "path": "./frontend" }
]
}
[src/shared/tsconfig.json
shared
将不会导入任何其他项目,因为它没有引用。它导入的所有内容都限于其目录内,并且package.json
中列出的依赖项。您甚至可以限制我相信,通过赋予它自己的package.json
。{
"compilerOptions": {
"rootDir": ".",
"outDir": "../../dist/shared",
"composite": true
}
}
[src/backend/tsconfig.json
后端
可以导入shared,因为已声明引用。{
"compilerOptions": {
"rootDir": ".",
"outDir": "../../dist/backend",
"composite": true
},
"references": [
{ "path": "../shared" }
]
}
[src/frontend/tsconfig.json
frontend
可以导入shared和frontend。{
"compilerOptions": {
"rootDir": ".",
"outDir": "../../dist/frontend",
"composite": true
},
"references": [
{ "path": "../shared" },
{ "path": "../backend" }
]
}
示例构建命令[
tsc --build src
将构建整个src树[
tsc --build src/backend
将构建后端并进行共享(如果自上次构建以来发生了更改。