如何配置ng-packagr排除package.json中未使用的NativeScript依赖?
问题背景
我维护一个Web/NativeScript共享库,NativeScript文件统一命名为**/*.tns.ts——NativeScript会自动替换同名无.tns后缀的文件,没有对应.tns文件时则使用Web版本。构建Web版本库时,最终打包代码里不会包含NativeScript相关代码(因为导入链不会引入*.tns.ts文件),但ng-packagr会扫描所有.ts文件,把*.tns.ts里的依赖全部加到生成的package.json的peerDependencies中,哪怕这些依赖并未出现在最终打包产物里。尝试在tsconfig.json的exclude列表中添加**/*.tns.ts无效,需要找到让ng-packagr只基于导入链识别依赖,或跳过特定文件分析的配置方法。
解决方案
1. 在ng-package.json中配置exclude
ng-packagr自身支持在配置文件中指定要排除的文件,这是最直接有效的方法。修改你的ng-package.json,在lib节点下添加exclude数组,明确排除所有*.tns.ts文件:
{ "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", "dest": "../../dist/libs/core", "lib": { "entryFile": "src/index.ts", "styleIncludePaths": ["./node_modules"], "exclude": ["**/*.tns.ts"] } }
这个配置会让ng-packagr完全忽略所有.tns.ts文件,不会扫描它们的依赖,自然也就不会把这些依赖加入到peerDependencies中。
2. 确保TS配置文件的exclude生效
虽然你之前尝试过在tsconfig.json中添加exclude,但需要确认配置的位置和范围是否正确:
- 检查
tsconfig.lib.json和tsconfig.lib.prod.json(对应NX构建的不同环境),确保exclude是在compilerOptions之外的顶层字段:
{ "extends": "../../tsconfig.json", "compilerOptions": { // 你的编译配置 }, "exclude": ["**/*.tns.ts", "**/*.spec.ts"] }
NX的@nx/angular:ng-packagr-lite执行器会使用指定的tsconfig,确保这些配置文件确实排除了.tns.ts文件,避免TS编译时处理这些文件。
3. 验证效果
修改配置后,重新执行NX构建命令:
nx build core
构建完成后,检查dist/libs/core/package.json的peerDependencies字段,确认NativeScript相关的依赖已经被移除,且只保留了Web版本实际用到的依赖。
版本兼容性说明
当前使用的@nx/angular:16.3.2和ng-packagr:^15.2.2完全支持上述配置,无需升级版本即可生效。
内容的提问来源于stack exchange,提问作者crowmagnumb

