📘

conda-forgeに自作ライブラリを登録した

2023/10/07に公開

はじめに

PythonでSMiPolyというライブラリを作り、PyPIで公開していますが、この度、condaでインストールできるように、conda-forgeに登録しました(Anaconda.orgではこちら)。登録は、公式のインストラクションのStep-by-step Instructionsを中心に読んで進めました。
Zennでも、「Conda-ForgeにPythonパッケージを公開する手順」や、「自作パッケージをconda-forgeに登録してみた」といった記事が投稿されており、大変参考にさせていただきました。

概要

PyPIに登録し、pipでインストールできる状態としていたので、全体としては思っていたより手軽でした。
SMiPolyはRDKitと依存関係があり、おそらくこのことが原因で引っかかりました。また、いくつか初回(心)者の失敗もあったので、それらを中心に記載します。結果的に、grayskullで自動生成したmeta.yamlの一部を手動で修正して、対応しました。トラブル時の画面をキャプチャしていなかったので(気持ちに余裕なく^^;)成功したときの画面に書き込んでいる点、ご容赦を。

内容

1. meta.yamlの生成

念のためcondaで新しい仮想環境を作ってgrayskullをインストールし、1つ目の記事と同じ方法でmeta.yamlを作成しました。公式のStep-by-step Instructions手順8に、SHA256についての言及があります。grayskullを使って生成したmeta.yamlでは、sourceのセクションに、sha256が転記されていましたので、マニュアルでの対応は不要でした。

2. pull request 一回目

手順に従い、staged-recipesのmainブランチをForkして、新しいブランチを作りました。このブランチのrecipesディレクトリの下に、パッケージ名のディレクトリを作り、先のmeta.yamlをアップロードした後、pull requestを送りました。

3. チェックがnot successfulであせる

比較的すぐに、自動的にチェックが走るようです。送ったpull requestは、github/cond-forge/staged-recipesのPull requestsで確認できますし、登録のメールアドレスに通知が来ました。ところが、一部のチェックがnot successfulでした(図1)。

図1. チェックが通らない
こうなると最早お手上げ、、、なのですが、あきらめる、というのも悔しいですし、、1つ目の記事の「チェックが通らなかった場合」に勇気づけられながら、原因を探索しました。
"details", "1 errors /0 warnings"とたどると、Jobsの下の"linux_64"や"osx osx_64"、"win_64 win"に軒並み×が付いています。
とりあえず、"linux_64"を開くと、"Rundocker build"(だったと思う)がやはり×になっており、ログの最後の方「smipolyはrdkitが必要だがインストールされていないよ」みたいなことが(英語で)書いてありました(図2)。どうも、RDKitが関わる何かがありそうだ、ということまでは、判りました。

図2. 【イメージ】RDKitが関連していそうなエラー表記

4. 前例に頼って原因を探る

益々お手上げ感が増してきましたが、なんとかならないものか、と考えてみます。そういえば、PyPIに登録する前に、test PyPIで動作確認の際、test PyPIの方には依存パッケージがなく、うまく検証できなかったことを思い出しました。もしかすると、conda-forgeにrdkitが登録されていない?「そんなことはないだろう」と思って調べると、やはりそんなことはなく、これが原因ではないことは、判りました。

二日近く悩んだ結果、思い至った結論が、「きっと同じことで困った人がいるに違いない 」でした。github/cond-forge/staged-recipesのPull requestsに戻り、上のFiltersに"rdkit"と入力して(図3)、RDKitと依存関係のあるパッケージを開発され、登録されている方を探すことにしました。

図3. 同じような困りごとの方がおられないか検索
検索により関係しそうなpull requestを絞り込みました。あとは、上からシラミつぶしに見ていったのですが、幸いなことに、比較的上の方に、同じトラブルがあって、コミュニティに助力を求めておられる方がおられました。それに対する回答が、「pip checkは時々失敗するので、手でpip listに書き換えてみて、再確認してはどうですか」というものでした(後から、これは一般的な事象のようだ、と判りました)。

5. 修正する

修正するのはmeta.yamlの内容です。チェックでの問題だったことから、test:のセクションを見ると、commandsにpip checkとありました。これを、上記助言通りpip listに書き換え、commitしました。すぐに自動でチェックが走り、今度は問題なくチェックが通りました(図4)。

図4. チェックがとおった

5. reviewを依頼する

それぞれの開発言語等に応じて、該当するteamをメンションして(@conda-forge/help-pythonのように)、reviewを依頼します。
ただし、今までconda-forgeに登録をしたことがない人、つまり初めてconda-forgeにreviewを依頼する人は、該当teamに直接メンションできないとのこと。
@conda-forge-admin, please ping team
といった、「特別な」コマンドを使うよう、staged-recipesのページのReadMe 12項に記載がありました。私、これを見落としていて、一週間くらい、reviewしてもらえないなー、と思いながら過ごしました^^;

まとめ

conda-forgeに登録する仕組みは今まで知りませんでしたが、PyPIに登録してあれば、grayskullであっという間にmeta.yamlが作成できることや、チェックやラベルの付与が自動化されていることなど、先進的、効率的と感じました。
conda-forgeへの登録について、日本語では、あまり情報がないように思います。今回のように何かあると、中々厳しい気持ちになりますが、今回は、過去事例を調べることにより、なんとかなりました。
それにしても、ReadMeなどの公式の説明や、過去トラブル事例をちゃんと読むのは大事ですね。
パッケージは、JSTで月曜日の20:00頃reviewを依頼し、なんと3分後にmergeいただき、翌日朝には公開されていました(一週間が・・・)。コミュニティの皆様のご尽力ご協力に感謝します。
I sincerely thank the reviewers.

Discussion