Angular 库的 npm 发布
npm publish for Angular Library
我有一个包含 lib、tester 和 e2e 项目的 'ng library'。当我 运行 'ng build' 时,它将所有 3 个项目打包在 'dist' 下。我只需要发布 lib 项目。我知道 'cd' 到 'dist/lib' 和 'npm publish' 有效,但我没有那个选项,因为我们的 CI 构建只在项目根目录中执行 'npm publish'。
所以我的问题是如何实现从根发布,只针对 lib 项目?
您有两个选择,但都需要更改您的 CI 脚本:
选项 1:
$ npm publish <path-to-lib-folder>
选项 2:
$ cd <path-to-lib-folder>
$ npm publish
祝我的开发者同胞们高兴!最后,经过 5 天的努力解决这个问题,我们找到了解决方案!这仍然是一个 'workaround',因为目前的 'npm' 版本(截至 2019 年 2 月)没有明确的方式支持通过 package.json 定义 'default' 发布目录 - 那会有是理想和简单的。所以这里是 -
解决方案
运行 ng build
用于 ng library
根项目。这将生成 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
变成 peerDependencies
或 devDependencies
取决于它的用途。此外,必须更新根 Angular 项目 angular.json
以删除 tester
项目。我在 tester
项目中创建了另一个 angular.json
,使其本身成为一个 Angular 应用程序,与 library
项目分开 - 未发布。
通过所有这些更改,我终于能够从项目的根目录 运行 npm publish
并仅发布 dist/your-library-project
。这对我来说非常重要,因为我的 CI 服务器的 'Publish' 步骤只能从项目根目录执行 npm publish
。通过这些更改,我什至可以从项目根目录仅发布 library
模块。当然,这只是一个 workaround/hack,但我很高兴它至少可以完成。快乐的日子!
我有一个包含 lib、tester 和 e2e 项目的 'ng library'。当我 运行 'ng build' 时,它将所有 3 个项目打包在 'dist' 下。我只需要发布 lib 项目。我知道 'cd' 到 'dist/lib' 和 'npm publish' 有效,但我没有那个选项,因为我们的 CI 构建只在项目根目录中执行 'npm publish'。 所以我的问题是如何实现从根发布,只针对 lib 项目?
您有两个选择,但都需要更改您的 CI 脚本:
选项 1:
$ npm publish <path-to-lib-folder>
选项 2:
$ cd <path-to-lib-folder>
$ npm publish
祝我的开发者同胞们高兴!最后,经过 5 天的努力解决这个问题,我们找到了解决方案!这仍然是一个 'workaround',因为目前的 'npm' 版本(截至 2019 年 2 月)没有明确的方式支持通过 package.json 定义 'default' 发布目录 - 那会有是理想和简单的。所以这里是 -
解决方案
运行 ng build
用于 ng library
根项目。这将生成 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
变成 peerDependencies
或 devDependencies
取决于它的用途。此外,必须更新根 Angular 项目 angular.json
以删除 tester
项目。我在 tester
项目中创建了另一个 angular.json
,使其本身成为一个 Angular 应用程序,与 library
项目分开 - 未发布。
通过所有这些更改,我终于能够从项目的根目录 运行 npm publish
并仅发布 dist/your-library-project
。这对我来说非常重要,因为我的 CI 服务器的 'Publish' 步骤只能从项目根目录执行 npm publish
。通过这些更改,我什至可以从项目根目录仅发布 library
模块。当然,这只是一个 workaround/hack,但我很高兴它至少可以完成。快乐的日子!