Quantumleap
1183 words
6 minutes
GitHub Packagesでプライベートパッケージを公開するまでの手順
2023-03-27

背景#

使いまわしたいから作成したけれど、NPM で一般リリースするまでもないようなパッケージを GitHub 上に公開するためのチュートリアルです。

イカリング 3 系統のパッケージを作成したのですが、NPM の方の公開の仕方がわからなかったのでまとめておきます。

これに比べれば Package.swift を載せておくだけで GitHub から直接インストールも更新もできる Swift Package Manager って偉大なんだなあと思いました。

個人用アクセストークンの取得#

Personal Access Tokenを発行します。

発行したアクセストークンはデフォルトでは自分のレポジトリでしか有効でないので、組織で有効にしたい場合には組織の個人用アクセストークンポリシーを設定するから設定して有効化する必要があります。

アクセストークンに必要な権限はwrite:packagesだけなのでとりあえずこれだけ有効化しておきましょう。

で、発行します。発行したアクセストークンをここではGITHUB_TOKENとしておきましょう。

パッケージ名について#

さて、次に package.json を編集していきます。GitHub Packages ではスコープ付きのパッケージしかサポートされていないので、パッケージ名は必ず@SCOPE/PACKAGE_NAMEの形式にする必要があります。

で、SCOPEの値とPACKAGE_NAMEは以下のルールに従う必要があります。

個人組織
SCOPEアカウント名組織名
PACKAGE_NAMEレポジトリ名レポジトリ名

要するに、公開するレポジトリが決まっている時点でSCOPEPACKAGE_NAMEは固定になるわけですね。

公開したいレポジトリがhttps://github.com/SCOPE/PACKAGE_NAMEとなっている必要があるというわけです。

package.json テンプレート#

中略ですが、以下のように書きます。GitHub に公開する場合はregistryの値はhttps://npm.pkg.github.comになります。

ここの値、GitHub だと常にこの値で良いみたいなのですがドキュメントを読むと GitLab だとちょっとめんどくさいっぽいですね。

{
  "name": "@tkgstrator/private-package-test",
  "repository": {
    "type": "git",
    "url": "[email protected]:tkgstrator/private-package-test.git"
  },
  "publishConfig": {
    "registry": "https://npm.pkg.github.com"
  }
}

NPM にログインする#

作成したパッケージをプッシュするためには認証情報を渡さないといけないので、渡します。

このとき、.npmrcを利用するかnpm loginを利用するかが選べます。個人的にはどっちでもいいですがnpm loginの方が安全なのかなとは思っています。

.npmrc を利用する#

touch .npmrcで作成したファイルに認証情報を書きます。

アクセストークンを含むので、.gitignoreに追加するのを忘れないようにしておきましょう。

//npm.pkg.github.com/:_authToken=GITHUB_TOKEN

最初に取得した GITHUB_TOKEN の値をここに書き込みます。

npm login を利用する#

以下のコマンドを入力します。

npm login --scope=@test --auth-type=legacy --registry=https://npm.pkg.github.com
個人組織
UsernameGitHub アカウント名GitHub アカウント名
PasswordGITHUB_TOKENGITHUB_TOKEN
EmailGitHub メールアドレスGitHub メールアドレス

公開したいレポジトリが個人のものでも組織のものでも個人のアカウント名を入力すれば大丈夫だと思います。そのためにアカウントのアクセストークンが組織でも有効になるように設定したので。

ログインができたらnpm publishを実行します。

npm notice === Tarball Details ===
npm notice name:          @tkgstrator/private-package-test
npm notice version:       1.0.1
npm notice filename:      @tkgstrator/private-package-test-1.0.1.tgz
npm notice package size:  35.8 kB
npm notice unpacked size: 276.8 kB
npm notice shasum:        09bef77af0be77cb2cee5b83da07af50e1cd83ed
npm notice integrity:     sha512-Riiz0iJUlvi3o[...]ULnXsE5+IDoZw==
npm notice total files:   106
npm notice
npm notice Publishing to https://npm.pkg.github.com
+ @tkgstrator/[email protected]

するとこんな感じでパッケージを無事に公開することができました。

インストールする#

これだけで公開はできているのですが、

yarn add @tkgstrator/private-package-test

としてインストールしようとすると、

yarn add v1.22.19
[1/4] 🔍  Resolving packages...
error An unexpected error occurred: "https://registry.yarnpkg.com/@tkgstrator%2fprivate-package-test: Not found".
info If you think this is a bug, please open a bug report with the information provided in "/Users/devonly/Developer/package-test/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

として怒られます。@tkgstratorから始まる名前空間(スコープ)の情報がわからないということだと思うので、.npmrcに情報を追記します。

結局.npmrcを使わないといけないのであれば最初から使っていればいいのでは感もありますね。

.npmrcに以下の情報を書き込みます。

@SCOPE:registry=https://npm.pkg.github.com

今回の場合はSCOPEの値はtkgstratorですが、そこは各自変更してください。

yarn add v1.22.19
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
warning " > [email protected]" has unmet peer dependency "@types/node@*".
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ @tkgstrator/[email protected]
info All dependencies
└─ @tkgstrator/[email protected]
✨  Done in 2.67s.

再度実行すると無事にパッケージをインストールすることができました。めでたしめでたし。

GitHub Packagesでプライベートパッケージを公開するまでの手順
https://fuwari.vercel.app/posts/2023/03/github-package/
Author
tkgling
Published at
2023-03-27