【Rust】crates.io被依存数ランキング


[crates.io](https://crates.io/)はRustのライブラリ（クレート）管理の中心であり、`cargo`コマンドによる依存クレートのダウンロードも特に指定がない限りはこのサイトの登録をもとに行われる。このサイトは`GitHub`のアカウントがあれば誰でも新しいクレートを登録できるため、登録されているクレートはほぼ標準に近いものから個人の実験的なものまで様々なレベルのものが混在している。

機能が安定したクレートを探す際は[カテゴリー](https://crates.io/categories)や[キーワード](https://crates.io/keywords)で絞り込んでダウンロード数が多いものから選択すれば基本的に問題ないが、今回は別の指標として被依存数（他のクレートからの依存の数）を集計してみた。

# 集計内容

以下の3項目を集計する。

- **直接被依存数**：そのクレートに`[dependencies]`で直接依存するクレートの数
- **完全被依存数**：そのクレートに`[dependencies]`で直接または間接的に依存するクレートの数
- **開発被依存数**：そのクレートに`[build-dependencies]`または`[dev-dependencies]`で直接依存するクレートの数

直接被依存数の上位は、機能の粒度などが汎用的で扱いやすいクレートが多くなると予想される。

完全被依存数の上位は、低レベルの機能を提供するクレートが多くなると予想される。また、間接的な依存を含めるため

```
AがBに依存する
↓
{Aに依存するクレート} ⊂ {Bに依存するクレート}
↓
Aの完全被依存数 ＜ Bの完全被依存数
```

となり、必然的に上位は他のクレートへの依存が少ないものが多くなる。

開発被依存数の上位は、テストコードで使用されるクレートなどが多くなると予想される。

## 注意事項

依存指定の中には特定の条件下でのみ必要な`optional`な依存も存在するが、今回は通常の依存と区別せずに集計した。

また、依存対象のバージョン（の上限）が指定される場合があるが、今回の集計ではそれらを無視し、すべて最新バージョンに依存するものとしている。これは以下のような間接的な依存を扱う際に問題となる。

- AはB（1.0.0）に依存する
- B（1.0.0）はCに依存しない
- B（2.0.0）（最新バージョン）はCに依存する

この場合は「AはCに依存しない」とするのが正しいが、今回の集計では

- AはB（最新バージョン）に依存する
- B（最新バージョン）はCに依存する

とみなし、「AはCに依存する」ものとしてカウントする。この辺をまじめに考えると話がややこしくなるので、誤差として許容願いたい。

# 集計方法

## データ取得

`crates.io`のデータを取得する方法は、同サイト内の[Accessing the Crates.io Data](https://crates.io/data-access)で紹介されている。今回の集計では2番目の[static.crates.io/db-dump.tar.gz](https://static.crates.io/db-dump.tar.gz)を使用した。このファイルは`crates.io`内部のデータベースを出力したCSVで構成され、24時間ごとに更新されている。データの内容は[crates.ioのソースコード](https://github.com/rust-lang/crates.io)を見て確認する必要があるが、ある程度はCSVの項目名からも推測できる。

## データ処理

集計は下記のPythonスクリプトで行った。コマンドライン引数に上記のデータファイルを渡すと、実行したディレクトリにクレートごとの各集計値をもつCSVファイルを出力する。筆者はPython 3.8.3（Linux）で実行したが、多少古いバージョンでも動くと思う。

```
$ python3.8 count_deps.py db-dump.tar.gz 
```

```python
# count_deps.py
import csv
import datetime
import re
import sys
import tarfile

def main():
    # relax csv field size limit (default value makes failure)
    csv.field_size_limit(sys.maxsize)

    if len(sys.argv) < 2:
        print("no arguments", file=sys.stderr)
        sys.exit(1)
    file_path = sys.argv[1]

    print("extracting tar ...")
    with tarfile.open(file_path, "r:*") as tar:
        for member in tar.getmembers():
            name = member.name.rstrip('/')
            if '/' not in name:
                date_label = name[:10]
            elif name.endswith("/data/crates.csv"):
                crates_csv = member
            elif name.endswith("/data/categories.csv"):
                categories_csv = member
            elif name.endswith("/data/crates_categories.csv"):
                crates_categories_csv = member
            elif name.endswith("/data/versions.csv"):
                versions_csv = member
            elif name.endswith("/data/dependencies.csv"):
                dependencies_csv = member

        print("loading crates ...")
        crates = collect_crates(tar.extractfile(crates_csv))
        print("loading categories ...")
        categories = collect_categories(tar.extractfile(categories_csv))
        bind_categories(crates, categories,
                        tar.extractfile(crates_categories_csv))
        print("loading versions ...")
        bind_latest_version(crates, tar.extractfile(versions_csv))
        verid_to_crate = {}
        for crate in crates.values():
            verid_to_crate[crate.version.id] = crate
        print("loading dependencies ...")
        bind_users(crates, verid_to_crate,
                   tar.extractfile(dependencies_csv))

    print("resolving indirect dependencies ...")
    progress_tab = [(len(crates) * n // 10 - 1, n * 10) for n in range(1, 11)]
    for n, crate in enumerate(crates.values()):
        all_users = crate.all_users
        rest = list(crate.dir_users)
        while rest:
            dir_user = rest.pop(0)
            all_users.add(dir_user)
            rest.extend(
                x for x in dir_user.dir_users if x not in all_users and x != crate)

        if n == progress_tab[0][0]:
            _, percent = progress_tab.pop(0)
            print("  {}%".format(percent))

    output_csv = "crates_" + date_label + ".csv"
    print("writing {} ...".format(output_csv))
    write_crates_csv(crates, output_csv)

def as_bool(s):
    return {'t': True, 'f': False}[s]

def as_datetime(s):
    return datetime.datetime.strptime(s[:19], "%Y-%m-%d %H:%M:%S")

# re_semver ignores build metadata
re_semver = re.compile(r"(\d+\.\d+\.\d+)(\-([0-9A-Za-z\.\-]+))?")

def as_semver(s):
    m = re_semver.match(s)
    triple, pre = m.group(1, 3)
    # (major, minor, patch)
    triple = tuple(map(int, triple.split('.')))
    if pre:
        # map numeric to (0, int) and nonnumeric to (1, str) for rules:
        # - numeric < non-numeric
        # - numeric is compared as number
        # - non-numeric is compared alphabetically
        # e.g. alpha.2.11 -> ((1, 'alpha'), (0, 2), (0, 11))
        def pre_part_to_pair(part):
            return (0, int(part)) if part.isdigit() else (1, part)
        pre = tuple(map(pre_part_to_pair, pre.split('.')))

    return triple, pre

class Crate:
    __slots__ = [
        'id', 'name', 'categories', 'desc', 'created_at', 'updated_at',
        'version', 'dir_users', 'dev_users', 'all_users',
    ]

class Version:
    __slots__ = [
        'id', 'num', 'triple', 'pre', 'yanked',
    ]

    def preferred_to(self, other):
        if self.yanked != other.yanked:
            return not self.yanked
        elif bool(self.pre) != bool(other.pre):
            return not self.pre
        elif self.triple != other.triple:
            return self.triple > other.triple
        else:
            return self.pre and other.pre and self.pre > other.pre

def collect_crates(csv_file):
    crates = {}
    reader = csv.DictReader(map(lambda b: b.decode('utf-8'), csv_file))

    for row in reader:
        crate = Crate()
        crate.id = int(row['id'])
        crate.name = row['name']
        crate.categories = []
        crate.desc = row['description']
        crate.created_at = as_datetime(row['created_at'])
        crate.updated_at = as_datetime(row['updated_at'])
        crate.version = None
        crate.dir_users = set()
        crate.dev_users = set()
        crate.all_users = set()

        crates[crate.id] = crate

    return crates

def collect_categories(csv_file):
    categories = {}
    reader = csv.DictReader(map(lambda b: b.decode('utf-8'), csv_file))

    for row in reader:
        id_ = int(row['id'])
        category = row['category']
        categories[id_] = category

    return categories

def bind_categories(crates, categories, csv_file):
    reader = csv.DictReader(map(lambda b: b.decode('utf-8'), csv_file))

    for row in reader:
        crate = crates[int(row['crate_id'])]
        category = categories[int(row['category_id'])]
        crate.categories.append(category)

def bind_latest_version(crates, csv_file):
    reader = csv.DictReader(map(lambda b: b.decode('utf-8'), csv_file))

    for row in reader:
        version = Version()
        version.id = int(row['id'])
        version.num = row['num']
        version.triple, version.pre = as_semver(version.num)
        version.yanked = as_bool(row['yanked'])

        crate_id = int(row['crate_id'])
        crate = crates[crate_id]
        if crate.version is None or version.preferred_to(crate.version):
            crate.version = version

def bind_users(crates, verid_to_crate, csv_file):
    reader = csv.DictReader(map(lambda b: b.decode('utf-8'), csv_file))
    for row in reader:
        verid = int(row['version_id'])
        source_crate = verid_to_crate.get(verid, None)
        if not source_crate:
            continue
        target_crate = crates[int(row['crate_id'])]
        kind = row['kind']
        # 0: dependencies
        # 1: build_dependencies
        # 2: dev_dependencies
        if kind == '0':
            target_crate.dir_users.add(source_crate)
        elif kind in ('1', '2'):
            target_crate.dev_users.add(source_crate)

def write_crates_csv(crates, csv_path):
    fieldnames = [
        "name", "version", "created_at", "updated_at", "categories", "description",
        "dir_users_count", "all_users_count", "dev_users_count",
    ]
    with open(csv_path, 'w', encoding='utf-8') as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames)
        writer.writeheader()

        for crate in crates.values():
            row = {
                'name': crate.name,
                'version': crate.version.num,
                'created_at': crate.created_at,
                'updated_at': crate.updated_at,
                'categories': " | ".join(sorted(crate.categories)),
                'description': crate.desc,
                'dir_users_count': len(crate.dir_users),
                'all_users_count': len(crate.all_users),
                'dev_users_count': len(crate.dev_users),
            }
            writer.writerow(row)

if __name__ == '__main__':
    main()
```

本当はRustで実装したかったが、`tar.gz`を直接読めるクレートが見当たらなかった（`flate2`+`tar`で試したが遅すぎて断念）。

# 集計結果

以下は2020-10-08時点のデータを集計した各被依存数の50位までの一覧である。名前の部分は`crates.io`のリンクになっている。

## 直接被依存数

|順位|名前<br>バージョン|作成日<br>更新日|カテゴリー|被依存数|
|--:|:--|:-:|:--|--:|
|1|[`serde`](https://crates.io/crates/serde)<br>`1.0.116`|2014-12-05<br>2020-09-11|Encoding|9190|
|2|[`serde_json`](https://crates.io/crates/serde_json)<br>`1.0.58`|2015-08-07<br>2020-09-30|Encoding|5656|
|3|[`log`](https://crates.io/crates/log)<br>`0.4.11`|2014-12-13<br>2020-07-16|Development tools::Debugging|5518|
|4|[`serde_derive`](https://crates.io/crates/serde_derive)<br>`1.0.116`|2016-08-29<br>2020-09-11|-|3785|
|5|[`clap`](https://crates.io/crates/clap)<br>`2.33.3`|2015-03-01<br>2020-09-19|Command-line interface|3607|
|6|[`libc`](https://crates.io/crates/libc)<br>`0.2.79`|2015-01-15<br>2020-10-05|External FFI bindings<br>No standard library<br>Operating systems|3399|
|7|[`lazy_static`](https://crates.io/crates/lazy_static)<br>`1.4.0`|2014-11-23<br>2020-01-13|Memory management<br>No standard library<br>Rust patterns|3315|
|8|[`rand`](https://crates.io/crates/rand)<br>`0.7.3`|2015-02-03<br>2020-01-10|Algorithms<br>No standard library|3130|
|9|[`futures`](https://crates.io/crates/futures)<br>`0.3.6`|2016-07-31<br>2020-10-05|Asynchronous|2933|
|10|[`chrono`](https://crates.io/crates/chrono)<br>`0.4.19`|2014-11-20<br>2020-09-30|Date and time|2641|
|11|[`regex`](https://crates.io/crates/regex)<br>`1.3.9`|2014-12-13<br>2020-05-29|Text processing|2540|
|12|[`syn`](https://crates.io/crates/syn)<br>`1.0.42`|2016-09-07<br>2020-09-26|Development tools::Procedural macro helpers|2059|
|13|[`quote`](https://crates.io/crates/quote)<br>`1.0.7`|2016-09-03<br>2020-06-07|Development tools::Procedural macro helpers|2048|
|14|[`failure`](https://crates.io/crates/failure)<br>`0.1.8`|2017-10-08<br>2020-05-02|-|2021|
|15|[`byteorder`](https://crates.io/crates/byteorder)<br>`1.3.4`|2015-02-03<br>2020-02-07|Encoding<br>Parsing tools|1807|
|16|[`tokio`](https://crates.io/crates/tokio)<br>`0.2.22`|2016-07-01<br>2020-07-22|Asynchronous<br>Network programming|1805|
|17|[`reqwest`](https://crates.io/crates/reqwest)<br>`0.10.8`|2016-10-16<br>2020-08-25|Web programming::HTTP client<br>WebAssembly|1670|
|18|[`url`](https://crates.io/crates/url)<br>`2.1.1`|2014-11-14<br>2020-01-09|Encoding<br>Parser implementations<br>Web programming|1624|
|19|[`hyper`](https://crates.io/crates/hyper)<br>`0.13.8`|2014-11-22<br>2020-09-18|Network programming<br>Web programming::HTTP client<br>Web programming::HTTP server|1613|
|20|[`proc-macro2`](https://crates.io/crates/proc-macro2)<br>`1.0.24`|2017-07-06<br>2020-10-01|Development tools::Procedural macro helpers|1597|
|21|[`structopt`](https://crates.io/crates/structopt)<br>`0.3.19`|2017-02-03<br>2020-10-08|Command-line interface|1589|
|22|[`bytes`](https://crates.io/crates/bytes)<br>`0.5.6`|2015-01-30<br>2020-07-14|Data structures<br>Network programming|1388|
|23|[`thiserror`](https://crates.io/crates/thiserror)<br>`1.0.21`|2019-10-09<br>2020-10-06|Rust patterns|1342|
|24|[`env_logger`](https://crates.io/crates/env_logger)<br>`0.7.1`|2015-01-27<br>2019-10-17|Development tools::Debugging|1244|
|25|[`toml`](https://crates.io/crates/toml)<br>`0.5.6`|2014-11-11<br>2020-01-16|Configuration<br>Encoding<br>Parser implementations|1213|
|26|[`winapi`](https://crates.io/crates/winapi)<br>`0.3.9`|2014-11-29<br>2020-06-26|External FFI bindings<br>No standard library<br>Operating systems::Windows APIs|1160|
|27|[`anyhow`](https://crates.io/crates/anyhow)<br>`1.0.33`|2019-10-05<br>2020-10-06|Rust patterns|1146|
|28|[`num-traits`](https://crates.io/crates/num-traits)<br>`0.2.12`|2016-04-14<br>2020-06-11|Algorithms<br>No standard library<br>Science|1088|
|29|[`base64`](https://crates.io/crates/base64)<br>`0.13.0`|2015-12-04<br>2020-09-30|Encoding|1068|
|30|[`bitflags`](https://crates.io/crates/bitflags)<br>`1.2.1`|2015-01-15<br>2019-10-13|No standard library|1042|
|31|[`itertools`](https://crates.io/crates/itertools)<br>`0.9.0`|2014-11-21<br>2020-03-07|Algorithms<br>Rust patterns|986|
|32|[`uuid`](https://crates.io/crates/uuid)<br>`0.8.1`|2014-11-11<br>2019-10-18|Data structures<br>No standard library<br>Parser implementations<br>WebAssembly|864|
|33|[`time`](https://crates.io/crates/time)<br>`0.2.22`|2014-11-13<br>2020-09-26|Date and time|847|
|34|[`mime`](https://crates.io/crates/mime)<br>`0.3.16`|2014-11-20<br>2020-01-07|-|775|
|35|[`async-trait`](https://crates.io/crates/async-trait)<br>`0.1.41`|2019-07-23<br>2020-10-01|-|739|
|36|[`rayon`](https://crates.io/crates/rayon)<br>`1.4.1`|2015-12-10<br>2020-09-29|Concurrency|716|
|37|[`nom`](https://crates.io/crates/nom)<br>`5.1.2`|2015-01-17<br>2020-10-04|Parsing tools|709|
|38|[`dirs`](https://crates.io/crates/dirs)<br>`3.0.1`|2015-11-24<br>2020-07-04|-|683|
|39|[`error-chain`](https://crates.io/crates/error-chain)<br>`0.12.4`|2016-04-29<br>2020-08-02|Rust patterns|671|
|40|[`num`](https://crates.io/crates/num)<br>`0.3.0`|2014-11-11<br>2020-06-13|Algorithms<br>Data structures<br>No standard library<br>Science|633|
|40|[`hex`](https://crates.io/crates/hex)<br>`0.4.2`|2015-10-23<br>2020-02-18|Encoding<br>No standard library|633|
|42|[`rustc-serialize`](https://crates.io/crates/rustc-serialize)<br>`0.3.24`|2014-12-11<br>2017-04-21|-|579|
|43|[`bincode`](https://crates.io/crates/bincode)<br>`1.3.1`|2014-11-20<br>2020-06-24|Encoding<br>Network programming|567|
|44|[`sha2`](https://crates.io/crates/sha2)<br>`0.9.1`|2016-05-06<br>2020-06-24|Cryptography<br>No standard library|550|
|45|[`http`](https://crates.io/crates/http)<br>`0.2.1`|2014-11-20<br>2020-03-25|Web programming|545|
|46|[`colored`](https://crates.io/crates/colored)<br>`2.0.0`|2016-03-13<br>2020-07-14|-|538|
|47|[`image`](https://crates.io/crates/image)<br>`0.23.10`|2014-11-20<br>2020-09-26|Multimedia::Encoding<br>Multimedia::Images|537|
|48|[`yup-oauth2`](https://crates.io/crates/yup-oauth2)<br>`4.1.2`|2015-02-27<br>2020-05-01|-|535|
|49|[`parking_lot`](https://crates.io/crates/parking_lot)<br>`0.11.0`|2016-05-13<br>2020-06-23|Concurrency|532|
|50|[`serde_yaml`](https://crates.io/crates/serde_yaml)<br>`0.8.13`|2016-02-27<br>2020-06-10|-|513|

## 完全被依存数

|順位|名前<br>バージョン|作成日<br>更新日|カテゴリー|被依存数|
|--:|:--|:-:|:--|--:|
|1|[`unicode-xid`](https://crates.io/crates/unicode-xid)<br>`0.2.1`|2015-04-27<br>2020-06-24|-|29444|
|2|[`proc-macro2`](https://crates.io/crates/proc-macro2)<br>`1.0.24`|2017-07-06<br>2020-10-01|Development tools::Procedural macro helpers|29423|
|3|[`quote`](https://crates.io/crates/quote)<br>`1.0.7`|2016-09-03<br>2020-06-07|Development tools::Procedural macro helpers|29397|
|4|[`syn`](https://crates.io/crates/syn)<br>`1.0.42`|2016-09-07<br>2020-09-26|Development tools::Procedural macro helpers|29336|
|5|[`rustc-std-workspace-core`](https://crates.io/crates/rustc-std-workspace-core)<br>`1.0.0`|2018-11-21<br>2018-11-21|-|28214|
|6|[`libc`](https://crates.io/crates/libc)<br>`0.2.79`|2015-01-15<br>2020-10-05|External FFI bindings<br>No standard library<br>Operating systems|27513|
|7|[`serde_derive`](https://crates.io/crates/serde_derive)<br>`1.0.116`|2016-08-29<br>2020-09-11|-|27112|
|8|[`serde`](https://crates.io/crates/serde)<br>`1.0.116`|2014-12-05<br>2020-09-11|Encoding|27110|
|9|[`compiler_builtins`](https://crates.io/crates/compiler_builtins)<br>`0.1.36`|2018-11-21<br>2020-09-13|-|25464|
|10|[`spin`](https://crates.io/crates/spin)<br>`0.5.2`|2015-01-27<br>2019-08-27|-|24971|
|11|[`lazy_static`](https://crates.io/crates/lazy_static)<br>`1.4.0`|2014-11-23<br>2020-01-13|Memory management<br>No standard library<br>Rust patterns|24929|
|12|[`cfg-if`](https://crates.io/crates/cfg-if)<br>`1.0.0`|2015-07-08<br>2020-10-06|-|24609|
|13|[`hermit-abi`](https://crates.io/crates/hermit-abi)<br>`0.1.17`|2019-10-20<br>2020-10-06|Operating systems|23533|
|14|[`smallvec`](https://crates.io/crates/smallvec)<br>`1.4.2`|2015-04-06<br>2020-08-11|Data structures|23466|
|15|[`sval_derive`](https://crates.io/crates/sval_derive)<br>`0.5.2`|2018-12-03<br>2020-08-20|-|23345|
|16|[`sval`](https://crates.io/crates/sval)<br>`0.5.2`|2018-12-03<br>2020-08-20|Encoding<br>No standard library|23344|
|17|[`log`](https://crates.io/crates/log)<br>`0.4.11`|2014-12-13<br>2020-07-16|Development tools::Debugging|23341|
|18|[`either`](https://crates.io/crates/either)<br>`1.6.1`|2015-09-14<br>2020-09-16|Data structures<br>No standard library|22867|
|19|[`no-panic`](https://crates.io/crates/no-panic)<br>`0.1.14`|2018-08-03<br>2020-06-16|-|22794|
|20|[`ryu`](https://crates.io/crates/ryu)<br>`1.0.5`|2018-07-28<br>2020-05-31|-|22784|
|21|[`crossbeam-utils`](https://crates.io/crates/crossbeam-utils)<br>`0.7.2`|2017-08-28<br>2020-02-22|Algorithms<br>Concurrency<br>Data structures<br>No standard library|22710|
|22|[`maybe-uninit`](https://crates.io/crates/maybe-uninit)<br>`2.0.0`|2019-07-09<br>2019-07-10|-|22694|
|23|[`num_cpus`](https://crates.io/crates/num_cpus)<br>`1.13.0`|2015-03-16<br>2020-04-15|Hardware support|22675|
|24|[`scopeguard`](https://crates.io/crates/scopeguard)<br>`1.1.0`|2015-04-30<br>2020-02-16|No standard library<br>Rust patterns|22665|
|25|[`crossbeam-channel`](https://crates.io/crates/crossbeam-channel)<br>`0.4.4`|2017-11-26<br>2020-09-06|Algorithms<br>Concurrency<br>Data structures|22645|
|26|[`memoffset`](https://crates.io/crates/memoffset)<br>`0.5.6`|2017-10-17<br>2020-09-20|No standard library|22636|
|27|[`crossbeam-epoch`](https://crates.io/crates/crossbeam-epoch)<br>`0.8.2`|2017-11-26<br>2020-02-22|Concurrency<br>Memory management<br>No standard library|22621|
|28|[`crossbeam-deque`](https://crates.io/crates/crossbeam-deque)<br>`0.7.3`|2017-11-26<br>2020-02-22|Algorithms<br>Concurrency<br>Data structures|22610|
|29|[`proc-macro-hack`](https://crates.io/crates/proc-macro-hack)<br>`0.5.18`|2016-12-30<br>2020-07-26|Development tools::Procedural macro helpers|22601|
|30|[`rayon-core`](https://crates.io/crates/rayon-core)<br>`1.8.1`|2017-03-11<br>2020-09-17|Concurrency|22549|
|31|[`rayon`](https://crates.io/crates/rayon)<br>`1.4.1`|2015-12-10<br>2020-09-29|Concurrency|22548|
|32|[`itoa`](https://crates.io/crates/itoa)<br>`0.4.6`|2016-06-25<br>2020-06-16|Value formatting|22462|
|33|[`iovec`](https://crates.io/crates/iovec)<br>`0.1.4`|2017-03-15<br>2019-10-09|API bindings<br>Network programming|22384|
|34|[`futures-core-preview`](https://crates.io/crates/futures-core-preview)<br>`0.2.3`|2018-06-26<br>2019-09-26|-|22382|
|35|[`rustc-std-workspace-alloc`](https://crates.io/crates/rustc-std-workspace-alloc)<br>`1.0.0`|2019-02-06<br>2019-02-06|-|22377|
|35|[`futures-channel-preview`](https://crates.io/crates/futures-channel-preview)<br>`0.2.2`|2018-06-26<br>2019-09-26|-|22377|
|37|[`futures-sink-preview`](https://crates.io/crates/futures-sink-preview)<br>`0.2.2`|2018-06-26<br>2019-09-26|-|22376|
|37|[`futures-io-preview`](https://crates.io/crates/futures-io-preview)<br>`0.2.2`|2018-06-26<br>2019-09-26|-|22376|
|39|[`futures-util-preview`](https://crates.io/crates/futures-util-preview)<br>`0.2.2`|2018-06-26<br>2019-09-26|-|22375|
|40|[`futures-executor-preview`](https://crates.io/crates/futures-executor-preview)<br>`0.2.2`|2018-06-26<br>2019-09-26|-|22373|
|41|[`bumpalo`](https://crates.io/crates/bumpalo)<br>`3.4.0`|2018-11-24<br>2020-06-01|Memory management<br>No standard library<br>Rust patterns|22360|
|42|[`sha1`](https://crates.io/crates/sha1)<br>`0.6.0`|2014-11-21<br>2018-02-11|-|22359|
|43|[`wasm-bindgen-shared`](https://crates.io/crates/wasm-bindgen-shared)<br>`0.2.68`|2018-03-06<br>2020-09-09|-|22353|
|44|[`wasm-bindgen-backend`](https://crates.io/crates/wasm-bindgen-backend)<br>`0.2.68`|2018-04-03<br>2020-09-09|-|22352|
|44|[`wasi`](https://crates.io/crates/wasi)<br>`0.10.0+wasi-snapshot-preview1`|2019-03-27<br>2020-06-03|No standard library<br>WebAssembly|22352|
|46|[`base-x`](https://crates.io/crates/base-x)<br>`0.2.6`|2016-03-30<br>2019-10-14|Value formatting|22351|
|47|[`wasm-bindgen-macro-support`](https://crates.io/crates/wasm-bindgen-macro-support)<br>`0.2.68`|2018-08-13<br>2020-09-09|-|22350|
|48|[`wasm-bindgen-macro`](https://crates.io/crates/wasm-bindgen-macro)<br>`0.2.68`|2018-03-06<br>2020-09-09|-|22349|
|48|[`stdweb-internal-runtime`](https://crates.io/crates/stdweb-internal-runtime)<br>`0.1.5`|2018-08-27<br>2019-09-29|API bindings<br>GUI<br>Web programming|22349|
|48|[`stdweb-derive`](https://crates.io/crates/stdweb-derive)<br>`0.5.3`|2018-02-21<br>2019-10-10|API bindings<br>GUI<br>Web programming|22349|
|48|[`discard`](https://crates.io/crates/discard)<br>`1.0.4`|2018-02-25<br>2018-09-17|Memory management|22349|

## 開発被依存数

|順位|名前<br>バージョン|作成日<br>更新日|カテゴリー|被依存数|
|--:|:--|:-:|:--|--:|
|1|[`rand`](https://crates.io/crates/rand)<br>`0.7.3`|2015-02-03<br>2020-01-10|Algorithms<br>No standard library|1471|
|2|[`criterion`](https://crates.io/crates/criterion)<br>`0.3.3`|2017-12-02<br>2020-06-29|Development tools::Profiling|1163|
|3|[`tokio`](https://crates.io/crates/tokio)<br>`0.2.22`|2016-07-01<br>2020-07-22|Asynchronous<br>Network programming|1137|
|4|[`env_logger`](https://crates.io/crates/env_logger)<br>`0.7.1`|2015-01-27<br>2019-10-17|Development tools::Debugging|868|
|5|[`serde_json`](https://crates.io/crates/serde_json)<br>`1.0.58`|2015-08-07<br>2020-09-30|Encoding|843|
|6|[`bindgen`](https://crates.io/crates/bindgen)<br>`0.55.1`|2014-11-21<br>2020-08-24|Development tools::FFI<br>External FFI bindings|704|
|7|[`tempfile`](https://crates.io/crates/tempfile)<br>`3.1.0`|2015-04-14<br>2019-07-01|-|682|
|8|[`cc`](https://crates.io/crates/cc)<br>`1.0.60`|2014-12-16<br>2020-09-16|Development tools::Build Utils|676|
|9|[`quickcheck`](https://crates.io/crates/quickcheck)<br>`0.9.2`|2014-11-21<br>2020-01-14|Development tools::Testing|540|
|10|[`lazy_static`](https://crates.io/crates/lazy_static)<br>`1.4.0`|2014-11-23<br>2020-01-13|Memory management<br>No standard library<br>Rust patterns|522|
|11|[`hyper-rustls`](https://crates.io/crates/hyper-rustls)<br>`0.21.0`|2016-10-08<br>2020-07-05|-|498|
|12|[`serde`](https://crates.io/crates/serde)<br>`1.0.116`|2014-12-05<br>2020-09-11|Encoding|442|
|13|[`pkg-config`](https://crates.io/crates/pkg-config)<br>`0.3.18`|2014-11-11<br>2020-07-11|-|408|
|14|[`serde_derive`](https://crates.io/crates/serde_derive)<br>`1.0.116`|2016-08-29<br>2020-09-11|-|394|
|15|[`pretty_assertions`](https://crates.io/crates/pretty_assertions)<br>`0.6.1`|2017-03-26<br>2019-02-21|Development tools|391|
|16|[`tempdir`](https://crates.io/crates/tempdir)<br>`0.3.7`|2015-02-22<br>2018-03-21|Filesystem|351|
|17|[`futures`](https://crates.io/crates/futures)<br>`0.3.6`|2016-07-31<br>2020-10-05|Asynchronous|338|
|18|[`version-sync`](https://crates.io/crates/version-sync)<br>`0.9.1`|2017-09-18<br>2020-07-07|Development tools<br>Rust patterns|262|
|19|[`proptest`](https://crates.io/crates/proptest)<br>`0.10.1`|2017-06-18<br>2020-08-15|Development tools::Testing|247|
|20|[`clap`](https://crates.io/crates/clap)<br>`2.33.3`|2015-03-01<br>2020-09-19|Command-line interface|245|
|21|[`regex`](https://crates.io/crates/regex)<br>`1.3.9`|2014-12-13<br>2020-05-29|Text processing|242|
|22|[`assert_cmd`](https://crates.io/crates/assert_cmd)<br>`1.0.1`|2018-05-28<br>2020-03-31|Development tools::Testing|226|
|23|[`rusoto_mock`](https://crates.io/crates/rusoto_mock)<br>`0.45.0`|2017-05-20<br>2020-07-22|Development tools::Testing|221|
|24|[`cmake`](https://crates.io/crates/cmake)<br>`0.1.44`|2015-07-31<br>2020-05-18|Development tools::Build Utils|217|
|25|[`trybuild`](https://crates.io/crates/trybuild)<br>`1.0.35`|2019-05-06<br>2020-09-15|-|202|
|26|[`hex`](https://crates.io/crates/hex)<br>`0.4.2`|2015-10-23<br>2020-02-18|Encoding<br>No standard library|188|
|27|[`async-std`](https://crates.io/crates/async-std)<br>`1.6.5`|2019-05-30<br>2020-09-28|Asynchronous<br>Concurrency<br>Network programming|187|
|28|[`gcc`](https://crates.io/crates/gcc)<br>`0.3.55`|2014-11-11<br>2018-10-08|Development tools|180|
|28|[`anyhow`](https://crates.io/crates/anyhow)<br>`1.0.33`|2019-10-05<br>2020-10-06|Rust patterns|180|
|30|[`wasm-bindgen-test`](https://crates.io/crates/wasm-bindgen-test)<br>`0.3.18`|2018-07-26<br>2020-09-09|-|177|
|31|[`log`](https://crates.io/crates/log)<br>`0.4.11`|2014-12-13<br>2020-07-16|Development tools::Debugging|171|
|31|[`bincode`](https://crates.io/crates/bincode)<br>`1.3.1`|2014-11-20<br>2020-06-24|Encoding<br>Network programming|171|
|33|[`rustc_version`](https://crates.io/crates/rustc_version)<br>`0.2.3`|2015-08-24<br>2018-08-03|-|143|
|34|[`predicates`](https://crates.io/crates/predicates)<br>`1.0.5`|2017-06-02<br>2020-07-18|Data structures<br>Rust patterns|142|
|34|[`chrono`](https://crates.io/crates/chrono)<br>`0.4.19`|2014-11-20<br>2020-09-30|Date and time|142|
|36|[`structopt`](https://crates.io/crates/structopt)<br>`0.3.19`|2017-02-03<br>2020-10-08|Command-line interface|139|
|36|[`reqwest`](https://crates.io/crates/reqwest)<br>`0.10.8`|2016-10-16<br>2020-08-25|Web programming::HTTP client<br>WebAssembly|139|
|38|[`approx`](https://crates.io/crates/approx)<br>`0.3.2`|2015-11-15<br>2019-03-17|-|134|
|39|[`bencher`](https://crates.io/crates/bencher)<br>`0.1.5`|2016-08-18<br>2018-01-06|Development tools::Profiling<br>Rust patterns|132|
|40|[`glob`](https://crates.io/crates/glob)<br>`0.3.0`|2014-11-11<br>2019-03-07|Filesystem|131|
|41|[`hex-literal`](https://crates.io/crates/hex-literal)<br>`0.3.1`|2018-01-29<br>2020-08-02|-|130|
|42|[`assert_matches`](https://crates.io/crates/assert_matches)<br>`1.4.0`|2016-02-16<br>2020-10-04|No standard library|128|
|43|[`quickcheck_macros`](https://crates.io/crates/quickcheck_macros)<br>`0.9.1`|2014-11-21<br>2020-01-11|-|127|
|44|[`pretty_env_logger`](https://crates.io/crates/pretty_env_logger)<br>`0.4.0`|2016-12-29<br>2020-01-29|Development tools::Debugging|126|
|45|[`serde_test`](https://crates.io/crates/serde_test)<br>`1.0.116`|2016-06-29<br>2020-09-11|-|125|
|46|[`walkdir`](https://crates.io/crates/walkdir)<br>`2.3.1`|2015-09-27<br>2020-01-11|Filesystem|120|
|46|[`libc`](https://crates.io/crates/libc)<br>`0.2.79`|2015-01-15<br>2020-10-05|External FFI bindings<br>No standard library<br>Operating systems|120|
|48|[`time`](https://crates.io/crates/time)<br>`0.2.22`|2014-11-13<br>2020-09-26|Date and time|111|
|49|[`image`](https://crates.io/crates/image)<br>`0.23.10`|2014-11-20<br>2020-09-26|Multimedia::Encoding<br>Multimedia::Images|110|
|50|[`rayon`](https://crates.io/crates/rayon)<br>`1.4.1`|2015-12-10<br>2020-09-29|Concurrency|107|
|50|[`mockito`](https://crates.io/crates/mockito)<br>`0.27.0`|2016-01-10<br>2020-07-25|Development tools::Testing<br>Web programming|107|
|50|[`doc-comment`](https://crates.io/crates/doc-comment)<br>`0.3.3`|2018-03-29<br>2020-07-01|-|107|