ошибка компиляции angular-cli + monorepo: ошибка TS2451: Невозможно повторно объявить блочную переменную 'ngDevMode' - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть монорепо с двумя пакетами. Одним из них является основное приложение, назовем его 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 голосов
/ 07 июня 2019

Как вы предлагаете, он действительно пытается загрузить угловые дважды. Для этого есть 2 решения:

Решение 1 : принудительное использование угловой версии, определенной в приложении. В приложении в tsconfig.json в свойстве path добавьте строку ниже. Это заставляет использовать угловую библиотеку, которая находится в node_modules вашего приложения (адаптировать относительный путь в соответствии с вашим проектом)

"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 и добавьте путь к дистрибутиву вашей библиотеки
"paths": {
  ...
  "my-lib": ["dist.my-lib"]
  ...

В обоих случаях проверьте ваш импорт:

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

В последнем случае угловая версия все равно будет загружена относительно места импорта.

...