Перейти к содержимому

Dart sdk как работать с программой

  • автор:

Introduction to Dart for Java Developers-Part1

ISOP

Dart is an open-source general-purpose programming language. It is originally developed by Google and later approved as a standard by ECMA. Dart is a new programming language meant for the server as well as the browser. Introduced by Google, the Dart SDK ships with its compiler — the Dart VM. The SDK also includes a utility -dart2js, a transpiler that generates JavaScript equivalent of a Dart Script. This tutorial provides a basic level understanding of the Dart programming language.

Audience

This tutorial will be quite helpful for all those developers who want to develop single-page web applications, a mobile app (for Flutter) a using Dart. It is meant for programmers with a stronghold on object-oriented concepts.

Prerequisites

The tutorial assumes that readers have adequate exposure to object-oriented programming concepts. If you have worked on Java, then it will help you further to grasp the concepts of Dart quickly. Don’t worry if you don’t have any programming knowledge experience still you can grasp the concepts of Dart quickly.

What you’ll learn

  • Installation
  • How to create constructors
  • Different ways to specify parameters
  • When and how to create getters and setters
  • How Dart handles privacy
  • How to create factories
  • How functional programming works in Dart
  • Other core Dart concepts

Executing Script Online with DartPad

You may test your scripts online by using the online editor at https://dartpad.dartlang.org/. The Dart Editor executes the script and displays both HTML as well as console output. The online editor is shipped with a set of preset code samples.

A screenshot of the Dartpad editor is given below −

Dartpad also enables to code in a more restrictive fashion. This can be achieved by checking the Strong mode option on the bottom right of the editor. You may try the following example using Dartpad

The code will display the following output

Setting Up the Local Environment

In this section, let us see how to set up the local environment.

Using the Text Editor

Examples of a few editors include Windows Notepad, Notepad++, Emacs, vim or vi, etc. Editors may vary from one Operating System to another. The source files are typically named with the extension “.dart”.

Installing the Dart SDK

The current stable version of Dart is 2.4.0. The dart SDK can be downloaded from −

A screenshot of the Dart SDK installation is given below −

On completion of the SDK installation, set the PATH environment variable to

Verifying the Installation

To verify if Dart has been successfully installed, open the command prompt and enter the following command −

If the installation is successful, it will show the dart runtime.

IDE Support

Examples include Eclipse, IntelliJ, and WebStormfrom Jet brains. Given below are the steps for configuring the Dart environment using WebStrom IDE.

Installing WebStorm

The WebStorm installation file is available for Mac OS, Windows, and Linux. After downloading the installation files, follow the steps given below −

Сервис на языке Dart: каркас серверного приложения

В прошлый раз мы закончили на том, что разместили статическую веб страницу-заглушку, разработанную с использованием Flutter для web. Страница отображает прогресс разработки нашего сервиса, однако данные о датах начала разработки и релиза пришлось захардкодить в приложении. Таким образом мы лишились возможности изменить сведения на странице. Пришло время разработать приложение — сервер данных. Схема всех приложений сервиса — в статье «Сервис на языке Dart: введение, инфраструктура бэкэнд».

В этой статье мы напишем приложение с использованием фреймворка Aqueduct, оценим его производительность и потребление ресурсов в разных режимах, напишем инструментарий для компиляции в нативное приложение для Windows и Linux, разберемся с миграциями схемы базы данных для доменных классов приложения и даже опубликуем наш инструментальный docker образ в публичный регистр DockerHub.

  • все скриншоты с кодом «кликабельные»
  • полный код здесь
  • консольные команды собраны в README.md проекта
  • комментарии, вопросы, советы — приветствуются
  • пообщаться с автором можно в Телеграмм канале

Установка Aqueduct

