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

时间:2019-03-21 19:27:29

标签: javascript typescript tsc tsconfig

我在构建引用另一个项目(@red5/middleware)的项目(@red5/router)时遇到问题,作为回报,该项目引用了该项目(@red5/middleware)

因此,当我运行命令时:

rm -rf types && tsc -p .

我收到一条错误消息,指出它找不到.d.ts文件,因为我用rm删除了它们。

  

../ router / types / Route.d.ts:4:28-错误TS7016:找不到模块'@ red5 / middleware'的声明文件。 “ C:/Users/rnaddy/Documents/vscode/projects/red5/framework/middleware/lib/index.js”隐式具有“ any”类型。     如果存在,请尝试npm install @types/red5__middleware或添加一个包含declare module '@red5/middleware';

的新声明(.d.ts)文件。

@ red5 / router-> route.ts

import { Middleware } from '@red5/middleware';

如果我删除了rm -rf types命令,则会收到错误消息,提示它无法覆盖输入文件,但是我不再遇到上述错误。

我该怎么办才能消除此错误,并且仍然在命令中使用rm -rf types

中间件/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"
  ]
}

2 个答案:

答案 0 :(得分:0)

您正在构建或正在构建这些项目吗?如果是这样,这听起来像是您使用的依赖项模式有问题。

但是,无论如何-为了实现这一点,您将需要一次更新一个模块。

使用旧模块的先前版本,您应该能够将最终输出用作新模块当前版本的依赖项。

然后,一旦更新了这些项目,请继续并修改其他解决方案。

您将必须处理一种解决方案,然后再处理另一种解决方案-如果您在两种解决方案中都进行了更改,则将破坏依赖关系,并且将无法编译它们中的任何一个。

答案 1 :(得分:0)

要解决此问题,基本上只是对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" ]
    }
  }
}

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