npm パッケージに OS ネイティブのファイルを入れ複数プラットフォームに対応させたいが、容量等の問題で不要な物をインストールさせたくないというケースで、インストール時に必要なファイルだけ取得してくる方法を紹介します。
要約
ネイティブファイルのプラットフォーム毎にパッケージを作成し、package.json の os
で対象 OS を指定します。
--save-optional
で全プラットフォーム用のパッケージを参照すれば不要な物はスキップされます。
サンプル
解説
サンプルファイルは4つのディレクトリがあり、src がパッケージを参照するソース。nativeTest が参照されるライブラリ、nativeTest-linux, nativeTest-win がそれぞれ linux, windows 用のネイティブファイルです。
src が nativeTest を、nativeTest が nativeTest-linux , nativeTest-win を参照します。
1つのリポジトリに複数の npm パッケージを入れるために gitpkg.now.sh を使用しています。解説はこちらの記事をご覧ください。
githubリポジトリのサブフォルダーからnpm installしたい時
ネイティブファイル用パッケージ
nativeTest-linux , nativeTest-win はテスト用のネイティブファイルとして .sh , .cmd ファイルがおいてあり、echo で文字列を返します。
package.json の os
でインストール対象になる OS を指定しているので、対象外の OS にインストールしようとすると失敗します。
https://www.startup-cloud.co.jp/liberty-technology/PublicItems/npm/package.json.html#os
windows 用パッケージを linux 環境にインストールしようとした例:
同様に cpu
でアーキテクチャを指定することもできます。
https://www.startup-cloud.co.jp/liberty-technology/PublicItems/npm/package.json.html#cpu
ライブラリ用パッケージ
nativeTest では上記ネイティブファイルを実行し、結果を取得します。
上記2パッケージを参照していますが、普通に参照すると非対応 OS でエラーになります。
--save-optional
オプションを付けてインストールすることで非対応 OS でもエラーにならずスキップされます。
package.json には dependencies
ではなく optionalDependencies
に記述されます。
https://www.startup-cloud.co.jp/liberty-technology/PublicItems/npm/package.json.html#optionaldependencies
{
"name": "nativetest",
<略>
"optionalDependencies": {
"nativetest-linux": "https://gitpkg.now.sh/Hotspring-r/PlatformSpecificPackageTest/nativeTest-linux?main",
"nativetest-win": "https://gitpkg.now.sh/Hotspring-r/PlatformSpecificPackageTest/nativeTest-win?main"
}
}
本体
src では nativeTest を参照しています。
nativeTest がネイティブファイル用パッケージを参照しているため必要な物は自動でインストールされます。
動作確認
Windows
Windows 環境では nativefile.cmd が実行され、Hello Windows! が表示されます。
native-linux はインストールされません。
linux
linux 環境では nativefile.sh が実行され、Hello linux! が表示されます。
警告が出て windows 用パッケージのインストールがスキップされていますが、エラーにはなっていません。
windows で警告が出ない理由はよくわかりません。別の環境では出てたのでバージョンとかだと思います。