От Python к Dart - День 2 — meamka.me

От Python к Dart - День 2

written by Andrey Maksimov on 2022-03-07

Язык Dart невозможно представить без одноимённой утилиты для командной строки (cli). Это полноценный инструмент максимально упрощающий жизнь разработчика по своим возможностям сильно превосходящий встроенный возможности интерпретатора Python.

Среди доступных функций dart такие как создание проектов, анализ и форматирование исходных текстов и даже публикация пакетов на pub.dev и др.

Следует заметить, что целью этого цикла не стоит полное погружение в Dart с нуля, но быстрое знакомство для тех, кто уже умеет опыт разработки, в частности, на языке Python.

Создание проектов

В Python нет встроенных возможностей для автоматизированного создания проектов, всё приходится делать вручную: создать структуру папок, описывать зависимости в requirements.txt. Конечно, существуют сторонние приложения упрощающие этот процесс, например, используя poetry или Cookiecutter. Однако, они именно сторонние и требуют установки в систему или в виртуальное окружение. В Dart такая возможность встроена.

dart create

Итак, dart create - это cli-утилита с помощью которой можно создать проект из указанного шаблона.

$ dart create project_name

По умолчанию, это простое консольное приложение, например как dart-sass. Однако это не всё. С помощью параметра -t можно указать какой шаблон использовать для создания, это может быть:

console-simple Простое консольное приложение (базовый шаблон).
console-full Консольное приложение с тестами.
package-simple A starting point for Dart libraries or apps.
server-shelf Сервер на базе shelf.
web-simple Веб-приложение с основными библиотеками.

При запуске dart create сначала создаст структуру проекта, после чего попробует загрузить все необходимые библиотеки из pub.dev. Это поведение можно изменить указав флаг --no-pub при вызове команды.

Аналог из мира Python: poetry new project_name

Анализ и форматирование

При работе несколькими людьми над одним проектом очень часто возникает необходимость использовать единый стиль оформления кода, написания комментариев, использования имён переменных и др. В Python-мире мы используем линтеры flake8, различные форматировщики (black, yapf, autopep8) и mypy для проверки типов. Как Dart может помочь справиться с этими задачами?

dart analyze

Утилита позволяет провести статический анализ исходного кода и указать на ошибки и недочёты.

По умолчанию вызов запустит проверку и укажет на ошибки и предупреждения, указав необходимость реагировать на уровень info с помощью флага --fatal-infos.

$ dart analyze [<DIRECTORY> | <DART_FILE>]

Поведение анализатора можно корректировать с помощью конфигурационного файла или комментариев в коде. Подробнее читайте

dart format

Используя команду, мы можем привести исходный код к рекомендованному стилю согласно руководству Dart.

$ dart format

При вызове это команда перезапишет файлы отформатировав их "как следует".

dart fix

$ dart fix

Применяет автоматические исправления к файлам с исходным кодом исправляя ошибки двух типов:

  • ‎Анализ проблем, связанных с автоматическими исправлениями (иногда ‎‎называемыми quick-fixes или code actions))
  • ‎Проблемы, связанные с информацией о переносе API пакета‎

Для просмотра изменений укажите флаг --dry-run; для применения --apply; поведения по умолчанию у данной команды нет.

Сборка / компиляция

dart run

Запустить Dart-приложение крайне просто, достаточно выполнить в терминале следующую команду:

$ dart run bin/myapp.dart

Если вы находитесь внутри пакета и в каталоге bin находится одноимённый с названием пакета dart-файл, то приложение можно без указания файла:

$ dart run

Также можно запускать приложения из пакетов, указанных в зависимостях к текущему. Например, ваше приложение содержит зависимость от пакета foo, для запуска программы в этом пакете достаточно вызвать команду:

$ dart run foo

Или указать иную программу внутри пакета foo:

$ dart run foo:bar

Аргументы и флаги

Часто при разработке нужно передать аргументы к функции main(), для этого нужно передать их при запуске после указания файла:

$ dart run bin/myapp.dart arg1 arg2

