GitHub Package Registry に npm パッケージを Publish してみた

普段 npm パッケージを利用する際は、registry.npmjs.org という npm 公式のレジストリからダウンロードしている。

npm レジストリは npm 公式以外にも存在し、GitHub にも GPR : GitHub Package Registry というレジストリが用意されている。

npm 自体が GitHub に吸収されたので (参考)、GPR を使う意義がどのくらいあるかは分からないが、とりあえず試してみた。

目次

GitHub Actions で GPR に npm Publish する

GPR への npm publishnpm コマンドでもできるが、レジストリの切り替えなどが面倒臭いので、GitHub Actions から行うことにする。

前提となるプロジェクトでは、@neos21/hoge というように Owner 名を含んだスコープパッケージ名を package.json に定義しているものとする。publishConfig オプションの指定は不要。

master ブランチへの Push 時に起動し、can-npm-publish というパッケージで npm publish できそうかチェックした上で公開する、という Workflow を書いた。

name: Publish To GPR
on:
  push:
    branches:
      - master
  # ↓ 手動で再実行できるように書いておく
  workflow_dispatch:
jobs:
  publish-to-gpr:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Use Node.js And Setup .npmrc
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
          # ↓ GPR に接続するにはココで以下のレジストリ URL を指定する
          registry-url: 'https://npm.pkg.github.com'
          # ↓ ユーザ名および package.json で指定したスコープに合わせる
          scope       : '@neos21'
          always-auth : true
        env :
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Can Publish
        run : npx can-npm-publish --verbose
        env :
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Install
        run : npm install
        env :
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Build
        run : npm run build --if-present
        env :
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Publish
        run : npm publish --access=public
        env :
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

とまぁこんな感じ。

GitHub Actions のことも GitHub Package Registry のことも、イマイチ分かりやすいコードが見当たらず、試行錯誤の結果、コレで Publish できた。

GPR に Publish したパッケージを使うには

こうして GPR に公開した npm パッケージを、今度は使用する側に回る。

まず ~/.npmrc に次の1行を追記する。

registry=https://npm.pkg.github.com/【Owner 名】

Owner 名は、先程 npm publish したパッケージの Owner 名を指定する。例えば僕のパッケージなら

registry=https://npm.pkg.github.com/neos21

とする。

続いて npm login する。

$ npm login --registry=https://npm.pkg.github.com

ユーザ名、パスワード、メールアドレスを聞かれるので、GitHub のユーザ名、パスワード、メールアドレスを入力する。ログイン時に二段階認証を使っている場合は、パスワードは API Token を使うこと。git push 時の認証と同じ考え。

ログインできると、~/.npmrc に次の1行が追記される。コレを直接書いてしまっても同じ効果になる。

//npm.pkg.github.com/:_authToken=【トークン文字列】

よって、~/.npmrc に以下の2行があれば、GPR からパッケージを取得できるようになる。

registry=https://npm.pkg.github.com/【Owner 名】
//npm.pkg.github.com/:_authToken=【トークン文字列】

あとは指定した Owner 名の配下のパッケージを npm install してみたりすれば良い。--verbose を付ければキチンと GPR からダウンロードしていることが分かる。

オマケ:GPR のバージョンバッジを作る

Sheilds.io というバッジを作成できるサービスも、GPR に対応しているので、GPR のバージョンバッジが作れるようになった。次のような Markdown を書けば良い。

![GPR Version](https://img.shields.io/github/package-json/v/neos21/npm-neos21?label=gpr)

GPR パッケージは一度公開すると次のような URL を生成する。

コレをリンクに組み込んでも良いだろう。

[![NPM Version](https://img.shields.io/npm/v/@neos21/neos21.svg)](https://www.npmjs.com/package/@neos21/neos21)

[![GPR Version](https://img.shields.io/github/package-json/v/neos21/npm-neos21?label=gpr)](https://github.com/Neos21/npm-neos21/packages/323375)

こんな風に Markdown を書けば、npm と GPR のバージョンバッジを両方並べられる。

以上

GitHub Package Registry への npm Publish を GitHub Actions で自動化し、それを利用する方法も押さえた。

一般的なパッケージの利用ではあまり GPR を使うことは少ないかもしれないが、社内向けのプライベートレジストリとして使うような機会はあり得るので、知っておくと良いかと。