如何编译两个相互引用的项目

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 文件。

需要两项:

  1. compilerOptions.baseUrl - 解析非相关模块名称的基本目录。
  2. compilerOptions.paths - 模块名称到相对于 baseUrl 的位置的路径映射条目列表。

因此,在 @red5/middleware 模块中,我们这样引用路由器:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@red5/router": [ "../router" ]
    }
  }
}

然后在@red5/router模块中我们这样引用中间件:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@red5/middleware": [ "../middleware" ]
    }
  }
}

然后一切都解析到正确的位置。