🌊

【npm】Github Packagesを使う前に知っておきたいこと

2022/06/10に公開

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のサポートする形式で指定されていれば、正常に認識してくれます。

https://docs.npmjs.com/cli/v7/commands/npm-install

つまり、下記のようなことが可能です。

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内で定義することでサポートしていない場合はエラーにすることもできます。

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