Nervesチーム がどのように開発を進めているのか、どのように Hex パッケージをリリースしているのかを知るために、リポジトリをざーっと観察してみました。あくまで個人のメモです。Nervesチーム の見解ではありません。
Nervesとは
一言で言うと「Elixir で IoT!?ナウでヤングで cool な Nerves フレームワーク」です。
観察するリポジトリ
Nerves プロジェクトは、各機能に集中して取り組めるよう、複数のリポジトリに分散されて開発されています。Nervesチームは少なくとも50個ほどのリポジトリを管理しています。今回は以下の2つの主要リポジトリに焦点を当てます。
-
nerves-project/nerves
- Nerves プロジェクトへの入り口であり、コアツールとドキュメントを提供
-
nerves-project/nerves_system_br
- Nerves Systems 用の Buildroot ベースのビルド プラットフォーム
コミット履歴
nerves-project/nerves
nerves-project/nerves_system_br
コミットメッセージ
- 特にコミットメッセージをどう書くかについて規約は設けてないようです
- リリース時は一貫して
v<major>.<minor>.<patch> release
という書式のタグに対応するコミットメッセージになっています
バージョン表記
- Nerves プロジェクトにおけるバージョン表記は基本的にセマンティック バージョニングに準拠しているようです
- バッカス・ナウア記法でバージョン番号を示します
0.y.zのような初期の開発フェーズにおけるバージョン
セマンティック バージョニングのFAQに要注目です。世の中にはメジャーリリースされていないパッケージがすくなくありません。
その意味を理解する必要があると思います。
0.y.z
のような初期の開発フェーズにおけるバージョンの取り扱いはどのようにすべきでしょうか?
一番簡単な方法は0.1.0
からで開発版をリリースし、その後のリリースのたびにマイナーバージョンを上げていけばよいでしょう。
1.0.0
のリリースはいつすべきでしょうか?
もし既にプロダクション用途であなたのソフトウェアが利用されているのなら、それは1.0.0
であるべきでしょう。
またもし安定したAPIを持ち、それに依存しているユーザーが複数いるのなら、それは1.0.0
であるべきでしょう。
もし後方互換性について多大な心配をしているのなら、それは1.0.0
であるべきでしょう。
Hexもそれに言及しています。
All Hex packages are required to follow semantic versioning. While your package version is at major version "0", any breaking changes should be indicated by incrementing the minor version. For example,
0.1.0
->0.2.0
.
メジャーリリース前にパッチバージョンを使ってはいけないのです!
この点で Nerves いくつかのパッケージには厳密に言うとセマンティック バージョニングでないものがありますが、プロダクションで使用されているパッケージを徐々にメジャーリリースする方向で進んでいます。メジャーリリース後にも既存のユーザもサポートするために、Nerves 関連のパッケージの依存性には複数のバージョンに対応できるよう以下のようにor
を用いているものがあります。
circuits_i2c ~> 1.0 or ~> 0.3.0
Git タグ
バッカス・ナウア記法でバージョン番号を示し、接頭辞v
をつけたものが、Git タグになります。
Github のリリース
Git タグ に対応する Github リリースと言うものがあります。各バージョンのコードやビルド結果などをそこからダウンロードすることができます。
Hex パッケージの出版
Hex のドキュメントに従って行います。
ドキュメントは ex_doc パッケージを用いて生成できます。
解析ツール
mix format、credo、dialyzer が使用されています。これらがCIで実行されます。
以前は excoveralls も使用されていましたが、執筆時点で OTP 26 でうまくイゴかない問題があり、これを使わない方向で進んでます。
mix env
Hex 関連の操作に関しては開発や本番とは別のdocs
と言う環境(Mix environments)を設けています。
...
preferred_cli_env: %{
credo: :test,
docs: :docs,
"hex.publish": :docs,
"hex.build": :docs
},
...
継続的インテグレーション (CI)
執筆時点では、継続的インテグレーション (CI) には Circle CI が使用されています。
Dependabot で依存関係のアップデート
コミュニティ
ぜひお気軽にお立ち寄りください。