web-dev-qa-db-ja.com

angular6別のライブラリにライブラリをインポートする方法は?

タイトルが示すように、ng generate library lib;を使用してベースライブラリを生成しました。次に、lib2という名前の別のライブラリを生成しました。 libの一部の基本コンポーネントまたはサービスを使用したいので、liblib2モジュールにインポートしましたが、npm run build lib2が失敗しました。

次のエラーを受け取りました:error TS2307: Cannot find module 'lib'

ベースライブラリを適切にインポートするにはどうすればよいですか?どんな助けでもありがたいです。

テストコードを https://github.com/dyh333/ng6-test に入れました

7
dyh333

最初にライブラリをビルドする必要があります。この質問を参照してください Angular 6 CLI-> ng build build project + librariesを作成する方法

tsconfig.jsonファイル、それはlibsのパスを追加することによって変更されました-したがって、それらをビルドしてdistフォルダーに入力する必要があります。

"paths": {
  "lib": [
    "dist/lib"
  ],
  "lib2": [
    "dist/lib2"
  ]
}

Nx拡張機能の使用の概念を拡張する回答を追加します(quickee/stubsを除くすべてのプロジェクトに使用します)。

これは、nxワークスペース内でlibをビルドするようにng-packagrが設定されていることを前提としています。

Libsなどを作成します。lib1とlib2があるとします。

ここで、lib1がlib2の何かを使用するとします。

  • Lib2をビルドする
  • npmは、リポジトリのルートからlib2のビルド出力をリンクします。
  • Lib1で、必要なアセットをlib2からBUILTバージョンからインポートします。これは、そのlibに対して構成した出力に基づいて構成されます... ... tsconfig.tsのバージョンではありません!!!リンクされたlibのpackage.jsonの「dest」プロパティに設定したものをすべて必要とします。リンク後、node_modulesで見つける必要があります。
  • lib1をビルドする
  • 利益!

これは少し奇妙に聞こえるかもしれませんが、それについて考えれば、そこには感覚があります。 libsは、外部アプリで使用する場合とまったく同じ方法で使用します(まったく同じではなく、リンクしていますが、package.jsonのインストールプロセスをシミュレートしています)。

また、monoリポジトリ内では、ライブラリ全体で相対インポートを使用できます(ここでも、tsconfigパスエントリを無視し、相対パスを使用して他のライブラリからファイルを取得します)。それは機能しますが、おそらく技術的には正しくありませんが、いくつかの頭痛を軽減するかもしれません。

私は大きなプロジェクトでこの質問にぶつかりましたが、解決するのは私のものでした。私はこれらの方法の両方がニーズを満たし、チームに提示され、私には彼らが言ったことには問題がないことを知りましたチームの決定)。

これがnx-extensions以外の設定で機能しない理由はないことに注意してください。しかし、私はどこでも彼らと一緒に仕事をすることはめったにありません。私がすることの大部分は、monorepo devの伝道であり、Angularに直面したとき、NXは私がチームで働いているものです。

0
Tim Consolazio