重要なgemのうち、開発が止まってしまったgemがいくつあるか集計してみた

![スクリーンショット 2020-03-23 16.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33011/f91ec4c0-3141-17bf-adda-f87e7c44630a.png)


[core-jsがメンテされていない理由](https://qiita.com/yumetodo/items/eaf3b97aeae3d8c4a07e)を読みました。この記事によると、core-jsというJavaScript界隈の重要な（しかし一般の開発者にはほとんど知られていない）ライブラリのメンテが止まってしまったとのこと。

[JavaScript界隈の特殊な事情](https://yosuke-furukawa.hatenablog.com/entry/2016/03/27/152500)があるにせよ、Rubyにも、開発が止まりそうなgemはたくさんある気がします。そこで、重要なgemのうち、開発が止まりそうなものがいくつあるのかを調べてみました。


## 先に結論

重要なgemのうち、開発が既に止まっているものは0件でした。「利用者数に対して開発者が極端に少ない」という意味で止まる可能性が比較的高いものは minitest gemでした。

補足：minitest gemについては、主なコミッタの人数が少ないだけです。今も活発にコミットされています。今すぐ何かがあるわけではまったくありません。


## やったこと

重要なgemのうち、開発が止まっている、もしくは止まる可能性があるものをリストアップしてみました。

#### 「重要なgem」の定義

本記事では、**Rails gemから依存関係をたどったときに、二次のつながりまでに含まれるgemの最新バージョンから依存されているgem**を「重要なgem」とします。

もっと言うと、**下記のgemから依存されているgem**であれば、それは重要なgemです。

- 一次のつながり
    - sprockets-rails
    - railties
    - activesupport
    - activestorage
    - activerecord
    - activemodel
    - activejob
    - actionview
    - actiontext
    - actionpack
    - actionmailer
    - actionmailbox
    - actioncable
- 二次のつながり
    - websocket-driver
    - mail
    - rails-dom-testing
    - rack-test
    - globalid
    - marcel
    - concurrent-ruby
    - method_source

探索の開始点としてRailsを選んだ理由は、簡易的な集計の結果、もっとも一般に利用されているgemがRailsだったからです。

上記の条件を満たすgemであっても、開発が活発なgemからのスピンオフgemであったり、止まっているというよりは安定しているgemについては除外しています。


#### 集計に使ったデータの出典

当たりを付けるための簡易的な集計には、[Libraries.io Open Data](https://libraries.io/data)を利用しました。このデータの最終更新は2020年1月12日なので、さらに最新データの裏取りとしてGitHubのデータを利用しています。


## 集計結果

#### 最終更新に着目した集計

最終更新が半年以上前のgemのうち、本当に開発が止まりそうなgemは0件でした。

最終更新から時間が経っているgemはいくつかあるものの、いずれも、活発なgemからのスピンオフであったり、ドキュメントの更新くらいしか必要なかったりという状況です。

最終候補に残ったgemは下記の通りです。

```
+------------------+----------------------+------------------------+-------------------------------+----------------------------------+-----------------------------------------------------+
| Project Name     | Dependency Name      | Repository Stars Count | Repository Contributors Count | Repository Last pushed Timestamp | left(b.`Repository URL`, 100)                       |
+------------------+----------------------+------------------------+-------------------------------+----------------------------------+-----------------------------------------------------+
| actioncable      | websocket-driver     | 171                    | 13                            | 2019-09-10 12:55:43 UTC          | https://github.com/faye/websocket-driver-ruby       |
| actionmailbox    | mail                 | 2976                   | 184                           | 2018-10-13 20:15:01 UTC          | https://github.com/mikel/mail                       |
| actionmailer     | mail                 | 2976                   | 184                           | 2018-10-13 20:15:01 UTC          | https://github.com/mikel/mail                       |
| actionmailer     | rails-dom-testing    | 75                     | 15                            | 2018-07-04 12:29:01 UTC          | https://github.com/rails/rails-dom-testing          |
| actionpack       | rack-test            | 770                    | 57                            | 2018-07-22 10:43:43 UTC          | https://github.com/rack-test/rack-test              |
| actionpack       | rails-dom-testing    | 75                     | 15                            | 2018-07-04 12:29:01 UTC          | https://github.com/rails/rails-dom-testing          |
| actionview       | rails-dom-testing    | 75                     | 15                            | 2018-07-04 12:29:01 UTC          | https://github.com/rails/rails-dom-testing          |
| activejob        | globalid             | 650                    | 43                            | 2019-01-11 13:58:34 UTC          | https://github.com/rails/globalid                   |
| activestorage    | marcel               | 56                     | 6                             | 2018-09-15 03:06:56 UTC          | https://github.com/basecamp/marcel                  |
| activesupport    | concurrent-ruby      | 4493                   | 103                           | 2019-03-11 09:52:28 UTC          | https://github.com/ruby-concurrency/concurrent-ruby |
| concurrent-ruby  | ref                  | 60                     | 6                             | 2017-11-18 10:41:28 UTC          | https://github.com/ruby-concurrency/ref             |
| mail             | mini_mime            | 38                     | 12                            | 2019-07-08 09:42:28 UTC          | https://github.com/discourse/mini_mime              |
| marcel           | mimemagic            | 176                    | 16                            | 2018-12-20 08:49:51 UTC          | https://github.com/minad/mimemagic                  |
| railties         | rake                 | 1627                   | 164                           | 2019-09-09 07:15:18 UTC          | https://github.com/ruby/rake                        |
| railties         | method_source        | 244                    | 16                            | 2019-02-05 15:25:47 UTC          | https://github.com/banister/method_source           |
| websocket-driver | websocket-extensions | 10                     | 4                             | 2017-11-11 01:27:15 UTC          | https://github.com/faye/websocket-extensions-ruby   |
+------------------+----------------------+------------------------+-------------------------------+----------------------------------+-----------------------------------------------------+
```

#### 開発者数に着目した集計

開発者数が一桁のgemのうち、本当に開発が止まりそうなgemは0件でした。

こちらも基本的には0件です。minitestのみ、開発者が2人しかいなくてピンチに見えますが、GitHubのリポジトリを見る限りプルリクを自分で書き直してコミットしているだけのようです。プルリク作成者まで含めた貢献者は数多くいます。

ただ一方で、この2人のうち主なコミッターは実質1人のようなので、この人物に何かあると、minitestの開発は止まってしまうかもしれません。（何もないことを祈ります）

最終候補に残ったgemは下記の通りです。


```
+------------------+----------------------+------------------------+-------------------------------+----------------------------------+---------------------------------------------------+
| Project Name     | Dependency Name      | Repository Stars Count | Repository Contributors Count | Repository Last pushed Timestamp | left(b.`Repository URL`, 100)                     |
+------------------+----------------------+------------------------+-------------------------------+----------------------------------+---------------------------------------------------+
| actionview       | erubi                | 238                    | 9                             | 2019-09-25 16:09:05 UTC          | https://github.com/jeremyevans/erubi              |
| activestorage    | marcel               | 56                     | 6                             | 2018-09-15 03:06:56 UTC          | https://github.com/basecamp/marcel                |
| activesupport    | minitest             | 2703                   | 2                             | 2020-01-12 00:16:05 UTC          | https://github.com/seattlerb/minitest             |
| concurrent-ruby  | ref                  | 60                     | 6                             | 2017-11-18 10:41:28 UTC          | https://github.com/ruby-concurrency/ref           |
| websocket-driver | websocket-extensions | 10                     | 4                             | 2017-11-11 01:27:15 UTC          | https://github.com/faye/websocket-extensions-ruby |
+------------------+----------------------+------------------------+-------------------------------+----------------------------------+---------------------------------------------------+
```

## 結論

重要なgemのうち、既に開発が止まったものは0件、開発が止まりそうなgemはminitest gemという結果でした。



補足：minitest gemについては、主なコミッタの人数が少ないだけです。今も活発にコミットされています。今すぐ何かがあるわけではまったくありません。

## 感想

Railsから二次のつながりまでに含まれるgemが思ったよりもだいぶ少なかったのが印象的でした。過去のバージョンからの変遷を見る限り、Railsを始めとしたたくさんのgemは、開発が進むにつれ出来るだけ依存関係を減らしていこうと努力しているようです。ライブラリとしては非常に健全な姿勢であり、今後もこの傾向が続くと良いなと思います。