NG-Packagr дает имя не было предоставлено для внешнего модуля

При использовании ng-packagr для упаковки одного проекта @my/common-util проблем не возникает. Этот класс содержит абстрактный класс с именем AbstractPerson в abstract-person.ts.

В другом проекте под названием @my/common-impl был создан другой класс Person, который расширяет AbstractPerson и импортирует его, используя имя пакета @my/common-util. Когда я использую ng-packagr для упаковки, я получаю следующую ошибку ->

Не было задано имя для внешнего модуля '@my/common/abstract-person' в options.globals - угадывание 'abstractPerson'

Так как казалось, что это было предупреждение, я продолжаю npm устанавливать оба @ my / common и @my/common-impl в другой проект, но получаю следующую ошибку при импорте класса Person из @my/common-impl


ОШИБКА в./node_modules/@my/common-impl/esm5/common-impl.js Модуль не найден: Ошибка: не удается разрешить '@ my / common / abst ract-person' в 'C:\Data\me\node_modules\@my\common-impl\e sm5' resol' @ my / common / abstract-person 'в' C: \ Data \ me \ node_modules \ @my \ common-impl \ esm5 'Анализируемый запрос - это модуль, использующий описание file: C:\Data\me\node_modules\@my\co mmon-impl\package.json (относительный путь: ./esm5) Поле 'browser' не содержит допустимой конфигурации псевдонима после использования файла описания: C: \ Данные \ me \ node_modules \ @my \ common-impl \ package.json (относительный путь: ./esm5) разрешаются как модуль


Я пробовал несколько вещей, таких как внешние, глобальные, umdModuleIds в package.json (см. Далее), но ни одна из них не сработала.

Вот package.json


{
  "name": "@my/common-impl",
  "version": "1.0.0-alpha.0",
  "private": true,
  "dependencies": {
    "@my/common": "1.0.0-alpha.0"
  },
  "peerDependencies": {
    "lodash": "^4.17.4"
  },
  "ngPackage": {
    "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
    "dest": "dist/common-impl",
    "workingDirectory": "../.ng_build",
    "lib": {
      "entryFile": "src/public_api.ts",
      "externals": [
        "@my/common/abstract-person" 
      ],
      "globals": {
        "@my/common/abstract-person": "AbstractPerson"
      },
      "umdModuleIds": {
        "abstract-person" : "AbstractPerson"

      }
    }
  }
}

Что еще требуется для того, чтобы это было исправлено?

2 ответа

Я работал с модулем npm под названием katex. Добавление этого к umdModuleIds в ./projects/myLibname/ng-package.json работал для меня.

{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "../../dist/documentations",
  "lib": {
    "entryFile": "src/public_api.ts",
    "umdModuleIds": {
      "katex": "^0.10.0"
    }
  }
}

Это сделало следующее предупреждение исчезнуть

Не указано имя для внешнего модуля 'katex' в output.globals - угадывание 'katex'

Вы должны использовать свойство "paths" tsconfig.lib.json в вашей библиотеке.

Это проблема:

Я добавляю свои library1 и library2 в мой monorepo папка проекта.

project:
   -> library1 
       -> tsconfig.lib.json
       -> ...
   -> library2 
       -> tsconfig.lib.json
       -> ...
   -> tsconfig.json 
   -> ...

tsconfig.json

{
  ...
  "compilerOptions": {
    ...
    "paths": {
      "library1": [
      "../dist/library1"
    ],
      "library2": [
      "../dist/library2"
    ],
  },
}

И я использовал import {lib1Module} from 'library1' в коде library2. для разрешения no module lib1Module found ошибка я ovveride путь библиотеки1 в библиотеке2 tsconfig.lib.json

tsconfig.lib.json

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    ...
    "paths": {
      "library1": [
      "../../../dist/library1"
    ]
  },
  ...
},

Вероятно, ваша проблема будет решена, если вы используете paths свойство вместо "umdModuleIds", "globals" и "externals"

И, наконец, я должен упомянуть этот факт, "внешние" больше не существует в ng-packagr схема

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

ng-package.json

{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "../../dist/test-lib",
  "lib": {
    "entryFile": "src/public-api.ts",
    "umdModuleIds": {
      "@libs/shared": "../../dist/shared",
      "@libs/animations": "../../dist/animations",
      "saturn-datepicker": "saturn-datepicker",
      "moment": "moment"
    }
  }
}

tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "importHelpers": true,
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "esnext",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "es2019",
      "dom"
    ],
    "allowSyntheticDefaultImports": true,
    "baseUrl": "./",
    "paths": {
      "@app/*": [ "projects/test-app/src/app/*" ],
      "@libs/*": [ "dist/*" ],
      "shared": [ "dist/shared" ],
      "shared/*": [ "dist/shared/*" ],
      "animations": [ "dist/animations" ],
      "animations/*": [ "dist/animations/*" ],
    }
  }
}
Другие вопросы по тегам