如何用ng-packagr在子入口间共享代码且排除共享代码分发
解决Angular库共享代码不对外暴露的问题
方法一:将shared设为内部次级入口,禁止外部访问
如果已经用次级入口存放shared代码,可通过以下方式阻止用户访问:
- 修改根package.json的导出配置:只对外暴露
a和b两个次级入口,不包含shared。示例:
这样用户尝试{ "name": "your-library", "exports": { "./a": "./dist/a", "./b": "./dist/b" }, ... }import 'your-library/shared'时会报错,因为根package.json未导出该路径。 - 标记shared为私有:在
shared次级入口目录的package.json中添加"private": true,避免npm将其识别为可发布的独立模块:{ "name": "your-library/shared", "private": true, ... }
方法二:不使用次级入口,直接在库内部共享代码
要避免创建shared次级入口,同时解决rootDir报错,可调整TypeScript配置:
假设你的库结构如下:
projects/your-lib/ ├── src/ │ ├── lib/ │ │ ├── a/ # 次级入口a │ │ ├── b/ # 次级入口b │ │ └── shared/ # 共享代码目录 │ └── public-api.ts └── tsconfig.lib.json
步骤1:调整根tsconfig.lib.json
确保rootDir指向库的源码根目录,并包含shared代码:
{ "compilerOptions": { "rootDir": "./src", ... }, "include": [ "src/lib/**/*.ts" ], "exclude": [ "src/test.ts", "src/**/*.spec.ts" ] }
步骤2:配置次级入口的tsconfig
在a和b的次级入口配置文件(如tsconfig.lib.a.json、tsconfig.lib.b.json)中,扩展根配置并包含shared代码:
以tsconfig.lib.a.json为例:
{ "extends": "../tsconfig.lib.json", "compilerOptions": { "outDir": "../../dist/a", "rootDir": "./src/lib" }, "include": [ "../lib/a/**/*.ts", "../lib/shared/**/*.ts" ] }
步骤3:可选:使用路径别名简化导入
在根tsconfig.lib.json中添加路径别名,让a和b可以更简洁地导入共享代码:
{ "compilerOptions": { "paths": { "@your-lib/shared": ["./src/lib/shared"] }, ... } }
之后在a或b中直接使用import { X } from '@your-lib/shared'即可。
这样配置后,shared代码会被打包进a和b的dist产物中,不会单独生成shared目录,自然无法被用户直接访问。
内容的提问来源于stack exchange,提问作者Mikelgo
相关产品推荐
相关产品推荐

