我遇到了 AOT 编译和自定义包的问题。在我的场景中,我有一个 Angular/Cli 项目,它安装了我自己的包(包 A)。包 A 依赖于包含服务的包 B。
包 A 的 NPM 安装导致 node_modules 结构:
- 节点模块
- package_a
- (package_a 文件)
- 节点模块
- 包_b
- (package_b 文件)
- 测试服务.ts
- 包_b
- package_a
这似乎是有道理的,因为包 A 依赖于包 B 的某个版本,因此包 B 安装在嵌套的 node_modules 文件夹中。我还确保包 A 从包 B 中导出 TestService,以便它可用。
我遇到的问题是尝试从主项目访问包 B 中的服务时:
app.component.ts
import { Component } from '@angular/core';
import { TestService } from 'package_a';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [TestService]
})
export class AppComponent {
constructor(
private log: TestService,
) {}
ngOnInit(): void {
// call function from package_b
}
}
首先,当我运行 ng serve 时,一切正常,完全没有问题。但是,当我尝试使用 AOT 编译构建项目时,它失败并出现错误:ERROR in ... Cannot find module.
如果我单独安装包 B,那么在主 node_modules 目录中有一个它的实例,那么整个事情就可以工作了。即使嵌套版本不同,它也会正确使用包 A 中定义的嵌套版本。
- 节点模块
- package_a
- (package_a 文件)
- 节点模块
- package_b [版本 1.0.0]
- (package_b 文件)
- 测试服务.ts
- package_b [版本 1.0.0]
- package_b [版本 2.0.0]
- (package_b 文件)
- 测试服务.ts
- package_a
有什么想法可以停止额外安装包 B 的需要吗?在主版本之前我是否缺少指向嵌套版本的内容?