在angular 6库项目中使用从属npm软件包的正确方法是什么?

时间:2018-07-06 19:28:24

标签: angular6 angular-library

对于我应该如何引用我的库angular6项目中的外部npm软件包,我有些困惑。我们有一个内部的scss库,可以用来在库中设置可重用组件的样式。我该如何导入呢?

package项目的package.json:

{
  "name": "ikr-lib",
  "version": "0.0.1",
  "peerDependencies": {
    "@angular/common": "^6.0.0-rc.0 || ^6.0.0",
    "@angular/core": "^6.0.0-rc.0 || ^6.0.0",
    "document-register-element": "1.8.1"
  },
  "dependencies": {
    "element.ui": "^1.0.1"
  }
}

在构建库项目时,我得到以下信息:

Distributing npm packages with 'dependencies' is not recommended. Please consider adding element.ui to 'peerDependencies' or remove it from 'dependencies'.

BUILD ERROR
Dependency element.ui must be explicitly whitelisted.

3 个答案:

答案 0 :(得分:5)

在ng-package.json文件的“ whitelistedNonPeerDependencies”集合中添加软件包名称似乎可以解决此生成问题。我仍然不确定最佳做法是什么。我们是否应该创建依赖于其他npm软件包的角度库,还是最好仅具有peerDependancies?

ng-package.json文件:

{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "../../dist/ikr-lib",
  "deleteDestPath": false,
  "lib": {
    "entryFile": "src/public_api.ts"
  },
  "whitelistedNonPeerDependencies": [
    "element.ui"
  ]
}

答案 1 :(得分:1)

这比官方的答案更像是猜测/漫步,但这是我从到目前为止的发现和思考中收集的信息。

The source code gives a clue about their reasoning

  

//验证非对等依赖项,因为它们很容易导致应用程序的node_modules文件夹中的重复安装或版本冲突

因此,我认为他们担心的情况是,库本身具有一个版本的依赖关系,而使用该库的应用程序可能会使用其另一个版本。

在版本中使用^是安装依赖项的默认配置。此外,在版本号中使用^将重复删除因次要或补丁版本而异的依赖项。所以我认为主要关注点是主要版本。

从应用程序node_modules的角度来看一些示例:

  • 应用程序:^2.8.3,库:^2.8.0 =>重复数据删除(2.8.3
  • 应用程序:^2.9.0,库:^2.3.4 =>重复数据删除(2.9.0
  • 应用程序:^3.0.1,库:^2.3.4 =>重复(存在3.0.12.3.4

这可能会夸大应用程序的大小,或在工具尝试作为依赖项加载哪个版本方面引起冲突。

This answer also talks a little bit about why to use peerDependencies instead.

答案 2 :(得分:0)

您可以在ng-package.json文件中使用以下方式将其列入白名单:

 {
  .....
  "whitelistedNonPeerDependencies": [
    "angular" // it matches using regular expression 
  ]
 }

you can completely suppress this using below approach
{
  .....
  "whitelistedNonPeerDependencies": [
    "."
  ]
 }