具有子条目点循环依赖的Angular 9库

具有子条目点循环依赖的Angular 9库,angular,angular-library,ng-packagr,Angular,Angular Library,Ng Packagr,我有一个关于辅助入口点设置的非常具体的问题。我真的不明白,当他们相互依赖时,包括主入口点,我如何设置它使其工作。我已经阅读了ng Packager的文档以及许多问题和堆栈问题,但没有找到真正好的答案。问题是,我想把我们庞大的内部库分解成更小的部分,这样对于不需要所有东西的应用程序来说,导入和依赖关系就会变得更小 所以这里就是我想要达到的目标: projects\my-lib -- constants\ ---- ... ---- package.json ---- public_api.ts -

我有一个关于辅助入口点设置的非常具体的问题。我真的不明白,当他们相互依赖时,包括主入口点,我如何设置它使其工作。我已经阅读了ng Packager的文档以及许多问题和堆栈问题,但没有找到真正好的答案。问题是,我想把我们庞大的内部库分解成更小的部分,这样对于不需要所有东西的应用程序来说,导入和依赖关系就会变得更小

所以这里就是我想要达到的目标:

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
  • Main lib@my/my lib
  • 次要路径@my/my lib/functions
  • 次要路径@my/my lib/constants
  • 次要路径@my/my lib/lang
  • 次要路径@my/my lib/broker
  • 次要路径@my/my lib/signal
  • 次要路径@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
projects\my lib
--常数\
---- ...
----package.json
----公共服务
--功能\
---- ...
----package.json
----公共服务
--朗
---- ...
----package.json
----公共服务
--经纪人
---- ...
----package.json
----公共服务
--信号员
---- ...
----package.json
----公共服务
--单点登录
---- ...
----package.json
----公共服务

--src根据我的经验,如果您使用的是Angular CLI,那么辅助入口点是在主入口点之后构建的。唯一可能的引用是从辅助入口点引用主库。辅助入口点之间只能在一个方向上有参照。在构建过程中,将解析引用,并确定辅助入口点的构建顺序,以便按照引用顺序构建它们

对于您的示例,您唯一可以做的事情是从
@my/my lib
中的
@my/my lib/lang
导入内容,然后在
@my/my lib/lang
中导入例如
@my/my lib/types

导入应直接导入到库,而不是文件

import { MainLibClass } from '@my/my-lib';
import { MyType} from '@my/my-lib/types';
辅助入口点类似于主库中的另一个独立库,它构建在主库之上,或者提供一些连接到主入口点的独立功能。这就是为什么像图书馆一样,你永远不能在两个方向上都有参考


我不能说更多,因为你没有提供任何信息,为什么你需要在两个方向的参考。从我从您的设计中所看到的情况来看,您最好为现在已创建辅助入口点的每个零件创建单独的库。

在您的场景中可能会出现循环依赖。您需要做的是在@my/my lib中导入@my/my lib/lang。然后,如果您需要任何其他库的某些功能,那么直接在@my/my lib/lang中导入,而不是导入@my/my-lib。您是否尝试过peerDependencies?问题是,我不想重新设计实际的主库结构。我只想将一些特定的部分外包给二级入口点,这些依赖项只能通过二级入口点加载,例如,当我有oauth2或signalr之类的东西时。让我给你举个简单的例子。我有一个服务
MyLoggingService
。它位于主库中。但该服务是整个库(包括一些辅助入口点)的核心依赖项。当我说我必须将此部分也移动到它自己的辅助入口点(如
@my/my lib/logging
)时是否正确?不,正如我在回答中所述,您可以从辅助入口点内的主库引用服务。您不需要将其移动到辅助入口点。我猜你已经明白了,因为你接受了我的答案。不,我给了你赏金,因为你的答案是唯一详细的,但不是解决方案。从主库导入时出现的问题导致循环依赖,因为第二个入口点将由主库导入。我必须从@my/my lib
导入
MyLoggingService,从@my/my lib/lang
导入
MyLanguageService,但是完整的
@my/my lib/lang
依赖于
@my/lib
中的一些模块,例如用于翻译的
MyLayoutModule
。这让我想到,我必须将所有交叉依赖项移动到它们自己的辅助入口点。您不能在主库中导入辅助入口点,至少对我来说,这根本不起作用,即使您没有两个方向的引用。您需要将所有常用的东西放在主库中,然后在辅助入口点中使用它们。可能主库中需要语言服务的功能也应该是辅助入口点,然后您可以在那里引用它。我需要看看你的设计,才能说出更多可以做的事情。我上面的图片告诉你实际的设计。一切都在
src/lib/modules/myfeaturemodule
下,它们有时相互依赖,特别是
src/lib/modules/config/*
src/lib/modules/broker/*
src/lib/modules/state/*
等的代码部分。这是我想要拆分的旧结构,这样第三方依赖项,如
@microsoft/signalr
angular-oauth2-oidc
只在需要时加载,而不是加载整个库。