Поговорим сегодня про assert в Dart. Разберемся, что же это такое, как работает и почему он точно будет вам полезен.
Assert — это оператор в языке Dart для проверки утверждений в процессе отладки вашего кода. Он помогает разработчику проверить, что определенные условия выполняются корректно. В случае, если это не так, программа выдает ошибку
AssertionError. Синтаксис очень прост — в оператор требуется передать условие для проверки, а также сообщение, которое поможет разобраться в том, почему же была получена ошибка. При этом сообщение не является обязательным, но линтер все же рекомендует его добавлять.
assert(<условие>, '<сообщение об ошибке>');
Применять assert можно как в методах, так и в конструкторах для проверки входных параметров.
Для примера реализуем простую программу для вывода количества товаров. Конечно, количество не может быть представлено отрицательным числом. Поэтому здесь стоит добавить проверку, чтобы избежать логических ошибок.
void setProductsAmount(int amount) {
assert(amount >= 0, 'Количество товаров не может быть отрицательным!');
print('Количество товаров установлено: $amount');
}
void main() {
setProductsAmount(25); // Код выполняется без ошибок
setProductsAmount(-5); // Ошибка в debug режиме: Количество товаров не может быть отрицательным!
}
Возьмем еще один более сложный пример. Нам нужно создать класс данных карточки. Карточки могут быть двух типов — простая и с изображением. При этом карточка с изображением обязательно должна получить ссылку на него. Чтобы ограничить создание карточки с картинкой без ссылки на изображение, достаточно в конструктор добавить соответствующий assert.
enum CardType { simple, withImage }
class Card {
const Card({
required this.type,
required this.title,
required this.subtitle,
this.imageUrl,
}) : assert(
type != CardType.withImage || imageUrl != null,
'Для карточки типа withImage необходимо указать imageUrl!',
);
final CardType type;
final String title;
final String subtitle;
final String? imageUrl;
}
void main() {
try {
final card = Card(
type: CardType.withImage,
title: 'Карточка с картинкой',
subtitle: 'Это карточка с картинкой',
);
print('Карточка с картинкой успешно создана!');
} catch (error) {
print(error);
}
// Этот код выведет в консоль сообщение об ошибке - Для карточки типа withImage необходимо указать imageUrl!
}
Здесь важно учесть, что assert работают только в debug режиме, поэтому валидировать с помощью них действия пользователя или внешние данные нельзя. Их можно и нужно применять в тех случаях, в которых сам разработчик может допустить ошибку на этапе выполнения задачи.
Еще больше полезного можно найти здесь:
◾️ Assert Statements in Dart
◾️ Error handling, Asserts
❤️ — если было полезно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥6🥰2
Продолжаю серию постов про создание CLI-инструментов на Dart. В прошлый раз мы разобрались, что Dart позволяет упаковать CLI в нативный бинарный файл, и пользователю не нужно устанавливать Dart SDK, чтобы пользоваться утилитой — достаточно скачать файл и запустить его.
Но этот процесс можно улучшить!🚀
Мы можем добавить установку CLI через Homebrew, чтобы пользователи могли установить ваш инструмент одной командой:
brew install mytool
Давайте разберемся, как это сделать.
Если вы хотя бы раз набирали
brew install, значит, вы уже пользовались Homebrew. Это менеджер пакетов для macOS и Linux. Но мало кто знает, что для распространения своего CLI не обязательно попадать в официальный Homebrew-core.Достаточно создать Homebrew Tap — обычный GitHub-репозиторий с формулой Homebrew. Это своего рода ваш собственный mini-магазин пакетов для brew, доступных по команде:
brew tap yourname/yourtap
brew install mytool
Tap удобен, когда:
✔️ вы делаете внутренний CLI в компании
✔️ часто обновляете инструмент
✔️ хотите распространять бинарники сразу после релиза
✔️ не хотите проходить ревью в Homebrew-core
А теперь давайте разберемся на практике. На самом деле все сводится к созданию двух репозиториев на GitHub и одной формуле на Ruby.
Шаг 1. Создайте репозиторий с вашим инструментом.
Если это Bash-скрипт — убедитесь, что он исполняемый:
#!/usr/bin/env bash
chmod +x mytool.sh
Если вы делаете CLI на Dart, собираем бинарники:
mkdir -p dist
dart compile exe bin/my_cli_tool.dart -o dist/mytool-macos
dart compile exe bin/my_cli_tool.dart -o dist/mytool-linux
Затем создайте GitHub Release и загрузите бинарники (mytool-macos, mytool-linux) как assets. Homebrew будет скачивать их оттуда.
Шаг 2. Создаем Homebrew Tap. Для этого необходимо создать отдельный репозиторий:
myusername/homebrew-mytool
Внутри создайте папку
Formula/ и файл Formula/mytool.rb:class Mytool < Formula
desc "CLI tool for automation"
homepage "https://github.com/myusername/my_cli_tool"
version "1.0.0"
if OS.mac?
url "https://github.com/myusername/my_cli_tool/releases/download/v1.0.0/mytool-macos"
sha256 "SHA256_OF_MACOS_FILE"
elsif OS.linux?
url "https://github.com/myusername/my_cli_tool/releases/download/v1.0.0/mytool-linux"
sha256 "SHA256_OF_LINUX_FILE"
end
def install
bin.install Dir["mytool-*"].first => "mytool"
end
end
SHA256 можно получить командой:
shasum -a 256 dist/mytool-macos
Этот хеш гарантирует, что Homebrew загружает именно тот файл, который вы опубликовали, и что он не был поврежден или подменен.
И на этом все! Теперь можно подключить tap и установить CLI:
brew tap myusername/mytool
brew install mytool
Важные моменты:
▪️SHA256 должен совпадать: Homebrew проверяет целостность файлов, поэтому после каждого релиза обязательно пересчитывайте SHA
▪️Выпуск обновлений: для новой версии создайте тег, пересоберите бинарники, обновите SHA и отредактируйте формулу в tap
▪️ Проверяйте локально: перед публикацией убедитесь, что установка работает:
brew install --build-from-source ./Formula/mytool.rb
▪️ Репозиторий должен начинаться с homebrew-, а имя формулы совпадать с названием CLI
▪️ Tap должен быть публичным. Homebrew не умеет устанавливать пакеты из приватных репозиториев
На этом все — ваш CLI готов к установке через brew
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5