web-dev-qa-db-ja.com

Angular 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

これが私の問題です:

最初の2つである定数と関数は、何にも依存しないため、期待どおりに機能します。

ここで、メイン@my/my-lib/lang@my/my-libから何かをインポートし、逆にしたい場合、それ自体に循環依存の警告が表示されます。 ng-packagrはどちらを最初にビルドするかわからないので、そもそも論理的に聞こえます。

これまで読んだことは、セカンダリエントリポイントが毎回最初にビルドされることでした。@my/my-lib/langから@my/my-lib内のサービスへの依存関係がない場合、これは完全に機能するため、どのように設定できますかこれは、@my/my-lib/langから@my/my-libにあるものをインポートし、逆にできることですか?

3
JohnnyDevNull

私の経験では、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';

セカンダリエントリポイントは、メインライブラリ内に構築される、またはメインエントリポイントに接続されるいくつかの独立した機能を提供する、メインライブラリ内の別の独立したライブラリのようなものです。これが、ライブラリの場合と同様に、双方向の参照を持つことができない理由です。

さらに、両方向に進むために参照が必要な理由を何も提供していないので、私には言えません。私があなたの設計から見たものから、おそらくあなたが今二次エントリーポイントを作った各部分のために別々のライブラリーを作成する方が良いでしょう。

1
AlesD