Начнем с установки dart-sdk — набора средств разработки на языке Dart. Установить его можно с использованием пакетного менеджера вашей операционной системы как предложено здесь. Однако, в случае Windows никакого пакетного менеджера в вашей системе по умолчанию не установлено. Поэтому просто:

    и распакуем его на диск C:
    Теперь, чтобы наша операционная система знала, где искать исполняемые файлы, добавим необходимые пути. Откроем переменные ОС. Для этого начнем вводить «изменение переменных среды текущего пользователя» в строке поиска

Генерация приложения

Итак, откроем папку нашего сервера в VsCode

Для тех, кто не видел первую и вторую статьи, исходный код можно склонировать из guthub репозитория:

Создадим шаблон приложения:

Ознакомимся с содержимым шаблона проекта:

  • README.md — заметка с описанием, как работать с aqueduct проектом, запускать тесты, генерировать API документацию и пр. Вспомогательный файл.
  • pubspec.yaml — спецификция для пакетного менеджера pub. Здесь находятся сведения об используемых пакетах, названии, описании, версии проекта и пр.

Конфигурация

Первая задача, которую предстоит решить, — настройка приложения при запуске. Aqueduct имеет встроенный механизм извлечения параметров из конфигурационных файлов, но этот механизм не очень удобен при запуске в Docker контейнере. Мы поступим иначе:

  • Передадим список переменных в операционную систему контейнера.
  • При запуске приложения внутри контейнера прочитаем переменные окружения операционной системы и используем их для первоначальной настройки.
  • Создадим маршрут для просмотра по сети всех переменных окружения запущенного приложения (это будет полезно при просмотре состояния приложения из панели администратора).

EnvironmentRepository в конструкторе считывает переменные окружения из операционной системы в виде словаря Map<String, String> и сохраняет в приватной переменной _env. Добавим метод для получения всех параметров в виде словаря:

lib/service/EnvironmentService — логический компонент доступа к данным EnvironmentRepository:

Инъекция зависимостей

Здесь необходимо остановиться и разобраться с зависимостями компонентов:

  • сетевому контроллеру потребуется экземпляр сервиса переменных,
  • сервис должен быть единственным для всего приложения,
  • для создания сервиса необходимо предварительно создать экземпляр репозитория переменных.

Создадим экземпляр контейнера инжектора lib/di/di_container.dart и напишем метод с регистрацией репозитория и сервиса:

Метод инициализации контейнера DI вызовем в методе подготовки приложения:

Cетевой слой

lib/controller/ActuatorController — сетевой http компонент. Он содержит методы доступа к служебным данным приложения:

Задекларируем обработчики маршрутов для контроллеров в lib/controller/Routes:

Первый запуск

Для запуска необходимо:

  • приложение упаковать в Docker образ,
  • добавить контейнер в сценарий docker-compose,
  • настроить NGINX для проксирования запросов.

Добавим контейнер приложения в сценарий docker-compose.yaml:

Создадим файл data_app.env с переменными конфигурации для приложения:

Добавим новый location в отладочный конфиг NGINX conf.dev.d/default.conf:

Запускаем отладочный сценарий с флагом предварительной сборки образов:

Сценарий успешно запустился, но настораживают несколько моментов:

    официальный образ со средой dart от google занимает 290MБ в виде архива. В распакованном виде он займет кратно больше места — 754МБ. Посмотреть список образов и их размер:

    Создадим на сервере папку для новой версии приложения и скопируем содержимое проекта

Нам предстоит решить три задачи:

  • снизить потребление оперативной памяти dart приложением,
  • уменьшить время запуска,
  • снизить размер docker-контейнера приложения.

Начнем с локального удаления aqueduct CLI:

Установим новую версию:

Поднимем зависимости в pubspec.yaml:

Соберем нативное приложение:

Результатом будет однофайловая сборка data_app.aot размером около 6 МБ. Можно сразу запустить это приложение с параметрами, например:

Потребление памяти сразу после запуска — менее 10 МБ.

Посмотрим под нагрузкой. Параметры теста: сетевые запросы GET /actuator, 100 потоков с максимальной доступной скоростью, 10 минут. Результат:

