【问题标题】:How to bundle / include dependencies in Angular-CLI libraries如何在 Angular-CLI 库中捆绑/包含依赖项
【发布时间】:2019-04-16 18:18:46
【问题描述】:

我在捆绑依赖项时遇到问题。

我的库包是 @angular/material 组件的包装器。

我惊讶地发现,无论我在哪里安装我的库包,都要求安装 @angular/material,否则我得到一个错误。

必须有更好的方法来做到这一点,对吗?我希望我的包是独立的,并在安装时“包含”角度/材料。

我读到将以下内容添加到库的 package.json 中

 "bundledDependencies": [
    "@angular/material"
  ]

应该解决这个问题,但它似乎没有工作,或者至少必须有另一个步骤,因为我在安装我的包时看到这个错误:

缺少捆绑的依赖项“@angular/material”。这应该是 报告给包维护者。

这个错误确实让我听起来像是遗漏了一些东西,这将按我的预期工作。我错过了什么?

我无法找到有关该错误的任何信息。

我们希望强制安装依赖项以保持我们的库“模块化”和自包含。换句话说,我们只想安装我们的库并自动获取它需要的所有依赖项。

我们不想依赖来自 peerDependencies 的警告消息。

这似乎是一种可能的模式,谁能解释一下 bundledDependencies 的意义

【问题讨论】:

  • 听起来你的bundledDependencies 工作了????我需要做同样的事情,但不确定构建步骤是什么。您能否将它们作为更新部分放在您的问题或回复中?
  • 从 peerDependencies 中得到警告信息的地方?如果我将 3º 方依赖项(例如“@fortawesome/fontawesome-free”:“^5.15.1”)添加到库的 package.json,当我在其他主机中使用库时,我不会在控制台上收到任何警告消息 -应用

标签: angular npm angular-material angular-cli


【解决方案1】:

bundledDependencies 用于指定要包含在包中的包。如果你使用它,那么你必须在你的包中提供这些包。它们作为包的一部分分发和安装,而不是作为单独的依赖项安装。见:http://npm.github.io/using-pkgs-docs/package-json/types/bundleddependencies.html

另一种方法,我认为图书馆的正确方法是使用peerDependencies(这就是我使用的)。这使库用户可以决定是否要通过其应用程序的 package.json 安装这些包,并在安装包时警告“未满足的对等依赖项”但不会安装它们。这很有用,因为它允许用户控制依赖包的版本。 Angular Material 将它所需的所有各种 @angular 依赖项指定为 peerDependencies(请参阅https://github.com/angular/material2/blob/master/src/lib/package.json)。

如果您想在安装包时强制安装依赖项,只需使用dependencies。我认为图书馆通常不建议这样做。

【讨论】:

  • 谢谢!这很有帮助,但我可以使用更多信息。 1)我如何“在你的包中提供这些包”。它安装在我的库中。但我只想将它安装到该库而不是使用该库的所有内容。这听起来像 peerDependencies 所做的,它只是添加了一条警告消息?我认为我们想强制安装依赖项以保持我们的库“模块化”和自包含。换句话说,我们只想安装我们的库并自动获取所有依赖项。我认为来自 peerDependencies 的警告消息将是一个计划 b
  • 强制安装 == 'dependencies';提供 == 'bundledDependencies' (见链接——据我所知); require install == 'peerDependencies' - 这确实是你想要的。不幸的是,您不能“强制”对等依赖项(但应用程序将无法工作),因此您必须使用“依赖项”来强制安装。但正如我所说,图书馆通常不是这样做的。警告和您的库文档旨在强制执行依赖项要求。
  • 对于任何其他读者,您说得非常正确,您的最后一句话对我帮助最大。我在外部应用程序 package.json 中有依赖项,但在具有对等依赖项的 LIBRARY 较小的 package.json 中没有。正如您所说,我从未在该文件中看到常规依赖项,这可能不是正常模式,但这是我们正在寻找的。所以在 LIBRARY 的 package.json 中你可以添加常规依赖!!非常感谢!!!!!!
  • 如果将其添加为依赖项,ng-packagr 将阻止构建过程。通过将此属性包含在位于 lib 文件夹内的 ng-package.json 中,ng-packagr 让构建过程继续进行。这里是解释:medium.com/@aselvini/…"whitelistedNonPeerDependencies": ["fortawesome"],
【解决方案2】:

到 2021 年底,似乎不可能使用标准 Angular 的开箱即用构建器将外部依赖项显式包含到最终 lib 的包中。这个构建器是 ng-packagr,在他们的 repo 中有关于它的问题:link1link2link3。建议是使用汇总或其他方法重新编译 ng-packagr dists 并手动注入需要存在的依赖项。

@sporritt 无论如何,为了清楚起见,现在没有办法捆绑 通过 ng-packagr 导入,并且永远不会有。对吗?

@alan-agius4 目前不,这不是它的样子 可以在 ng-packagr 之后不进行额外的转换 被执行。

我的故事是,我多年来一直在我的 Angular 库 (https://github.com/dhilt/ngx-ui-scroll) 中使用汇总,并且它的捆绑包中有一个外部依赖项,它与我自己的 custom build process 一起到达那里。这些天来,我在想,改用常见的做法并用官方的 ng-packagr 方法替换我的手动汇总构建过程可能是个好主意。我很失望地卡住了。

让我们看看随着时间的推移这种情况如何变化,并希望上述解决方法有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多