如何将Nx工作区中本地TS依赖代码纳入Angular库编译产物?
解决Angular库打包时纳入本地共享库代码的方案
1. 配置ng-packagr的依赖规则
在主Angular库的ng-package.json文件中,明确指定哪些依赖需要被打包进产物,哪些是外部依赖:
{ "allowedNonPeerDependencies": ["@myOrg/sharedLib"], "externalDependencies": ["@angular/core", "@angular/common", "rxjs"], // 仅保留真正需要用户自行安装的第三方依赖 "lib": { "entryFile": "src/index.ts", "umdModuleIds": { "@myOrg/sharedLib": "myOrg-sharedLib" // 避免UMD打包时的命名冲突 } } }
allowedNonPeerDependencies:将本地共享库加入白名单,允许ng-packagr把它的代码合并到主库产物中externalDependencies:列出需要用户单独安装的外部依赖,排除共享库
2. 修正主库的TypeScript配置
确保主库的tsconfig.lib.json中paths配置正确,且未排除共享库代码:
{ "compilerOptions": { "baseUrl": ".", "paths": { "@myOrg/sharedLib": ["../shared/src/index.ts"] }, "declaration": true, "preserveSymlinks": true }, "exclude": ["node_modules", "src/test.ts", "src/**/*.spec.ts"] }
- 不要把共享库路径加入
exclude列表,保证TypeScript能正确解析并编译共享库代码
3. 调整Nx的Build配置
在主库的project.json中,修改build任务参数,确保Nx不会将共享库当作外部依赖处理:
{ "targets": { "build": { "executor": "@nx/angular:package", "options": { "project": "libs/main-lib/ng-package.json", "externalDependencies": ["@angular/core", "@angular/common"], // 与ng-package.json的配置保持一致 "tsConfig": "libs/main-lib/tsconfig.lib.json" } } } }
4. 验证打包结果
执行Nx的build命令:
nx build main-lib
检查dist/libs/main-lib目录下的产物(如esm、umd文件夹),确认共享库的代码(比如someUtilFn)已经被包含在主库的编译文件中,而非作为外部依赖引用。
额外注意事项
- 不要在主库的
index.ts中导出共享库内容(如export * from '@myOrg/sharedLib'),防止用户能直接从主库导入共享库代码 - 确保共享库的
tsconfig.json开启了declaration选项,方便主库生成正确的类型定义
内容的提问来源于stack exchange,提问作者spierala
相关产品推荐
相关产品推荐

