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
Вопросы для воспроизведения
- Почему изменение номера в
Cargo.tomlне меняет уже собранный файл? - Почему нужно проверять архив после распаковки?
- Что передать человеку помимо исполняемого файла?
Задание
Обязательное. Добавьте поддержку --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)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.