Итого: средняя скорость — 13к запросов в сек для тела ответа JSON 1,4кВ, среднее время ответа — 7 мсек, потребление оперативной памяти (на два инстанса) 42 MB. Ошибок нет.

При повторном тесте с шестью инстансами приложения средняя скорость, конечно, повышается до 19к/сек, но и утилизация процессора достигает 45% при потреблении памяти 64 МБ.
Это превосходный результат.

Упаковка в контейнер

Здесь мы столкнемся еще с одной сложностью: скомпилировать dart-приложение в натив мы можем только под текущую ОС. В моем случае это Windows10 x64. В docker-контейнере я, конечно, предпочел бы один из дистрибутивов Linux — например, Ubuntu 20.10.

Решением здесь станет промежуточный docker-стенд, используемый только для сборки нативных приложений под Ubuntu. Напишем его /dart2native/Dockerfile:

Теперь соберем его в docker-образ с именем aqueduct_builder:4.0.0-b1, перезаписав, если есть, старые версии:

Напишем сценарий сборки нативного приложения docker-compose.dev.build.yaml:

Запустим сценарий сборки:

Файл скомпилированного под Ubuntu приложения data_app.aot занимает уже 9 МБ. При запуске утилизирует 19 МБ оперативной памяти (для двух инстансов). Проведем локальное нагрузочное тестирование с теми же условиями, но в контейнере с проксированием NGINX (GET, 100 потоков):

В среднем 5,3к запросов в секунду. При этом потребление оперативной памяти не превысило 55 МБ. Размер образа уменьшился по сравнению с установленным dart и aqueduct c 840 МБ до 74 МБ на диске.

Напишем новый сценарий docker-compose.aot.yaml запуска приложения. Для этого заменим блок описания data_app, установив базовым образ “пустой” Ubuntu:20.10. Смонтируем файл сборки и изменим команду запуска:

Решим еще одну сервисную задачу: фактически сборочный docker-образ c установленными dart и aqueduct — вполне себе переиспользуемый инструмент. Имеет смысл выгрузить его в общедоступный регистр и подключать как готовый скачиваемый образ. Для этого необходимо:

  • зарегистрироваться в публичном регистре, например, DockerHub,
  • авторизоваться локально с тем же логином

Подключение базы данных

В aqueduct уже встроен ORM для работы с базой данных PostgreSQL. Для его использования необходимо:

  • Создать доменные объекты, описывающие записи в базе данных.
  • На основе доменных объектов и связей между ними сгенерировать файл миграции. Заметка: для записи в базу данных необходимо, чтобы в БД были подготовлены таблицы, чьи схемы подходят для хранения доменных объектов. Aqueduct предоставляет инструмент миграции, который фактически обходит все классы проекта, являющиеся расширением ManagedObject (управляемые объекты), прочитывает типы их полей и связей с другими управляемыми объектами и создает специальный файл, в котором описано изменение схемы таблиц и связей в базе данных по сравнению со схемой предыдущего файла миграции. Файлы миграции добавляются при каждой перегенерации схемы.
  • Применить файлы миграции к базе данных. Применение происходит последовательно, начиная с версии, которая записана в БД текущей.
  • В файлы миграции, сгенерированные aqueduct, можно вносить свои изменения, например определить реализацию метода seed() — для добавления в БД каких-либо начальных данных.
  • Генерация и применение миграций производится aqueduct CLI.

Здесь необходимо обратить внимание на файл переменных окружения data_db.env. Дело в том, что образ заранее настроен на использование этих переменных в качестве имени пользователя, хоста, порта и пароля доступа. Добавим эти переменные в файл:

Значения приведены условно.

Также смонтируем папку хоста ./data_db/ в контейнер для хранения данных БД.
Далее в приложении data_app добавим класс /service/DbHelper для подключения к базе данных, используя переменные окружения:

Создадим доменный объект, управляемый ORM, для получения настроек клиентского приложения:

Добавим репозиторий и сервис для добавления настроек и получения актуальной версии:

