Angular 9的库带有子入口点循环依赖问题。

9
我有一个关于Angular库次要入口设置的非常具体的问题。我真的不明白如何设置它,使它在它们彼此之间依赖,包括主入口点时正常工作。我已经阅读了ng-packagr的文档和许多问题和堆栈问题,但没有找到真正好的答案。问题在于我想将我们庞大的内部库分成更小的组件,以便于不需要所有内容的应用程序的导入和依赖项变得更小。
所以这就是我想要实现的:
- 主库 @my/my-lib - 次要路径 @my/my-lib/functions - 次要路径 @my/my-lib/constants - 次要路径 @my/my-lib/lang - 次要路径 @my/my-lib/broker - 次要路径 @my/my-lib/signalr - 次要路径 @my/my-lib/sso - 次要路径 @my/my-lib/types
以下是文件夹结构:
projects\my-lib
-- constants\
---- ...
---- package.json
---- public_api.ts
-- functions\
---- ...
---- package.json
---- public_api.ts
-- lang
---- ...
---- package.json
---- public_api.ts
-- broker
---- ...
---- package.json
---- public_api.ts
-- signalr
---- ...
---- package.json
---- public_api.ts
-- sso
---- ...
---- package.json
---- public_api.ts
-- src <-- the main entry point, as setup from the ng g library
---- lib
------ modules <-- the old ones from where i want to source parts out in secondary paths
-------- auth
-------- config
-------- footer
-------- header
-------- log
-------- state
-------- ...
---- public_api.ts
-- ng-package.json <-- main entry point
-- package.json <-- main entry point

现在我的问题是:

前两个,常量和函数,都像预期的那样工作,因为它们不依赖于任何内容。

现在当我想要从主要的@my/my-lib导入来自@my/my-lib/lang的某些东西,并反过来时,我会在其自身上收到循环依赖警告。对我来说,这在第一次听起来是有道理的,因为ng-packagr不知道先构建哪个。

到目前为止,我所读到的是,次要入口点始终先被构建,当我没有来自@my/my-lib/lang@my/my-lib内部服务的依赖项时,这将完美地发挥作用,所以如何设置可以让我从@my/my-lib中导入@my/my-lib/lang中的内容,反之亦然?


在您的情况下,很可能会发生循环依赖。您需要做的是在@my/my-lib中导入@my/my-lib/lang。然后,如果您需要从任何其他库中使用某些功能,则直接在@my/my-lib/lang中导入该库,而不是导入@my/my-lib。 - Anoop Rajasekhara Warrier
你尝试过使用peerDependencies了吗? - Gourav Garg
1个回答

8

据我的经验,如果你使用Angular CLI,次要入口点是在主要入口点之后构建的。唯一可能的引用是从次要入口点引用主库。你可以在次要入口点之间只有单向引用关系。在构建过程中,引用会被解析,并确定次要入口点的构建顺序,以便按照引用顺序进行构建。

对于你的示例,你唯一能做的就是在@my/my-lib/lang里导入来自@my/my-lib的内容,然后在@my/my-lib/lang中导入例如@my/my-lib/types

导入应该是针对库而不是文件直接进行的。

import { MainLibClass } from '@my/my-lib';
import { MyType} from '@my/my-lib/types';

次要入口点就像主库中的另一个独立库,它基于主库或提供一些与主入口点连接的独立功能。因此,就像使用库一样,你永远不能在两个方向上都有引用。

由于你没有提供任何信息说明为什么需要引用在两个方向上进行,我无法再多说什么。根据你的设计,最好为现在每个已创建的次要入口点创建单独的库。


事实上,我不想重新设计实际的主库结构。我只想将某些特定部分外包到次要入口点,以便依赖项仅随次要入口点一起加载,例如当我有类似于oauth2或signalr的东西时。让我给你举个简单的例子。我有一个服务MyLoggingService。它位于主库中。但是这个服务是整个库(包括一些次要入口点)的核心依赖项。如果我说我也必须将此部分移动到自己的次要入口点,例如@my/my-lib/logging,那么这样做是否正确? - JohnnyDevNull
不,你可以像我在答案中描述的那样,在次要入口点内引用主库中的服务。你不需要将其移动到次要入口点。我猜你已经明白了,因为你接受了我的答案。 - Aleš Doganoc
我给你打赏是因为你的回答是唯一且详细的,但并不是解决方案。问题在于当我从主库导入时会导致循环依赖,因为次要入口点将被主库导入。我必须在MyLangugeService from @my/my-lib/lang中导入MyLoggingService from @my/my-lib,但完整的@my/my-lib/lang@my/my-lib内部某些模块的依赖项,例如用于翻译的MyLayoutsModule。这使我想到,我必须将所有交叉依赖项移动到它们自己的次要入口点。 - JohnnyDevNull
1
我的上面的图片告诉你实际的设计。一切都在 src/lib/modules/my-feature-module 下,并且它们有时会相互依赖,特别是来自 src/lib/modules/config/*src/lib/modules/broker/*src/lib/modules/state/* 等等的代码部分。这是旧的成长结构,我想将其中的一些部分拆分出来,这样第三方依赖项,如 @microsoft/signalrangular-oauth2-oidc,只在需要时加载,而不是与整个库一起加载。 - JohnnyDevNull
1
但正如你所说,你想从次要入口点导入到主库中,这是行不通的...我认为这是主要问题。我必须将所有必要的部分移动到它们自己的次要部分或更重要的部分移动到它自己的主路径中,就像Angular一样,例如@angular/core、@angular/common。 - JohnnyDevNull
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接