Глава 36: Подробнее о Crate

Содержание:
  1. Сколько всего крейтов в Rust?
  2. Кто авторы крейтов?
  3. Кто принимает изменения в крейтах?
  4. Сравнение с Go, Node.js и PHP с точки зрения безопасности
  5. Безопасность в Rust: как обстоят дела?
  6. Топ крейтов
    1. Сериализация и работа с данными
    2. Асинхронное программирование
    3. Веб-разработка
    4. Работа с базами данных
    5. Утилиты командной строки
    6. Логирование и отладка
    7. Математика и алгоритмы
    8. Безопасность и криптография
    9. Парсинг и обработка текста
    10. Время и даты
    11. Тестирование и отладка
    12. Работа с памятью и структурами данных
    13. Примечания
  7. Локальный репозиторий Crate
    1. Подготовка локального реестра на сервере
    2. Настройка Apache на сервере
    3. Добавление crates вручную
    4. Настройка Cargo на клиентской машине

В Rust крейты (crates) — это библиотеки или исполняемые модули, которые являются основными строительными блоками экосистемы языка. Давайте разберем ваши вопросы по порядку.


Сколько всего крейтов в Rust?

Точное количество крейтов в Rust постоянно меняется, так как экосистема активно развивается. Основной источник крейтов — это репозиторий crates.io, официальный реестр пакетов для Rust. На момент марта 2025 года (учитывая текущую дату), в crates.io зарегистрировано более 100 000 крейтов, и их число продолжает расти. Это число можно уточнить, посетив crates.io, где публикуется актуальная статистика. Однако это только публичные крейты — существуют также приватные крейты, которые не публикуются в открытом доступе, и их количество оценить сложнее.


Кто авторы крейтов?

Авторы крейтов в Rust — это в основном сообщество разработчиков, а не исключительно члены основной команды Rust. Основная команда Rust (Rust Core Team и различные рабочие группы, такие как Rust Language Team, Rust Library Team и т.д.) отвечает за разработку языка, стандартной библиотеки (std) и инструментов, таких как компилятор rustc и менеджер пакетов Cargo. Однако подавляющее большинство крейтов создается сторонними разработчиками — энтузиастами, компаниями или независимыми программистами, которые публикуют свои библиотеки для общего использования.

Например:

Таким образом, экосистема крейтов в Rust — это результат работы сообщества, а не централизованной команды.


Кто принимает изменения в крейтах?

Изменения в крейтах принимают их авторы или сопровождающие (maintainers). Каждый крейт — это независимый проект, и его разработчики сами решают, какие изменения вносить, основываясь на запросах сообщества (issues/pull requests на GitHub) или собственных планах. Основная команда Rust не вмешивается в управление сторонними крейтами, за исключением случаев, когда речь идет о стандартной библиотеке или официальных инструментах.

Процесс принятия изменений зависит от конкретного крейта:


Сравнение с Go, Node.js и PHP с точки зрения безопасности

Важный вопрос о безопасности и доверии к экосистеме крейтов. Давайте сравним Rust с Go, Node.js и PHP:

  1. Go:
  2. Node.js (npm):
  3. PHP:
  4. Rust (crates.io):

    В Rust используется централизованный реестр crates.io, но публикация открыта для всех, кто зарегистрируется. Это похоже на npm, но есть важные отличия:

    Однако crates.io не проводит автоматическое ревью кода перед публикацией, и теоретически злоумышленник может опубликовать вредоносный крейт. Риск возрастает, если разработчики бездумно добавляют малоизвестные зависимости.


Безопасность в Rust: как обстоят дела?

Rust как язык делает акцент на безопасности (особенно памяти), но безопасность экосистемы крейтов зависит от нескольких факторов:


Итог

Для минимизации рисков в Rust рекомендуется:


Топ крейтов

Создание полного списка даже из топ-100 крейтов с разбивкой по категориям, описанием и особенностями — это довольно объемная задача, но можно предложить вам примерный список из 30-40 наиболее популярных и широко используемых крейтов по состоянию на март 2025 года, разбив их по категориям, дав краткое описание и выделив ключевые особенности. Полный список из 100 крейтов потребовал бы гораздо больше времени и детального анализа статистики crates.io, но постараемся охватить основные области применения Rust и дать вам полезный обзор.

Ниже приведен список, основанный на популярности (по загрузкам на crates.io), количеству зависимостей, активности сообщества и упоминаниям в документации/блогах.

1. Сериализация и работа с данными

2. Асинхронное программирование

3. Веб-разработка

