Private な Python のパッケージを扱うための GitHub CLI Extension


Private な Python のパッケージの管理に困ったので gh-pip-install という GitHub CLI の Extension を書いてみました。

Python のプライベートなパッケージを配布する方法はいくつかあります。

  • pypiserver を運用する
    • サーバーの管理しんどい
  • pip install git+https://... で Git のコードをそのままインストールする
    • poetry build とか CI で完成させるスタイルには不向き
  • wheel (.whl) や egg (.tar.gz) を Private な場所に置いて配る
    • 一旦ダウンロードする一手間が面倒

今回は GitHub 上で poetry build で作ったコマンドラインツールのパッケージを社内に配布したかったので、 GitHub Release の Assets に置いて配布することにしました。インストールやアップデートは以下のような操作になります。

$ # 最新のリリースのファイル名を確認
$ FILENAME=$(gh release view --repo OWNER/REPO --json assets --jq '.assets[].name | select(test("\\.whl$"))')
$ # ダウンロード
$ gh release download --repo OWNER/REPO -p ${FILENAME}
$ # ダウンロードしたパッケージをインストール
$ pip install ./FILENAME

アップデートするたびに毎回これやってもらうのしんどいなぁ(GitHub Packages が対応してくれれば良いのだけど…)。というわけで上記 3 つのコマンドを 1 つにした gh-pip-install という GitHub CLI の Extension を作りました。

使い方

GitHub CLI をインストールした上で、さらに gh extension install でインストールします。

gh extension install utisam/gh-pip-install
gh extension upgrade pip-install # 更新

基本的には gh pip-install --repo OWNER/REPO で利用します。最新のリリースの Assets から \.whl$ の正規表現にマッチするファイルを探してインストールします。

# 最新のリリースからインストール
gh pip-install --repo OWNER/REPO
# 内部の pip install に -U, -I, --force-reinstall を渡せます。
gh pip-install --repo OWNER/REPO -U
# タグを指定してインストール
gh pip-install --repo OWNER/REPO v1.0
# 内部で pip の代わりに pip3 コマンドを使う
gh pip-install --pip pip3