【问题标题】:How to handle dependencies between Angular Library secondary entries如何处理 Angular 库二级条目之间的依赖关系
【发布时间】:2021-09-03 08:10:47
【问题描述】:

我正在尝试将现有代码从 Angular 应用程序构建到共享库。该库也应该被其他应用程序使用。因此,我创建了多个子条目来构建可摇树的代码。

考虑以下结构:


- lib
  - entryA
      - /src
      - index.ts
      - public-api.ts
      - package.json
  - entryB
      - /src
      - index.ts
      - public-api.ts
      - package.json
  - entryC
      - /src
      - index.ts
      - public-api.ts
      - package.json
  - ...
- ng-package.json
- package.json

一些条目依赖于其他条目(没有循环依赖)。例如,EntryA 没有依赖关系,但 EntryB 依赖于 EntryA,因此在 EntryB 中导入。

然后在EntryB中导入具体的服务:

import { MyService } from '@myorg/mylib/lib/entryA';

路径由tsconfig.json文件中的配置解析:

"paths": {
  "@myorg/mylib/*": ["./projects/ui/*", "./projects/ui"],
  "@myorg/mylib": ["./dist/ui/*", "./dist/ui"],
}

库的构建按预期工作并且不会引发错误。在消费者应用程序中,该库是通过package.json 定义的,并在一个角度模块中导入。应用要使用EntryB

import { MyModule } from '@myorg/mylib/lib/entryB';

但是,consumer应用的构建抛出了在EntryB中找不到EntryA所需依赖的错误:

ERROR in The target entry-point "@myorg/mylib/lib/entryB" has missing dependencies:
 - @myorg/mylib/lib/entryA

如何处理这些子条目之间的依赖关系?

【问题讨论】:

    标签: angular typescript angular-library


    【解决方案1】:
    - lib
      - entryA
          - /src
          - index.ts
          - public-api.ts
          - package.json
    
          - entryB
             - /src
             - index.ts
             - public-api.ts
             - package.json
    
    - ng-package.json
    - package.json
    
    
    import { entryA } from "../../entryA/src/app/app.module";
    

    【讨论】:

    • 你能再解释一下解决方案吗?如果我理解正确,文件夹结构中的 entryBentryA 的子元素?但这意味着没有其他条目可以依赖于 entryA 或者必须是 entryA 的子元素?
    【解决方案2】:

    我找到了解决方案,因此回答了我自己的问题:

    问题是由于不同的编译。在 Angular 10 中,Ivy 可用于应用程序。但是这个库不是用 Ivy 编译的,也不应该用 Ivy 在 npm 存储库中发布。由于依赖关系,无法对 Angular 10 进行更新以启用 partial 编译。

    发布时可以使用三种分发格式 图书馆:

    视图引擎(已弃用)——传统格式,计划在 Angular 中删除 版本 13。仅当您必须支持 View Engine 时才使用此格式 应用程序。 部分常春藤(推荐)——包含可移植的代码 可以被使用任何版本的 Angular 构建的 Ivy 应用程序使用 从 v12 开始。 full-Ivy——包含私有的 Angular Ivy 指令, 不保证可以跨不同版本的 Angular 工作。 这种格式要求库和应用程序是用 完全相同的 Angular 版本。这种格式对 直接构建所有库和应用程序代码的环境 来源。

    见:https://angular.io/guide/creating-libraries#ensuring-library-version-compatibility

    我有,因为这是一个私有 npm 包,因此将 tsconfig.lib.prod.json 中的构建选项 enableIvy 设置为 true 用于生产构建。角度更新后,选项应设置为partial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2018-05-17
      • 2021-02-16
      相关资源
      最近更新 更多