Angular 5中发布npm嵌套作用域包遇命名错误求助
解决Angular5中嵌套作用域npm包的命名问题
嘿,我来帮你搞定这个问题!你遇到的「invalid name」错误,根源是npm的包命名规则不允许作用域包名里包含多个斜杠——合法的作用域包格式只能是@<scope>/<package-name>,比如@once/ui,而@once/ui/select-box这种带第二个斜杠的写法,npm会认为是本地文件路径,不是合法的包名,所以才报错。
针对Angular5的场景,咱们有几种靠谱的方案来实现你想要的「嵌套子包」效果:
方案一:用Monorepo管理独立子包(推荐)
虽然Angular5没有官方的工作区支持,但可以用lerna或者yarn workspaces搭建Monorepo,把每个子包做成独立的作用域包:
- 在项目根目录创建
packages文件夹,里面新建ui-select-box子目录,子目录里的package.json命名为@once/ui-select-box,完全符合npm规则 - 用
lerna来统一管理版本、安装依赖和发布,这样你可以在Angular5项目里直接通过import { SelectBoxModule } from '@once/ui-select-box'引用子包
方案二:在主包@once/ui中导出子模块
如果不想拆成多个独立包,可以把select-box作为主包的子目录,通过入口文件导出,再配合TypeScript路径映射实现类似嵌套的引用方式:
- 调整主包结构:
@once/ui/ src/ select-box/ select-box.module.ts select-box.component.ts ... index.ts - 在主包的
index.ts中导出子模块:export * from './select-box/select-box.module'; export * from './select-box/select-box.component'; - 在你的Angular5项目的
tsconfig.json里配置路径映射,让TypeScript能识别子路径引用:{ "compilerOptions": { "baseUrl": "./", "paths": { "@once/ui/*": ["node_modules/@once/ui/src/*"] } } } - 发布主包时,确保
package.json的files字段包含src/select-box目录,这样安装后子模块能被正常访问。
方案三:直接使用连字符命名子包
最简单的方式是把子包命名为@once/ui-select-box(用连字符替代斜杠),作为独立的npm包发布。这种写法完全符合npm命名规则,不会报错,而且Angular5项目可以直接安装和引用,不需要额外配置。
额外注意事项
- Angular5版本比较老旧,要确保子包的Angular依赖版本和你的主项目完全一致,避免出现依赖冲突
- 发布作用域包前,要先在npm上注册
@once这个作用域,并且登录npm账号确认拥有该作用域的发布权限
内容的提问来源于stack exchange,提问作者Dinesh Rawat
相关产品推荐
相关产品推荐