4. Работа с базами данных

5. Утилиты командной строки

6. Логирование и отладка

7. Математика и алгоритмы

8. Безопасность и криптография

9. Парсинг и обработка текста

10. Время и даты

11. Тестирование и отладка

12. Работа с памятью и структурами данных

Примечания

Этот список охватывает около 30-40 крейтов, что примерно соответствует ядру популярных и широко используемых библиотек. Полный топ-100 потребовал бы включения менее известных, но полезных крейтов, таких как lazy_static, thiserror, anyhow, parking_lot, crossbeam и других.

Категории выбраны на основе типичных задач в Rust-разработке. Некоторые крейты (например, serde) используются повсеместно, независимо от категории.


Локальный репозиторий Crate

Давайте реализуем сценарий: клонировать crates (или их индекс) в папку на сервере в локальной сети через Cargo или Git, настроить Apache для предоставления доступа к этой папке без проксирования на внешний crates.io, а затем использовать Cargo на клиентской машине для загрузки crates из этой локальной папки. При необходимости вы будете вручную добавлять новые crates в эту папку.

Шаги настройки

1. Подготовка локального реестра на сервере

Вам нужно создать структуру, совместимую с Cargo, включая индекс и сами crates. Для этого можно использовать официальный индекс crates.io и добавить нужные пакеты.
  1. Клонируйте индекс crates.io:

    На сервере создайте директорию, например, /var/www/crates, и клонируйте индекс:

    mkdir -p /var/www/crates/index
    git clone --bare https://github.com/rust-lang/crates.io-index /var/www/crates/index

    Это создаёт "голый" Git-репозиторий с индексом всех crates.

  2. Создайте директорию для самих crates:

    mkdir -p /var/www/crates/crates
  3. Скачайте нужные crates:

  4. Добавьте config.json:

    В корне /var/www/crates создайте файл config.json:

    {
           "dl": "http://<server-ip>:4873/crates/{crate}-{version}.crate",
           "api": "http://<server-ip>:4873"
       }

    Замените <server-ip> на IP-адрес вашего сервера в локальной сети (например, 192.168.1.100).

2. Настройка Apache на сервере

Apache будет раздавать содержимое /var/www/crates по сети.>

  1. Установите Apache (если ещё не установлен):
    sudo apt update
    sudo apt install apache2
  2. Настройте виртуальный хост:

    Создайте файл конфигурации, например, /etc/apache2/sites-available/crates.conf:

    <VirtualHost *:4873>
           ServerName <server-ip>
           DocumentRoot /var/www/crates
    
           <Directory /var/www/crates>
               Options Indexes FollowSymLinks
               AllowOverride None
               Require all granted
           </Directory>
    
           ErrorLog ${APACHE_LOG_DIR}/crates-error.log
           CustomLog ${APACHE_LOG_DIR}/crates-access.log combined
       </VirtualHost>

    Замените <server-ip> на IP сервера (например, 192.168.1.100).

    Порт 4873 используется для примера, можно выбрать любой свободный.

  3. Активируйте и перезапустите Apache:

    sudo a2ensite crates.conf
    sudo systemctl restart apache2
  4. Проверка:

    С другой машины в локальной сети откройте в браузере http://<server-ip>:4873/. Вы должны увидеть содержимое /var/www/crates, включая index и crates.

3. Добавление crates вручную

Если вам нужно добавить новый crate:

  1. Скачайте .crate-файл (например, с crates.io или с помощью cargo download).
  2. Поместите его в /var/www/crates/crates.
  3. Обновите индекс в /var/www/crates/index:

Пример строки в индексе:

{"name":"serde","vers":"1.0.197","deps":[],"cksum":"...","features":{...},"yanked":false}

Чексумму можно вычислить с помощью sha256sum.

4. Настройка Cargo на клиентской машине

Теперь настройте Cargo для использования вашего локального реестра.

  1. Отредактируйте ~/.cargo/config.toml:

    [source.crates-io]
    registry = "http://<server-ip>:4873/"

    Замените <server-ip> на IP вашего сервера.

  2. Проверка:

    Создайте тестовый проект:

    cargo new test-project
    cd test-project

    Добавьте зависимость в Cargo.toml, например:

    [dependencies]
    serde = "1.0.197"

    Выполните сборку:

    cargo build

    Cargo должен загрузить serde с вашего сервера.

  3. Оффлайн-режим:

    После первой загрузки используйте:

    cargo build --offline

Итог

Если что-то не работает (например, Cargo не видит crates или индекс), проверьте: