You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路径映射实现类似嵌套的引用方式:

  1. 调整主包结构:
    @once/ui/
      src/
        select-box/
          select-box.module.ts
          select-box.component.ts
          ...
        index.ts
    
  2. 在主包的index.ts中导出子模块:
    export * from './select-box/select-box.module';
    export * from './select-box/select-box.component';
    
  3. 在你的Angular5项目的tsconfig.json里配置路径映射,让TypeScript能识别子路径引用:
    {
      "compilerOptions": {
        "baseUrl": "./",
        "paths": {
          "@once/ui/*": ["node_modules/@once/ui/src/*"]
        }
      }
    }
    
  4. 发布主包时,确保package.json的files字段包含src/select-box目录,这样安装后子模块能被正常访问。

方案三:直接使用连字符命名子包

最简单的方式是把子包命名为@once/ui-select-box(用连字符替代斜杠),作为独立的npm包发布。这种写法完全符合npm命名规则,不会报错,而且Angular5项目可以直接安装和引用,不需要额外配置。

额外注意事项

  • Angular5版本比较老旧,要确保子包的Angular依赖版本和你的主项目完全一致,避免出现依赖冲突
  • 发布作用域包前,要先在npm上注册@once这个作用域,并且登录npm账号确认拥有该作用域的发布权限

内容的提问来源于stack exchange,提问作者Dinesh Rawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:18:47