Зарегистрируем новые компоненты в DI контейнере:

Добавим новый контроллер и эндпойнт в маршрутизатор:

Теперь сгенерируем файл миграции базы данных. Выполним:

Результатом будет создание файлов миграции в папке проекта:

Теперь нужно решить сервисную задачу: миграции нужно применять из системы с установленным aqueduct (и dart) к базе данных, работающей в контейнере, и это нужно выполнять как при локальной разработке, так и на сервере. Используем для этого кейса ранее собранный и опубликованный образ для AOT-сборки. Напишем соответствующий docker-compose сценарий миграции БД:

Интересная деталь — строка подключения к БД. При запуске сценария можно передать в качестве аргумента файл с переменными окружения, а затем использовать эти переменные для подстановки в сценарии:

Также обратим внимание на флаги запуска:

  • —compatibility — совместимость с версиями docker-compose сценариев 2.х. Это позволит использовать параметры deploy для ограничения использования ресурсов контейнером, которые игнорируются в версиях 3.х. Мы ограничили потребление оперативной памяти до 200МБ и использование процессорного времени до 50%
  • —abort-on-container-exit — этот флаг устанавливает режим выполнения сценария таким образом, что при остановке одного из контейнеров сценария будут завершены все остальные. Поэтому, когда выполнится команда миграции схемы базы данных и контейнер с aqueduct остановится, docker-compose завершит также и работу контейнера базы данных

Публикация

Для подготовки к публикации приложения необходимо:

  • Изменить переменные окружения в data_app.env и data_db.env. Напомню, что сейчас у нас POSTGRES_PASSWORD=postgres_password
  • Переименовать сценарий запуска нативного приложения docker-compose.aot.yaml в docker-compose.yaml. Команда запуска приложения на сервере не должна иметь аргументов
  • Временно заблокировать маршрут просмотра переменных окружения запущенного приложения /api/actuator. В следующей статье мы реализуем механизм авторизации по ролям и откроем доступ к этому маршруту только для администратора.
  • Измененную конфигурацию NGINX ./conf.d/default.conf
  • Сценарии запуска и миграции docker-compose.yaml, docker-compose.migrations.yaml
  • Файлы с переменными окружения data_app.env и data_db.env

Выполним сценарий миграции схемы базы данных:

Запустим сценарий приложения:

Вместо заключения

Каркас для бэкенд приложений готов. В следующей статье на его основе мы разработаем приложение на Flutter для авторизации пользователей сервиса. Для этого мы воспользуемся спецификацией oAuth2 и интегрируемся с VK и Github.

Введение в язык Dart

Dart представляет язык программирования общего назначения от компании Google, который предназначен прежде всего для разработки прикладных приложений. Основной сферой применения языка Dart на сегодняшний день является разработка графических приложений с помощью кроссплатформенного фреймворка Flutter. В частности, Flutter позволяет создавать клиентские веб-приложения, мобильные приложения под Android и iOS и десктопные приложения под Windows, MacOS и Linux. Таким образом, мы можем написать на языке Dart программу с общим кодом и скомпилировать эту программу сразу под все поддерживаемые платформы — Android, iOS, Windows, Linux, MacOS, веб-браузер. Но естественно фреймворком Flutter применение языка Dart не ограничивается.

В своем развитии Dart испытал влияние более ранних языков, таких как Smalltak, Java, JavaScript. Его синтаксис похож на синтаксис других си-подобных языков. При этом Dart — объектно-ориентированный язык. Все значения, которые используются в программе на Dart, представляют объекты.

Dart быстро развивается. Текущая версия — 3, в рамках которой регулярно выходят новые подверсии.

Установка Dart и первая программа на Windows

Для работы с Dart необходимо установить Dart SDK. Для этого нужно загрузить zip-архив с SDK с адреса https://dart.dev/get-dart/archive и распаковать его на жестком диске.

Установка Dart

