2016-03-27 12 views

答えて

3

ノードはシンボリックリンクを完全にうまく処理できます。これを達成する方法は、あなたの目標のいくつかに依存するつもりです。最も重要なこと:バージョンコントロールからプロジェクトをダウンロードする他の開発者にとって、あなたはどんな経験をしたいのですか?

この経験を設計する際には、可能なことについての洞察を得るために、ノードモジュールの読み込みアルゴリズムについて読むことが非常に役立ちます。一般的に

  • Explanation of require() internals

    Official documentation

    • 、私の推薦は、プロジェクト間の重複の依存関係を気にしないことです。 「修正」とは、メンテナンスコストの価値がありません。これには、従属性グリッドロック(サブプロジェクトの矛盾するニーズ)が含まれており、場合によってはカスタム構造を考慮するカスタムツールが必要です。

      途中で警告が表示されたら、どうすればいいですか?最も簡単な方法は、さまざまなサブプロジェクトをカプセル化するスーパープロジェクトを作成することです。サブプロジェクトは、スーパープロジェクトの依存関係を効果的に継承します。

      superproject/ 
      |-- node_modules/ 
      | +-- socket.io/ 
      |-- package.json 
      |-- subprojectA/ 
      | |-- node_modules/ 
      | | +-- browserify/ 
      | |-- package.json 
      | +-- app/ 
      |  +-- client.js 
      +-- subprojectB/ 
          |-- node_modules/ 
          | +-- express/ 
          |-- package.json 
          +-- lib/ 
           +-- server.js 
      

      この構造は、それがまだ可能である(あなたは、サブプロジェクト内のファイルは、自分のモジュールとsuperproject/node_modulesでそれらのいずれかをrequire()できる期待するかもしれないが、彼らは彼らの兄弟サブプロジェクト内にない簡単require()モジュールをする方法を動作します明示的なパスを使用します)。言い換えれば、client.jsはrequire()をbrowserifyし、socket.ioにはパスを使用できませんが、require()のパスを使用する必要があります。

      npmは、package.jsonを "検索"し、node_modulesディレクトリ内のモジュールをインストール時などにそのファイルの兄弟として扱うということです。つまり、現在の作業ディレクトリサブプロジェクトにpackage.jsonファイルがない場合を除き、モジュールをインストールするにはsuperprojectにする必要があります。

    +1

    非常に小さなプロジェクトであってもファイルがかなり大きくなり、(ほとんど)同じプロジェクトを使用している新しいプロジェクトを設定すると間接的に帯域幅が浪費されるため、 "重複した依存関係"依存関係。 – prusswan

    +0

    私はそれらの欲望に関連することができます。しかし、私はあなたがこのように様々なプロジェクトを密接に結びつけることは、別の種類の負担を引き起こすことに気付くでしょう。プロジェクトxが特定の動作を必要とするため、依存関係を更新できない場所。しかし、プロジェクトyはそれを別々に使用しており、新しいものが必要なので、実際には更新する必要があります。昔は、すべてのnpmモジュールがグローバルであったが、コミュニティはそれが価値がないと気づいたので、この習慣は止まった。 https://nodejs.org/en/blog/npm/npm-1-0-global-vs-local-installation/ 擬似グローバルモジュールを実行する方法はまだあります。 –

    +1

    スーパープロジェクトはすばらしい解決策です!どうもありがとう。私の場合は、開発専用タスク(gulp)のためにノードを使用するいくつかのLaravel PHPプロジェクトに取り組んでいます。Gulpとrequire()はローカルにインストールされている場合にのみ動作しますが、5MBのPHPプロジェクトごとに200MBのnode_modulesを複製することは、特に自分自身でノード開発を行っていないため、完全に不合理です。私が見つけた唯一の賢明な解決策は、スーパープロジェクトだけです。私は、5.2で必要とされるツールの単一のコピーと5.2のプロジェクトのすべてと一緒にlaravel-5.2フォルダを持つことができます。ブリリアント! – Tobia

    関連する問題