Так же можно указать дополнительные флаги, например, для отладки приложения:

$ dart run --enable-asserts bin/myapp.dart arg1 arg2

dart compile

Команда dart compile позволяет скомпилировать программу Dart для целевой платформы. Выходные данные, которые вы указываете с помощью субкоманды, могут либо включать среду выполнения Dart, либо быть модулем (также известным как снимок snapshot).

$ dart compile
Субкомманда Вывод Описание
exe Исполняемый файл Автономный исполняемый файл для конкретной архитектуры, содержащий исходный код, скомпилированный в машинный код, и небольшую среду выполнения Dart.
aot-snapshot Модуль AOT Файл для конкретной архитектуры, содержащий исходный код скомпилированный в машинный код, но не содержит среду выполнения Dart.
jit-snapshot Модуль JIT Файл для конкретной архитектуры с промежуточным представлением всего исходного кода, а также оптимизированным представлением исходного кода, который выполнялся во время тренировочного запуска программы. JIT-код может иметь более высокую пиковую производительность, чем код AOT, но это зависит от тренировочного запуска.
kernel Kernel module Переносимое промежуточное представление исходного кода. Подробнее
js JavaScript JavaScript файл с приложением. Подробнее

dart test

Каждая программа нуждается в тестировании, это позволит уменьшить количество ошибок при разработке и улучшить качество приложения. Для Python существует отличный фреймворк упрощающий работу с тестами, их написание и выполнение - Pytest. Запуск тестов с ним крайне прост:

$ pytest

Вывод команды довольно подробный и с легкостью позволяет понять где и что пошло не так при выполнении тестов. Вот как это выглядит:

Пример работы pytest

Тестирование в Dart осуществляется с помощью команды dart test.

$ dart test

Ряд флагов таких как --name (-n), --tags (-t), or --exclude-tags (-x) позволяет управлять тем, какие тесты будут запущены. В случае, если указаны несколько флагов, то выполнены будут тесты которые удовлетворяют сразу всем условиям.

Пример работы dart test

Управление пакетами

dart pub

В Python есть встроенная утилита pip позволяющая с лёгкостью управлять пакетами, их установкой, обновлением и удалением. Для большего контроля есть и сторонние инструменты, такие как poetry. В Dart тоже есть инструмент упрощающий работу с внешними зависимостями - это dart doc.

$ dart pub

Возможности dart pub куда шире, нежели установка и удаление пакетов. С его помощью можно управлять локальным кэшем пакетов, публиковать пакеты на pub.dev и др.

Для примера рассмотрим установку пакета в Python:

$ python3 -m pip install django

Эта команда установит пакет django актуальной версии, однако, не пропишет его в зависимости, что означает что при новой установке надо как-то узнать об этой зависимости.

То же самое можно выполнить в Dart следующим образом:

$ dart pub add shelf

В этом случае пакет shelf будет добавлен в проект, прописан в зависимости в pubspec.yml и загружен в кэш.

Аналоги в Python: pip, poetry.

Документирование

dart doc

Немаловажной частью разработки приложений и библиотек является документирование функционала и исходного кода. И для этого в Dart есть специальная утилита, запустить которую крайне просто:

$ dart doc

Пример сгенерированной dart doc документации

Dart позволяет использовать комментарии и разметку в коде для описания классов, функий, модулей и других структур. Мы рассмотрим их подробнее в отдельной статье, сейчас же упомянем, что Dart обрабатывает специальные документирубщие комментарии. О том как сделать документирование максимально эффективным можно прочитать в статье Effective Dart.

Аналогами в Python могут выступать генератор Sphinx или pdoc, их возможности как самостоятельных инструментов, куда шире возможностей dart doc.

Заключение

Мы рассмотрели часть команд доступных с помощью утилиты dart, некоторые из них требуют более глубокого знакомства. Однако, даже этот беглый взгляд даёт представление о её возможностях и удобстве доступном "из коробки" для разработчика.

Далее мы начнём погружаться в язык Dart и сравним его с Python.