Стоит отметить, что если Dart применяется для работы с фреймворком Flutter, то отдельно Dart можно не устанавливать, поскольку установочный пакет Flutter уже по умолчанию содержит инструменты для языка Dart. Однако поскольку Flutter — это все таки частный вариант использования Dart, поэтому рассмотрим отдельную установку Dart SDK.

На странице загрузки есть пакеты для Windows, Linux, MacOS. В данном же случае мы будем использовать стабильную сборку, которая рекомендуется к использованию в разработки, поэтому при загрузке выбираем нужный пакет в секции «Stable channel».

Допустим, в моем случае Dart SDK распакован по пути C:\dart-sdk . Если мы перейдем в распакованном SDK к папке bin, то можем увидеть там такую программу как dart.exe :

Установка Dart SDK на Windows

С помощью данной утилиты собственно и будут запускаться скрипты на языке Dart.

Напишем первую простейшую программу. Для этого определим на жестком диске каталог для файлов. Например, в моем случае пусть это будет каталог C:\dart . Создадим в каталоге новый текстовый файл, который будет называться main.dart (файлы с кодом Dart обычно имеют расширение *.dart ). Откроем данный файл в любом текстовом редакторе и определим в этом файле следующий простейший код:

Первая программа на языке Dart на Windows

Любое приложение на языке Dart должно иметь функцию, которая называется main . Эта функция имеет тип void и не принимает никаких параметров, поэтому после названия функции идут пустые скобки.

Тело функции помещается в фигурные скобки. В частности, в данном случае в функции main вызывается другая функция — print() , которая выводит на консоль некоторую строку. В данном случае это строка «Hello METANIT.COM!»

Теперь запустим данную программу. Для этого откроем командную строку/Терминал Windows и перейдем к папке с файлом main.dart с помощью команды cd .

Затем компиляции и запуска программы введем в командную строку следующую команду:

В данном случае имеется в виду, что dart sdk распаковано по пути c:\dart-sdk . И в этом SDK вызывается программа dart.exe , которой передается наш скрипт main.dart . И после это будет выполняться наша программа, которая выведет на консоль строку:

Начало работы с языком Dart

Чтобы каждый раз при запуске программы не надо было вводить полный путь до утилиты dart.exe , можно добавить путь к утилите в переменные среды. Для перехода к окну изменения переменных среды можно ввести в окно поиска «изменение переменных» и выбрать появившийся пункт «Изменение переменных среды текущего пользователя»:

Добавление Dart SDK в переменные среды

В открывшемся окне выберем пункт Path и нажмем на кнопку Изменить :

Добавление пути к Dart SDK в переменные среды

Далее нажмем на кнопку Создать и добавим путь к dart sdk:

Добавление Dart SDK в Path Environments

Соответственно после этого можно будет запускать программу на dart следующим образом:

Get started: Command-line and server apps

Follow these steps to start using the Dart SDK to develop command-line and server apps. First you’ll play with the Dart language in your browser, no download required. Then you’ll install the Dart SDK, write a small program, and run that program using the Dart VM. Finally, you’ll use an AOT (ahead of time) compiler to compile your finished program to native machine code, which you’ll execute using the Dart runtime.

1. Play with Dart code in DartPad

With DartPad you can experiment with the Dart language and APIs, no download necessary.

For example, here’s an embedded DartPad that lets you play with the code for a small Hello World program. Click Run to run the app; output appears in the console view. Try editing the source code—perhaps you’d like to change the greeting to use another language.

info Note: If you see an empty box instead of code, go to the DartPad troubleshooting page.

2. Install Dart

Once you’re ready to move beyond DartPad and develop real apps, you need an SDK. You can either download the Dart SDK directly (as described below) or download the Flutter SDK, which includes the full Dart SDK.

  • Windows
  • Linux
  • Mac

Use Chocolatey to install a stable release of the Dart SDK.

error Important: These commands require administrator privileges. If you need help on starting an administrator-level command prompt, try a search like cmd admin.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *