【问题标题】:What is the proper way to use a dependent npm package in angular 6 library project?在 Angular 6 库项目中使用依赖 npm 包的正确方法是什么?
【发布时间】:2018-12-15 10:19:09
【问题描述】:

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

lib 项目的 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.

【问题讨论】:

标签: angular6 angular-library


【解决方案1】:

似乎将包名称添加到 ng-package.json 文件中的“whitelistedNonPeerDependencies”集合将解决此构建问题。我仍然不确定这里的最佳做法是什么。我们应该创建依赖于其他 npm 包的 Angular 库,还是最好只拥有 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"
  ]
}

【讨论】:

  • 我希望你的问题有一个明确的答案。在输出中有一个严厉的警告,但在任何地方都没有解释原因,这很烦人。
  • 想知道是否在 package.json 中而不是将依赖项添加到 lib 中,您可以对依赖项执行 npm install 以便在构建期间安装它? A. 你能做到吗?会不会更好,因为如果已经安装了依赖项就不会发生冲突?
  • 如果你想忽略这个机制,你可以使用"whitelistedNonPeerDependencies": ["."]将所有依赖加入白名单
  • 3.5 年和一场大流行之后,这个警告仍然很烦人,在我的情况下使用依赖项绝对是正确的方法,但是看到警告让我回到这里,发现它是一个空无的汉堡
【解决方案2】:

这更像是一个猜测/漫谈,而不是官方答案,但这是我从迄今为止的发现和思考中收集到的内容。

The source code gives a clue about their reasoning:

// 验证非peerDependencies,因为它们很容易导致应用程序的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.

【讨论】:

  • 您链接到的答案是为什么您应该使用对等依赖项的经典案例;另一个框架的插件需要确保它使用相同的对象,所以它使用主机的版本,而不是私有版本。考虑删除该链接或添加额外信息,因为它并不真正适用于所提出的问题:我的库使用其他库并且不想强迫用户自己下载我的所有依赖项或想要确保即使用户使用的是另一个版本,我也在使用正确的版本。否则很好漫无边际:)
  • 很好的发现!很确定你找到的这条评论就是解释。干杯!
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2012-11-17
    • 2016-11-09
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多