Angular项目库引用应用内服务报错,如何正确实现?
可以在Angular应用中创建服务并在项目库中使用,但需要调整结构或配置
首先,你遇到的报错是因为Angular库的TypeScript配置限制了代码的来源范围:你的forms库的rootDir是Z:\workspace\zimm\projects\forms\src,而AppService位于主应用的src/app目录下,TypeScript不允许跨rootDir直接引用文件——这是为了保证库的独立性和可移植性,避免库依赖主应用的私有代码。
下面是两种可行的解决方案,优先推荐第一种:
方案一:将共享服务迁移到独立的共享库(最佳实践)
这是Angular官方推崇的代码组织方式,库的核心作用就是承载可复用的公共代码。具体步骤如下:
- 创建一个新的共享库:
ng generate library shared - 把
AppService的代码移动到projects/shared/src/lib目录下,保持服务的providedIn: 'root'配置不变,调整内部的导入路径(比如原来引用的svgs.ts,也要同步调整或迁移到共享库)。 - 在主应用的组件或模块中,通过库的别名导入服务:
import { AppService } from '@your-project-name/shared'; - 在
forms库的autocomponent.ts中,同样通过库别名导入:import { AppService } from '@your-project-name/shared'; - 重新构建项目,此时主应用和
forms库都能正常访问服务,而且共享库可以独立构建、发布,完全符合Angular的工程规范。
方案二:修改TypeScript配置(临时应急,不推荐)
如果暂时不想迁移服务,可以通过修改forms库的配置绕过限制,但这会破坏库的独立性(库将依赖主应用代码,无法单独复用给其他项目):
- 打开
projects/forms/tsconfig.lib.json文件 - 在
compilerOptions中添加rootDirs,包含主应用的src目录:"compilerOptions": { "rootDirs": [ "src", "../../../src" ], // 保留其他原有配置 } - 在
include数组中添加主应用的src目录,让TypeScript识别这部分代码:"include": [ "src/**/*", "../../../src/**/*" ] - 保存配置后重新构建
forms库,报错即可消失。
关键注意事项
- 永远优先选择方案一,因为库的设计目标就是脱离主应用独立存在,依赖主应用代码会让库失去复用价值。
- 如果
AppService中有和主应用强耦合的逻辑,记得拆分出通用的核心逻辑到共享库,只保留主应用特有的部分在主应用中。
内容的提问来源于stack exchange,提问作者st_clair_clarke
相关产品推荐
相关产品推荐

