如何编译两个相互引用的项目
How to compile two projects that reference each other
我在构建引用另一个项目 (@red5/router)
的项目 (@red5/middleware)
时遇到问题,而在 return 中,该项目引用了该项目 (@red5/middleware)
.
所以,当我 运行 命令时:
rm -rf types && tsc -p .
我收到一条错误消息,说找不到 .d.ts
文件,因为我用 rm
.
删除了它们
../router/types/Route.d.ts:4:28 - error TS7016: Could not find a declaration file for module '@red5/middleware'. 'C:/Users/rnaddy/Documents/vscode/projects/red5/framework/middleware/lib/index.js' implicitly has an 'any' type.
Try npm install @types/red5__middleware
if it exists or add a new declaration (.d.ts) file containing declare module '@red5/middleware';
@red5/router -> route.ts
import { Middleware } from '@red5/middleware';
如果我删除 rm -rf types
命令,我会收到错误消息说它无法覆盖输入文件,但我不再收到上述错误消息。
我该怎么做才能摆脱这个错误并在我的命令中仍然使用 rm -rf types
?
middleware/tsconfig.json
{
"compilerOptions": {
"outDir": "lib",
"declarationDir": "types"
},
"extends": "../tsconfig.json",
"include": [
"src/**/*.ts"
]
}
tsconfig.json
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"moduleResolution": "node",
"declaration": true,
"strict": true,
"removeComments": false,
"inlineSourceMap": true
},
"exclude": [
"lib",
"types"
]
}
这些项目是您正在建设的,还是正在建设中的?如果是这样,这听起来像是您正在使用的依赖模式的问题。
但是,无论如何 - 为了实现这一点,您需要一次更新一个模块。
使用旧模块的先前版本,您应该能够使用该最终输出作为新模块当前版本的依赖项。
然后,一旦您更新了这些项目 - 继续修改其他解决方案。
您必须先处理一个解决方案,然后再处理另一个 - 如果您对两个解决方案都进行了更改,您将破坏依赖关系并且无法编译其中任何一个。
要解决这个问题,基本上只是修改 tsconfig.json
文件。
需要两项:
compilerOptions.baseUrl
- 解析非相关模块名称的基本目录。
compilerOptions.paths
- 模块名称到相对于 baseUrl 的位置的路径映射条目列表。
因此,在 @red5/middleware
模块中,我们这样引用路由器:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@red5/router": [ "../router" ]
}
}
}
然后在@red5/router
模块中我们这样引用中间件:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@red5/middleware": [ "../middleware" ]
}
}
}
然后一切都解析到正确的位置。
我在构建引用另一个项目 (@red5/router)
的项目 (@red5/middleware)
时遇到问题,而在 return 中,该项目引用了该项目 (@red5/middleware)
.
所以,当我 运行 命令时:
rm -rf types && tsc -p .
我收到一条错误消息,说找不到 .d.ts
文件,因为我用 rm
.
../router/types/Route.d.ts:4:28 - error TS7016: Could not find a declaration file for module '@red5/middleware'. 'C:/Users/rnaddy/Documents/vscode/projects/red5/framework/middleware/lib/index.js' implicitly has an 'any' type. Try
npm install @types/red5__middleware
if it exists or add a new declaration (.d.ts) file containingdeclare module '@red5/middleware';
@red5/router -> route.ts
import { Middleware } from '@red5/middleware';
如果我删除 rm -rf types
命令,我会收到错误消息说它无法覆盖输入文件,但我不再收到上述错误消息。
我该怎么做才能摆脱这个错误并在我的命令中仍然使用 rm -rf types
?
middleware/tsconfig.json
{
"compilerOptions": {
"outDir": "lib",
"declarationDir": "types"
},
"extends": "../tsconfig.json",
"include": [
"src/**/*.ts"
]
}
tsconfig.json
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"moduleResolution": "node",
"declaration": true,
"strict": true,
"removeComments": false,
"inlineSourceMap": true
},
"exclude": [
"lib",
"types"
]
}
这些项目是您正在建设的,还是正在建设中的?如果是这样,这听起来像是您正在使用的依赖模式的问题。
但是,无论如何 - 为了实现这一点,您需要一次更新一个模块。
使用旧模块的先前版本,您应该能够使用该最终输出作为新模块当前版本的依赖项。
然后,一旦您更新了这些项目 - 继续修改其他解决方案。
您必须先处理一个解决方案,然后再处理另一个 - 如果您对两个解决方案都进行了更改,您将破坏依赖关系并且无法编译其中任何一个。
要解决这个问题,基本上只是修改 tsconfig.json
文件。
需要两项:
compilerOptions.baseUrl
- 解析非相关模块名称的基本目录。compilerOptions.paths
- 模块名称到相对于 baseUrl 的位置的路径映射条目列表。
因此,在 @red5/middleware
模块中,我们这样引用路由器:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@red5/router": [ "../router" ]
}
}
}
然后在@red5/router
模块中我们这样引用中间件:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@red5/middleware": [ "../middleware" ]
}
}
}
然后一切都解析到正确的位置。