我正在开发一个应用程序和一堆要在应用程序中使用的库。所有这些最近都升级到了 Angular 9。这些库被配置为在没有 ivy 的情况下构建,应用程序被配置为使用 ivy 构建,这符合升级指南。我曾经遵循的本地开发过程如下 -
- 使用 --watch 构建库和应用程序。
- 在库中进行更改。库构建成功后,复制 dist/my-lib 并将其粘贴到应用程序的 node_modules 文件夹中(这会触发应用程序构建)。
这一直有效到 Angular 8 及更低版本,但在 Angular 9 中,应用程序构建错误说: ERROR in Tried to overwrite path/node_modules/my-lib/lib/services/payment.service.d.ts.__ivy_ngcc_bak with an ngcc backup file ,这是不允许的。
所以,现在我必须另外做以下事情 -
- 停止应用程序构建。
- 从应用程序的 node_modules 中删除 lib,然后复制粘贴新的。
- 再次启动应用程序。
角度文档说要使用 npm 链接https://angular.io/guide/creating-libraries#linked-libraries。但我无法理解:
库的 package.json 配置指向正确的入口点。例如, main 应该指向 JavaScript 文件,而不是 TypeScript 文件。
我尝试了 npm link 但这不会触发应用程序构建并且我的更改没有反映。我想知道如何解决 npm 链接问题,或者是否有更好的方法将库和应用程序一起使用。
我的 lib 的 package.json 看起来像这样(因为我正在处理客户端应用程序,所以我只发布 package.json 结构):
{
"name": "my-lib",
"version": "1.2.0",
"description": "description",
"repository": {
"url": "http://private-nexus-url"
},
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"build-ci": "npm run test-headless && npm run sonar && npm run publish",
"test-headless": "ng test --watch=false --browsers=ChromeHeadlessNoSandbox --code-coverage",
"sonar": "sonar-scanner",
"test": "ng test --code-coverage",
"lint": "ng lint",
"e2e": "ng e2e",
"build-lib": "ng build --prod my-lib",
"publish": "npm run build-lib && cd dist/my-lib && npm publish",
"postinstall": "ngcc"
},
"dependencies": {
"@angular/animations": "^9.1.6",
"@angular/common": "^9.1.6",
"@angular/compiler": "^9.1.6",
"@angular/core": "^9.1.6",
"@angular/forms": "^9.1.6",
"@angular/platform-browser": "^9.1.6",
"@angular/platform-browser-dynamic": "^9.1.6",
"@angular/router": "^9.1.6",
...
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.901.5",
"@angular-devkit/build-ng-packagr": "~0.901.5",
"@angular/cli": "~9.1.5",
"@angular/compiler-cli": "~9.1.6",
"@angular/language-service": "~9.1.6",
...
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.ts": [
"prettier --write",
"git add"
]
}
}