Shanraq.org Shanraq.org
Сборка и передача программы
IT

Rust: с нуля до своего органайзера Урок 58 из 60

Сборка и передача программы

Урок 58. Собрать выпуск для своей ОС, показать версию и передать понятный архив.

Текст переведён с помощью ИИ.

Повторите настройки и README и автоматические проверки. Публикуйте только проверенный учебный проект, в отдельной папке.

Образ и опорная карта

Рецепт и готовый хлеб — разные вещи. Исходный код похож на рецепт, а исполняемый файл — на хлеб, приготовленный для конкретной кухни. Карта: проверить исходники → собрать выпуск → запустить файл → вложить README и лицензионное уведомление → передать архив → проверить после распаковки. У образа есть предел: готовый файл одной ОС обычно нельзя просто запустить на другой.

cargo build --release делает сборку с настройками выпуска; она обычно дольше учебной cargo build, зато итоговый файл рассчитан на использование. Cargo кладёт его в target/release: на Windows это organizer.exe, на macOS/Linux — organizer. version = "0.1.0" в Cargo.toml — номер проекта. env!("CARGO_PKG_VERSION") — макрос: Cargo при сборке подставляет туда номер из манифеста. Это значение встроено в программу и не меняется от переменной окружения при запуске. #[test] проверяет три части номера; три части сами по себе не обещают совместимость. Архив — один файл, собирающий программу, инструкцию и нужные уведомления.

Запустите и разберите

Поле license = "MIT" в манифесте объявляет условия использования именно учебного кода курса; для собственного нового кода выберите условия сознательно. В отдельном проекте Cargo установите version = "0.1.0" и поместите первый Rust блок в src/main.rs. Выполните cargo test --locked, затем cargo build --release. Запустите собранный файл из target/release; ожидаемый вывод ниже показан для этого манифеста. После изменения version сборку нужно повторить, иначе старый файл продолжит показывать старый номер. В учебной папке создайте README.md: назовите нужную ОС, команду запуска и то, что данные органайзера хранятся отдельно от программы. Для примеров курса действует раздел MIT в LICENSE-COURSE; при передаче их существенной части сохраните уведомление об авторстве и разрешении.

При ручной проверке ZIP-архив, созданный одним из инструментов, потерял право запуска после распаковки на macOS. Для macOS/Linux удобен tar.gz, который сохраняет это право; если распакованный файл не запускается из-за прав, команда chmod +x organizer в его папке добавляет право выполнения (chmod меняет права, +x добавляет запуск). На Windows право выполнения устроено иначе, там проверяйте organizer.exe.

Для воспроизводимого шага на macOS/Linux в папке с тремя файлами выполните tar -czf organizer.tar.gz organizer README.md LICENSE, затем создайте в этой папке пустую подпапку extracted, перейдите в неё и выполните tar -xzf ../organizer.tar.gz: tar собирает и извлекает файлы, -c создаёт архив, -x извлекает, -z использует сжатие gzip, -f указывает имя архива. На Windows создайте ZIP через проводник и проверьте распакованный .exe.

[package]
name = "organizer"
version = "0.1.0"
edition = "2024"
license = "MIT"

[dependencies]
fn main() {
    println!("Версия: {}", env!("CARGO_PKG_VERSION"));
}

#[test]
fn package_version_has_three_parts() {
    let parts: Vec<&str> = env!("CARGO_PKG_VERSION").split('.').collect();
    assert_eq!(parts.len(), 3);
}
Версия: 0.1.0

Вопросы для воспроизведения

  1. Почему изменение номера в Cargo.toml не меняет уже собранный файл?
  2. Почему нужно проверять архив после распаковки?
  3. Что передать человеку помимо исполняемого файла?

Задание

Обязательное. Добавьте поддержку --version и ошибку для неизвестного аргумента с кодом 2. Соберите выпуск, положите исполняемый файл, README.md и уведомление о лицензии в отдельную папку, создайте из неё архив средствами своей ОС. Распакуйте его в другую папку на той же ОС и выполните программу с --version; предскажите вывод до запуска.

Ответы

Показать ответы

Разберите слова после имени программы через std::env::args().skip(1). Для ошибки используйте eprintln! и std::process::exit(2). Возьмите текст разрешения для учебного кода из LICENSE-COURSE.

fn version_text() -> String {
    format!("Версия: {}", env!("CARGO_PKG_VERSION"))
}

fn run(args: &[String]) -> Result<String, String> {
    match args {
        [] => Ok(version_text()),
        [flag] if flag == "--version" => Ok(version_text()),
        _ => Err(String::from("Неизвестный аргумент")),
    }
}

fn main() {
    let args: Vec<String> = std::env::args().skip(1).collect();
    match run(&args) {
        Ok(message) => println!("{message}"),
        Err(message) => {
            eprintln!("{message}");
            std::process::exit(2);
        }
    }
}

#[test]
fn prints_version_for_flag() {
    assert!(run(&[String::from("--version")]).unwrap().contains("0.1.0"));
}

#[test]
fn rejects_unknown_argument() {
    assert!(run(&[String::from("--unknown")]).is_err());
}
Версия: 0.1.0

README.md:

# Органайзер 0.1.0

Собран для той ОС, на которой создан архив. Распакуйте все файлы, затем запустите `organizer --version` (Windows: `organizer.exe --version`). Этот учебный пример только показывает версию и пока не открывает файл задач. Файл задач будущего органайзера храните отдельно и сохраняйте его копию. На macOS/Linux, если распакованный файл не запускается из-за прав, выполните `chmod +x organizer` в этой папке. При ошибке прочитайте сообщение в stderr и не заменяйте данные пустым файлом.

После проверки

Не обещайте, что файл для Windows запустится на macOS или Linux. Для другой ОС соберите отдельный файл и проверьте его там; CI из урока 57 помогает проверять код, но не передаёт готовый архив автоматически. Секреты и личные данные не кладут в учебный архив. Документация cargo build.

Предыдущий урок · Оглавление

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Комментарии (0)

Пока нет комментариев. Будьте первым.