【npm】Github Packagesを使う前に知っておきたいこと
npmのパッケージを社内利用のためなどに公開したい場合、Github Packagesを検討したことはありませんか?
しかし、もしいくつかの条件を満たすのであれば、Github Packagesは不要かもしれません。
npmの公式ページの「npm scripts」に関するページ内のprepareについての説明にはこう書かれています。
NOTE: If a package being installed through git contains a prepare script, its dependencies and devDependencies will be installed, and the prepare script will be run, before the package is packaged and installed.
https://docs.npmjs.com/cli/v8/using-npm/scripts#life-cycle-scripts
重要なところだけ訳すと、
もしprepareスクリプトを含むパッケージがGit経由でインストールされた場合、そのdependenciesとdevDependenciesがインストールされ、prepareスクリプトが実行されます。
とのことです。
npm install
のコマンドはGitのコミットまで特定できる情報が、npmのサポートする形式で指定されていれば、正常に認識してくれます。
つまり、下記のようなことが可能です。
npm install orgname/repo-name#v1.0.0
(v1.0.0
というタグが付いている場合を想定しています)
タグ以外にもコミットハッシュやブランチなど、commit-ishな値であれば何でも受け付けています。
(ただしブランチで指定する場合、更新する際にnpm update
を実行する必要があり、package.jsonの中身も変わらないので変更が分かりづらくオススメしません。)
こうしてGit経由でインストールがされると、そのリポジトリのpackage.jsonで定義されている依存関係(devDependencies含め)がインストールされるので、prepareスクリプトにnpm run build
のようなビルド用のコマンドが実行できます。
つまり、Github Packagesを導入した場合にGithub Actionsなどで実行されるパッケージ作成のプロセスがインストールしたユーザーのPC上で実行できてしまうのです。
大多数の方は、これだけで十分なのではないでしょうか?
問題が起きるとしたら「ユーザーPCで実行される」という点で、OSやnpm/nodeのバージョンに影響されることです。
しかしそれも、package.json内で定義することでサポートしていない場合はエラーにすることもできます。
{
"engines": {
"node": "^14.15.0",
"npm": "^7.17.0"
},
"os": [
"darwin",
"linux"
]
}
つまり、どうしてもユーザーPC上でビルドさせられない場合を除けば、Github Packagesは必ずしも導入する必要はありません。
2年前にGithubがnpmを買収しましたが、少なくともnpm バージョン8.xの現在はprepareスクリプトの仕様は受け継がれています。
筆者的にはタグ付けるだけの方が楽そうに思いますが、いかがでしょう。
Github Packages以外の一つの選択肢として、選ぶ価値はあると思われます。
Discussion