【Arduino】自作ライブラリを公式ライブラリマネージャへ登録するまで

既存のライブラリに不満を覚えたり、そもそもライブラリ自体が無かったときなど、ライブラリを作成する機会が増えました。
しかし、自作したはいいものの、複数の環境で開発する場合など都度ソースコードを手動インポートするのは中々面倒です。
そこで、思い切ってArduino公式のライブラリマネージャへ自作ライブラリの登録を申請してみました。


# 公式ライブラリマネージャ
![arduino_lib_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253070/b5f832c3-8265-44b8-ff8a-75603124caa3.png)
ツールバーの `ツール > ライブラリを管理` で出てくるコレです。

Arduinoを扱ったことがある人なら一度は開いたことがあると思います。

ライブラリマネージャに表示されるライブラリは、Arduino公式が管理しているリストを基としています。
ライブラリマネージャは開く度にインターネット上から最新のリストを取得し、バージョン確認などを行っています。

そして、作成したライブラリは、Arduino公式へ登録申請することで、審査の後にそのリストへ登録してくれます。


# 流れ
今回、私は "Base64" を扱うライブラリを作成しました。

既存のライブラリでは、入力データが文字列`char*`に限定されており、バイナリ`uint8_t*`を扱えなかったためです。
なので、入力データを`uint8_t*`として文字列の場合はキャストしてね、というバイナリベースのBase64ライブラリを作成しました。

自作したライブラリを題材として、ざっくりとした流れを説明します。


## ライブラリのリポジトリを作る
- [dojyorin/arduino_base64 - GitHub](https://github.com/dojyorin/arduino_base64)

GitHubでライブラリのリポジトリを作成します。
特に複雑なことはしませんが、大多数の目に触れることを想定すると、開発用ブランチ (`dev`など) を最初から作っておき、そちらで作業したほうが良いでしょう。

これは個人的な意見ですが、ライセンス情報`LICENSE`は何かしら入れておいたほうが良いと思います。
まぁ私自身それほどライセンス警察ではないので、リポジトリを作成する際は、いつも1番ゆるいMITライセンスを入れてます。

他人様の転載可能なライセンス付きのソースコードを参考にした場合は、ライセンス情報を集約した`LICENSES.md`などを作って明記してあげると良いでしょう。

```md:LICENSES.md
# SourceName1
MIT License

Copyright (c) 2020 ...

# SourceName2
MIT License

Copyright (c) 2020 ...
```


## ライブラリを書く
リポジトリを作成したら、ローカルへクローンし、コードを書いていきます。

最低限必要なファイル構成は以下の通りです。

- `/example/(SketchName)/(SketchName).ino`
- `/src/(LibraryName).cpp`
- `/src/(LibraryName).h`
- `/README.md`
- `/library.properties`

サンプルスケッチは`example`ディレクトリに最低1個、ソースコードは`src`ディレクトリにC/C++とヘッダが最低1個ずつ必要になります。
`README.md`には、ライブラリ概要とサンプルコード抜粋とAPIを書いてあげると親切です。

そして`library.properties`が、Arduino公式のライブラリリストへ登録される内容となります。
基本的には、以下の内容が網羅されていれば問題ありません。

```ini:library.properties
name=Base64_Codec ---> ライブラリ名。リスト内で一意になるのが望ましい(重複チェックされるのかは不明)
version=1.0.3 ---> ライブラリマネージャはここの記述を基にバージョン管理をしている
author=dojyorin ---> 作成者名
maintainer=https://github.com/dojyorin ---> 作成者へのコンタクト手段(GitHub,E-Mail等)
sentence=Base64 Codec ---> よく分からん。ライブラリ名と同じにしとけば問題ない
paragraph=Binary based simple Base64 Codec. ---> ライブラリの説明文
category=Other ---> ライブラリのカテゴリ。既定のカテゴリ一覧から選択する
url=https://github.com/dojyorin/arduino_base64.git ---> リポジトリのURL
architectures=* ---> ライブラリがMCUに依存している場合はそのMCU名を記載 (samd,avr等)
depends= ---> オプション。このライブラリが他ライブラリへ依存している場合、そのライブラリ名を記述
```

## リリースを作成する
開発ブランチでソースコードを書き、動作テストも無事に終了したら、リモートへプッシュしmasterブランチへマージします。

その後、タグを発行します。
タグ名はバージョン番号 (`library.properties`の`version`) に合わせておくと良いでしょう。

そしてGitHubのReleaseページで、発行したタグを基にリリースを作成します。
リリース名は`v(TagName)`のように、タグ名(バージョン番号)に合わせておくと分かりやすいです。

これで、ライブラリマネージャへ登録する準備は整いました。


## Extra: GitHub Actionsなどでデプロイを自動化する
今回は手動でタグを発行したりリリースを作成したりしましたが、ライブラリの規模が大きくなったり、テストに手間が掛かるようになった場合は、GitHub ActionsなどのCI/CD機能を使用してその辺の作業を自動化することも出来ます。

しばらくは手動運用していくつもりですが、もし時間が空いたら自動化にもチャレンジしてみたいと思います。


## Arduino公式に登録申請する
- [arduino/Arduino - GitHub](https://github.com/arduino/Arduino)

申請方法は簡単で、Arduino公式GitHubのIssuesで、ライブラリを登録してほしい旨を新規Issuesとして投稿するだけです。
早ければ数日後には、申請が受理されてIssuseはクローズ、無事にリストへ登録されます。

Issuesへ投稿する際のテンプレートは特に規定されていませんが、大体皆さん以下のように書かれています。

- タイトル: `[Library Manager] Please add (LibraryName)`
- 本文: `(リポジトリのURLを記載する)`

私も、見よう見まねで申請しました。

![arduino_lib_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253070/dded5f05-6c32-7670-0fb5-98028b2a5354.png)

## 登録完了!!
申請が無事に受理された暁には、ライブラリマネージャの検索でヒットするようになります。

![arduino_lib_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253070/8931d23f-1f03-fc92-b63d-3b84a8de36aa.png)


# 振り返って
初めての登録だったので、無事に受理されてとても嬉しいです!!
最初は、とても敷居が高そうに感じていましたが、一度やってしまえば意外と簡単なことが分かりました。

ただ、こうして大勢の目に触れることを考えると、今までは個人利用の範囲内で適当に書いていたのが通用しなくなったり、動作検証をしっかり行わなければならないなど、課題も増えました。

しかし、それを上回る収穫があったので、今回の登録申請はとても為になりました。