web-dev-qa-db-ja.com

npm package.json OS固有の依存関係

Npm package.jsonファイルでOS固有の依存関係を指定する方法はありますか?

たとえば、ユーザーがLinuxを実行している場合、モジュールの依存関係として 'dbus'( https://npmjs.org/package/dbus )のみをインストールします。 MacとWindowsでは異なる依存関係になります。

57
sandeepmistry

設定に応じて、これを実行する良い方法があります。

npm package.jsonは os キーをサポートしますが、

optionalDependencies

  • osを使用して、モジュールをインストールできるOSを指定できます。
  • optionalDependenciesはモジュールの依存関係であり、インストールできない場合、npmはそれらをスキップしてインストールを続行します。

このようにして、モジュールに各OSのオプションの依存関係を持たせることができ、機能するもののみがロード/インストールされます^。^

EDIT:@Sebastienが以下で言及するように、このアプローチは危険です。どのOSでも、少なくとも1つの依存関係が「必須」で、残りが「オプション」です。依存関係のすべてのバージョンをオプションにすることは、正当な理由でインストールが失敗した場合、サイレントにインストールをスキップし、本当に必要な依存関係が失われることを意味します。

35
TinyTimZamboni

短い答えはノーだと思います。いくつかの回避策を考えることができます-最も簡単なのは、OSに関係なくpackage.jsonにすべてを追加し、実行時にrequire()を追加することです。

それがうまくいかない場合は、インストールスクリプトを使用して目的の結果を取得できる可能性があります- https://docs.npmjs.com/misc/scripts

私はこれをテストしていませんが、うまくいくと思います:

Package.jsonに次のようなものを追加します。

,"scripts": {
  "install": "node install_dependencies.js"
}

次に、OSをチェックし、適切なinstall_dependencies.jsコマンドを実行するnpm install ...ファイルを追加します。

7
Nathan Friedly

bindings-shypモジュールもあります。

https://www.npmjs.com/package/bindings-shyp

ネイティブモジュールの.nodeファイルをロードするためのヘルパーモジュール

これは、Node.jsネイティブアドオンモジュールの作成者向けのヘルパーモジュールです。基本的には、ネイティブモジュールの.nodeファイルをrequire()する「スイスアーミーナイフ」です。

Nodeのネイティブアドオンの履歴を通じて、アドオンは、使用したビルドツールとノードのバージョンに応じて、さまざまな場所でコンパイルされてきました。さらに悪いことに、gypビルドツールはリリースビルドまたはデバッグビルドを作成でき、それぞれが異なる場所にビルドされます。

このモジュールは、ネイティブアドオンが構築される可能性のあるすべての場所をチェックし、正常にロードされた最初の場所を返します。

1
TinyTimZamboni