📦

自作パッケージをconda-forgeに登録してみた

2022/06/27に公開

3行でまとめると

  • 自作PyPIパッケージをconda-forgeに登録してみました
  • grayskullによるmeta.yaml自動生成機能が神
  • パッケージ名に大文字があると小文字に変換されてしまうので注意

はじめに

これまで自作パッケージをPyPIBioCondaに登録したことはありましたが、conda-forgeへはまだ経験がありませんでした。

ちょうど最近conda-forgeに提出できそうなパッケージを作ったので、試してみました。

WindowsとPOSIXのパスを変換するシンプルなPythonモジュールです。

https://github.com/akikuno/wslPath

conda-forgeとは

https://conda-forge.org/

condaでインストールできるパッケージを集めたコミュニティ主体のリポジトリです。

公開されているパッケージ数が18,444 (2022-06-27現在) と、condaのなかでもっとも巨大なリポジトリのひとつとなっています。

ガイドライン

おおよそ以下の登録手順に従いました。(2022年6月閲覧)

https://conda-forge.org/docs/maintainer/adding_pkgs.html

grayskullのインストール

ガイドラインにしたがってgrayskullをインストールします。
どうやら自動でmeta.yamlを生成してくれるツールのようです。

conda create -y -n grayskull
conda install -y -n grayskull -c conda-forge grayskull
conda activate grayskull

grayskullでmeta.yamlを生成

以下のコマンドを打つと、{パッケージ名}/meta.yaml(今回はwslPath/meta.yaml)が作られます。

grayskull pypi --strict-conda-forge wslPath

staged-recipesをフォークし、meta.yamlを入れる

こちらのリポジトリをフォークします。

https://github.com/conda-forge/staged-recipes

staged-recipes/recipes/{パッケージ名}のディレクトリを作り、そこに先ほど生成したmeta.yamlをコピーします。

git clone https://github.com/akikuno/staged-recipes.git
mkdir -p staged-recipes/recipes/wslPath/
cp wslPath/meta.yaml staged-recipes/recipes/wslPath/

そののち、変更をcommitします。(VScodeのGUIでやってしまったのでコマンドは割愛します。)

Pull requestを送る

以下のフォークしたリポジトリを開くと、This branch is 1 commit ahead of conda-forge:main.となっています。
1 commit aheadをクリックしてView pull requestを押すとPull requestを送ることができます。

そうするとフォークもと(conda-forge)のPull requests画面に移行しまして、いよいよ登録作業が始まります。

https://github.com/conda-forge/staged-recipes/pull/19381

いろいろと細かい注意事項が書いてありますが、

  1. Pull requestのタイトルを意味のあるものにする
  2. @conda-forge/help-pythonなどで特定のコミュニティにレビューを依頼する

の2点に注意すれば大丈夫でした。

念のためチェックリストはすべて埋めました。

@conda-forge/help-pythonはどうやら自動チェックが終わった後にやるべきだったようです。

また、@conda-forge/help-python@conda-forge/staged-recipesの両方を使っている方もいました。

Mergeを待つ

あとはマージされるのを座して待ちます。

今回は金曜日の正午にレビューを依頼して、土曜日の深夜にマージされました。

conda-forgeコミュニティの迅速な対応に深謝いたします。

結果

無事、conda-forgeに登録することができました。

https://anaconda.org/conda-forge/wslpath

注意点

パッケージ名の大文字が小文字になる

本家コマンドはwslpathであり、さすがに丸かぶりは避けたかったのでwslPathとcamelCaseにしました。

PyPIではwslPathのまま表記されたのですが、conda-forgeではwslpathと小文字となってしまいました。

ちなみにconda install -c conda-forge wslPathとcamelCaseにしてもインストールできました。

BioCondaとの違い

PyPIパッケージを更新した際にBioCondaはPyPIに同期して全自動で更新作業をしてくれます。一方でconda-forgeは@conda-forge-admin,please add bot automergeというタイトルをつけてPRをマージする必要があるみたいです。

(追記: 2024-09-01)

  • PyPIパッケージが更新されると、BioCondaと同様に全自動で更新作業をしてくれるようになっていました。 BioCondaとは違って、Mergeには権利者の許可が必要ではなく、BotがReviewをしたら自分自身でMergeを行う必要があります。簡単ですが、多少の不安はあります😅

パッケージのアップデート (追記:2023-08-10)

  • conda-forgeでのパッケージのアップデートは、conda-forgeにパッケージを登録した際に作られる{package名}-feedstockに変更を加えるようです
  • 今回の例でパッケージのアップデートを行うには、以下の手順を踏みます
# ghコマンドのインストールと認証を済ませておきます

# wslpath-feedstockをforkします
gh repo fork conda-forge/wslpath-feedstock
# wslpath-feedstockを同期します
gh repo sync akikuno/wslpath-feedstock -b main
# wslpath-feedstockをクローンします
git clone https://github.com/akikuno/wslpath-feedstock.git`
# 既存のmeta.yamlを最新のmeta.yamlに置き換えます
cp -f wslPath/meta.yaml wslpath-feedstock/recipes/wslPath/
# 変更をコミットします
cd wslpath-feedstock
git checkout -b update-wslpath
git add recipes/wslPath/meta.yaml
git commit -m "Update wslPath"
git push origin update-wslpath
# あとはhttps://github.com/akikuno/wslpath-feedstockからプルリクエストを送ればOK

おわりに

grayskullmeta.yamlを自動生成できるのは目からウロコでした。自動生成されたファイルについて手直しがまったく必要なかったので、登録のハードルが劇的に下がりました。別の機会にBioCondaに登録するときにも使おうと思います。

分野によっては多言語のパッケージを組み合わせて利用することが多く、複数のパッケージマネージャーを使う必要があることがあります。condaは多言語に対応しているので、condaでパッケージを登録しておくとcondaだけで環境構築が完結できることが大きな利点です。

PyPIに登録済みのパッケージであれば想像よりもはるかに簡単にcondaに登録できるので、ぜひトライしてみてください。

Discussion