【问题标题】:npm publish for Angular LibraryAngular 库的 npm 发布
【发布时间】:2019-06-25 20:47:19
【问题描述】:

我有一个包含 lib、tester 和 e2e 项目的“ng 库”。当我运行“ng build”时,它将所有 3 个项目打包在“dist”下。我只需要发布 lib 项目。我知道 'cd' 到 'dist/lib' 和 'npm publish' 有效,但我没有那个选项,因为我们的 CI 构建只在项目根目录中执行 'npm publish'。 所以我的问题是如何实现从根目录发布,只针对 lib 项目?

【问题讨论】:

  • 你不能跑npm publish <path-to-lib>吗?
  • 正如我所提到的,我可以在本地运行 'npm publish ' 并且我知道该解决方案。但 CI 不会那样做。它是一个企业范围的 CI,目前仅支持在根目录下运行“npm publish”。我正在寻找是否有一些解决方法-例如package.json 参数或可以在此处提供帮助的预发布步骤

标签: angular npm package publish


【解决方案1】:

您有两个选择,但都需要更改您的 CI 脚本:

选项 1:

$ npm publish <path-to-lib-folder>

选项 2:

$ cd <path-to-lib-folder>
$ npm publish

【讨论】:

  • 如原始问题中所述,我知道此解决方案,但 CI 服务器只能在根目录下运行“npm publish”。不幸的是,没有规定将 传递给“npm publish”或执行“cd”作为发布步骤的一部分。在像我这样工作的大型组织中,更改 CI 步骤并非易事。
  • @Pat 那么不幸的是,据我所知,您的问题没有答案。
【解决方案2】:

让我的开发伙伴们高兴吧!最后,经过 5 天的努力解决这个问题,我们找到了解决方案!这仍然是一种“解决方法”,因为当前的“npm”版本(截至 2019 年 2 月)没有明确的方式支持通过 package.json 定义“默认”发布目录——这本来是理想且更简单的。所以这里 -

解决方案

ng library 根项目运行 ng build。这将生成dist 文件夹,其中包含library 项目和tester 项目。打开dist/your-library-project/package.json - 这是ng-packager 根据您的库的package.json 生成的package.json。

将自动生成的属性从dist/your-library-project/package.json复制到您的根/package.json

"main": "bundles/your-library-project.umd.js",
"module": "fesm5/your-library-project.js",
"es2015": "fesm2015/your-library-project.js",
"esm5": "esm5/your-library-project.js",
"esm2015": "esm2015/your-library-project.js",
"fesm5": "fesm5/your-library-project.js",
"fesm2015": "fesm2015/your-library-project.js",
"typings": "your-library-project.d.ts",
"metadata": "your-library-project.metadata.json",
"sideEffects": false,
"dependencies": {
"tslib": "^1.9.0"
}

将所有路径更改为相对于根 package.json。所以

"main": "bundles/your-library-project.umd.js",

变成

"main": "dist/your-library-project/bundles/your-library-project.umd.js",

这实际上告诉npm,当它将您的库模块导入另一个应用程序时,入口点位于dist/your-library-project/bundles/your-library-project.umd.js - 这允许网络应用程序通过以下方式导入模块:

import {YourLibraryModule} from 'your-library';

此外,根据您的根 package.json 中的其他属性,它可能需要进一步修复。例如。我必须摆脱所有library 项目未直接使用的dependencies。另外,根据用途将图书馆的dependencies 转换为peerDependenciesdevDependencies。此外,必须更新根 Angular 项目 angular.json 以删除 tester 项目。我在 tester 项目中创建了另一个 angular.json 以使其本身成为一个 Angular 应用程序,与 library 项目分开 - 它不会被发布。

通过所有这些更改,我终于能够从项目的根目录运行 npm publish 并仅发布 dist/your-library-project。这对我来说非常重要,因为我的 CI 服务器的“发布”步骤只能从项目根目录执行 npm publish。通过这些更改,我甚至可以从项目根目录发布 library 模块。当然,这只是一种解决方法/hack,但我很高兴它至少可以完成。快乐的日子!

【讨论】:

  • 谢谢。我不明白这怎么会这么复杂......
  • 希望对您有所帮助。您可以投票帮助其他有类似问题的人
猜你喜欢
  • 2017-01-23
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2018-11-23
  • 2017-03-13
  • 2017-09-08
相关资源
最近更新 更多