はじめてOSSライブラリを育てた話
公開してるOSSライブラリが自分史上初めて(微々たるものではあるけれども)誰かに使われるようになったので振り返ってみる。
対象のライブラリはこれ。
開発のきっかけ
Raspberry Piを使ったデバイス開発をしていると、システムに明るくないエンドユーザー向けに何かとネットワーク設定を変更できるようにしたいユースケースが出てくる。
そんなときはWebやUART経由などでRaspberry PIの外からdhcpcd.confやwpa_supplicant.confを編集出来るようにUIを作って提供するのだけれど、設定ファイルのパーサーから書いたりしなければならず、これがなかなかに面倒くさい。
一方で、Linuxのネットワーク設定というとNetwork-Managerが主流ではあるけど、Raspberry PI OSではデフォルトになっておらず、またNetwork-ManagerというとGUIによる設定の印象が強かったので、どうにかならんかなとは思っていた。
ある日、CLIのnmcliがあるバージョンから結構な範囲で色々できることに気づき、これでできそうだなーとPythonからCLIを叩いて使えるライブラリを作成した。
開発当初のコンセンプト
実装的にはコマンド叩いてパースする程度なので、作り自体は単純なもの。
そんな中で、とにかく型は定義したい、dataclassなども使いたいということでPythonは3.7以降対象として、可能な限りテストも書いた。
APIのインターフェイスはなるべく直感的にわかるようにnmcliのコマンド・サブコマンドから連想できるようにした(そのためにPythonで__call__とか初めて使った)。
エラーもnmcliのステータスコードに準拠して例外を定義した。
また、テストのときなどに都度モック作らずに良いように最初からdummyのモッククラスを搭載した(現在はおまけ要素程度になっている)。
公開当初とPyPIへの登録
最初はPyPIにも登録せず、ビルドしたwheelファイルをGithubのReleaseに添付する形で公開した。そのためライブラリ名を決める際に特に悩むことなくnmcliそのままにした(そのせいでCLIの方のnmcliへの質問がIssueで来たりしてちょっと困ったが)。
公開してしばらくしてからフォークして使ってくれている人が出てきて、自分はサポートしていなかったnmcliのコマンドに対応しようとしている事に気づいた。それならサポートの幅を広げてみるかと、一度nmcliの搭載しているコマンドをざっと洗い出して、コンパチビリティテーブルを作って対応した。また、このタイミングでPyPIに登録することにした。
コントリビューターがついた
PyPIに登録してから不具合修正や機能追加のPRをもらうようになり、DeepLで翻訳しながらコントリビューターとやり取りするようになった。未対応だったサブコマンドに対しても熱い要望をもらって対応した。
英語そこまで得意な方ではないので翻訳しながらではあったけど、自分のライブラリを好んで使ってくれているメッセージが入ると素直に嬉しかった。
2021年にはバージョンも0.3.1から0.9.0まで上がり、途中文字コード的な問題への対応などもあったけどそれなりに順調に来ている。
今後の課題
もらえるPRはテスト書いてくれていない人もいるので、強制まではするつもりはないけどGithub Actionとかでテスト壊したのが気付けるようにはしようかなーと考えている。
コマンドやサブコマンドのオプションパラメータはサポートしていたりしていなかったりするので、必要出てきたら足していかないとなと思っている。
所感
Webのフロントエンドに興味が全振りしているはずの自分が、初めて人に使ってもらえるところまで行ったのがデバイス用のライブラリか…と思わないこともないけど、微々たるものでも誰かの役に立てているというのが素直に嬉しい。
世界を大きく変えるようなものはできないけど、ちょっとしたお役立ちを目指して今後もコードを書いていきたい。