angular-cli编译错误+ monorepo:错误TS2451:无法重新声明块范围变量  ngDevMode'

时间:2018-04-29 21:50:48

标签: javascript angular typescript angular-cli

我有一个monorepo设置有两个包。一个是主应用程序,我们称之为app,另一个是主应用程序使用的共享库,我们称之为lib。两者都是TypeScript / Angular项目。

我的文件夹结构如下所示:

monorepo/
  packages/
    app/
    lib/

我正在尝试配置app项目,以便当它从lib包中看到导入时,而不是转到node_modules我希望它转到输出目录构建lib包。所以我有tsconfig.json

{
  "compilerOptions": {
    "baseUrl": ".",
    "rootDir": ".",
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es7", "dom"],
    "mapRoot": "./",
    "module": "es2015",
    "moduleResolution": "node",
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "paths": {
      "lib/*": ["../lib/dist/*"]
    }
}

但是,当我尝试在ng build文件夹中运行app时,我收到以下错误消息(同一错误两次,来自两个不同的位置):

ERROR in node_modules/@angular/core/src/render3/ng_dev_mode.d.ts(9,11): error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'.
../lib/node_modules/@angular/core/src/render3/ng_dev_mode.d.ts(9,11): error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'.

它试图加载Angular两次,一次来自app目录,另一次来自lib目录。

1 个答案:

答案 0 :(得分:0)

正如您所建议的,它确实试图两次加载角度。 有两种解决方案:

解决方案1 ​​:强制使用应用程序中定义的角度版本。在应用程序的tsconfig.json中的“路径”属性中,添加以下行。它将强制使用位于应用程序的node_modules中的angular lib(根据您的项目调整相对路径)

"paths": {
  ...
  "@angular: ["../node_modules/@angular"],
  ...

解决方案2 :在您的应用中创建一个指向库的符号链接。

  1. 构建您的库,您的库现在内置在my-lib-folder\dist\my-lib
  2. 转到您的应用文件夹
  3. 执行npm install ..\my-lib-folder\dist\my-lib。这将在应用程序的node_modules中创建一个指向您的lib dist的符号链接。
  4. 编辑tsconfig.json并为您的lib的dist添加路径
"paths": {
  ...
  "my-lib": ["dist.my-lib"]
  ...

在两种情况下,请检查您的进口商品:

OK  : import {MyLibModule} from 'my-lib/';
NOK : import {MyLibModule} from '../my-lib-folder/my-lib/...';

在后一种情况下,仍然会从导入位置相对加载角度版本。