🏝️
Google Artifact Registryのprivate npmレジストリをbunから利用する
背景
package managerをbunに移行する時にgoogle-artifactregistry-authがbunに対応しておらず、困ったので認証ツールを自作しました。
仕組み
npm版のgoogle-artifactregistry-authはプロジェクトに配置された.npmrcからregistryとscopeに設定されているregistryを抜き出し、google authライブラリから取得したtokenと一緒にHomeディレクトリの.npmrcに保存することでglobalに認証情報が有効になる仕組みだったので、そちらを踏襲しました。
bunのレジストリ認証(公式ドキュメントより)は、以下の形式で設定可能です。
[install]
# set default registry as a string
registry = "https://registry.npmjs.org"
# set a token
registry = { url = "https://registry.npmjs.org", token = "123456" }
# set a username/password
registry = "https://username:password@registry.npmjs.org"
[install.scopes]
# registry as string
"@myorg1" = "https://username:password@registry.myorg.com/"
# registry with username/password
# you can reference environment variables
"@myorg2" = { username = "myusername", password = "$NPM_PASS", url = "https://registry.myorg.com/" }
# registry with token
"@myorg3" = { token = "$npm_token", url = "https://registry.myorg.com/" }
google-artifactregsitryはurl,token型のフォーマットで認証可能なので、その形式にコンバートしています。
bunにも$HOME/.bunfig.tomlを設定するとglobalに設定が有効になる仕組みがあるので、それを利用します。また、既存にbunfig.tomlがある場合は、それを上書きせず、設定をマージします。元にする.npmrc,元となるbunfigファイル,出力先のbunfigファイルのパスはオプションで変更可能です。
使い方
- google-artifactregistry-auth同様にprint-settingで取得した.npmrcをプロジェクトに配置します。
gcloud artifacts print-settings npm [--project=PROJECT] \
[--repository=REPOSITORY] \
[--location=LOCATION] \
--scope=@SCOPE-NAME \
-
npx -y @tkow/bun-google-artifactregistry-auth
を実行すると、認証が成功した場合、$HOME/.bunfig.tomlが生成されます。 -
セッションが持続している場合、bunでnpmがインストールできます。
-
お好みでscriptにaliasを入れて、google-artifactregistry-authと差し替えるのを簡単にしておきます。
"scripts": {
"npm:login": "npx -y @tkow/bun-google-artifactregistry-auth"
}
Discussion