Найти тему

Flutter package - пакет с нуля до публикации в pub.dev с максимальными pub points

Оглавление

Здравствуй, дорогой коллега! Сейчас я расскажу как сделать и опубликовать пакет для флаттера. Пройдем с тобой путь от создания до публикации. Я опишу все нюансы, всё то где я в своё время застрял.

Погнали!

Создаем Package и в нём проект example

В Android студии выбираем File - New - New Flutter progect
В "Project type" ставим "Package" название я поставил "my_package"

-2

После создания проекта давай сразу создадим example. Это проект в котором мы будем подключать наш пакет для тестирования и "горячей" разработки.

Для этого открываем терминал в нашем пакете и запускаем команду:
flutter create example

-3

Дальше нам необходимо добавить конфигурацию, чтобы уже привычными движениями запускать наш проект:
Жмем "
Add Configuration...", далее "Add new..." и выбираем Flutter

-4

Здесь прописываем имя Example и путь до его файла с main функцией нашего экзампла:
./example/lib/main.dart

-5

Супер, теперь работает запуск!

-6

Далее нужно в example подключить наш package. Для этого заходим в example/pubspec.yaml (именно в example, не перепутайте с pubspec.yaml нашего пакета) и подключаем наш пакет в dependencies по path: ..\ (папкой выше):
my_package:
path: ../

-7

И чтобы всё это дело закруглить импортнём наш пакет в example/lib/main.dart, прописываем прямо сверху после импорта material:
import 'package:my_package/my_package.dart';

-8

Удалим лишний example/README.md - это нам не надо, чтобы лишнее место не занимал и чтобы нам в дальнейшем не путаться. Также можно удалить папку example/test - тестировать example мы тоже не будем.

Фуф!!! Выдохнули. Болванка готова. Можно приступать к наполнению нашего пакета.

Пишем код самого пакета

-9

Создаем наш собственный велосипед... Точнее наполняем функционал. Это творческая часть :)

По структуре пакета можно почитать в официальной документации. Проще конечно всё писать в одном файле, но если надо разбивать, то можно создать каталог lib/src в нем распихать функционал по разным файлам. Эти файлы потом нужно экспортировать в основной:
export 'src/my_class.dart' show MyClass;

Из обязательного - пишите код так, чтобы не было ворнингов от линтера. И применяйте автоформатер кода, чтобы всё было по феншую. Иначе снимут pub points.

Если всё настроили верно на первом этапе, то тут мы себе сильно облегчили разработку. Можно сразу писать пакет и тут же его запускать в проекте example. То есть мы и пакет сразу пишем и пример использования пакета для людей за что нам начислят дополнительные pub points.

В идеале нужно также свой пакет покрыть тестами. Напишите хоть один (напомню на всякий, тесты лежат в папке test), за это дадут ещё pub points.

Наш пакет готов!

Заливаем наш пакет на GitHub

Первым делом создаем репозитарий на гите прямо тутже из студии:

-10

Называем его точно также как называется наш пакет и обязательно оставляем его публичным

-11

Коммитим всё наше добро... Ура! Наше творение увидело белый свет!

На самом деле уже на этом этапе другие люди уже могут использовать этот пакет. Пакеты по умолчанию загружаются с pub.dev, но можно вручную прописать локальный путь (мы это делали, когда создавали example), а также прямой пусть к репозиторию:

-12

Но не торопись кидать ссылку своему коллеге, нужно же как-то рассказать как пользоваться нашим пакетом...

Оформляем README.md и README.ru.md

Копируем файл README.md сюда же в корень и называем его README.ru.md - будем делать описание сначала на родном языке.

-13

В README.ru.md нужно описать что у нас за пакет, какой функционал и как его использовать - без этого неокрепшие умы не поймут всей прелести этого шедевра. По этому надо в доступной форме всё рассказать и показать.

Можно (и нужно, если у вас визуалка) в описание вставлять картинки. Для этого создадим в корне папку ".github".

-14

Туда добавляем скрины-картинки, а в саму разметку в README.ru.md вставляем их так "![](.github/example.png)" (папку и файлы картинок естественно нужно добавить в репозитарий).

-15

Текст с картинками есть! Теперь делаем описание для людей на английском языке. Мы же вещаем на международную аудиторию?.. Если у нас туго с английским - запихиваем русский ридми в Google Translate. В общем заполняем файл README.md

В нём сразу после описания (после первого абзаца) вставляем ссылку на русский ридми вот так: "[Русский README.md](README.ru.md)".

-16

По умолчанию будет открываться англоязычная страница. И там на видном месте сразу будет ссылка на русское описание. Круто! (подсмотрел это у китайцев - вот ребята молодцы!)

Даже не думай пропускать перевод на русский язык - оформляй русский ридми, пиши статьи и снимай видео на русском языке по Flutter и по своему пакету - не будь снобом! Поддержи русское Flutter сообщество!

Всё готово. Коммитим, смотрим что всё корректно отображается на GitHub (точно также будет отображаться и на пабе). Коллегам уже не стыдно показать :)

Теперь вперёд на pub.dev!

Подготавливаем пакет к публикации

Ну что, остались последние штрихи...

Настраиваем pubspec.yaml файл. Что там за поля есть, можно почитать в документации. Мы же сделаем по минимуму:

  • Заполняем description - просто копируем первый абзац из README.md
  • Вместо homepage ставим параметр repository - копируем туда ссылку на репозитарий, который создали выше
  • Почистим от комментов и убедимся что у нас последние версии зависимостей в dependencies
-17

Далее открываем CHANGELOG.md и не мудрствуя лукаво пишем туда под версией 0.0.1 - Initial release

-18

Дальше открываем файл LICENSE. Чтобы ничего не выдумывать, будем публиковаться под абсолютно свободной MIT лицензией. Тупо копируем туда весь текст лицензии (можно для успокоения взять у flutter_bloc), только не забываем проставить текущий год и вашу фамилию и имя транслитом

-19

И последний мааааалюсенький нюанс... Если мы хотим максимальных pub points, то нам придется всё задокументировать в исходниках. По этому, прописываем вообще везде где только можно documentation comments - перед каждой переменной или функцией или классом описание после трех слешей /// Эта документация появляется при наведении на функцию или переменную в среде разработки:

-20

Ура! Всё готово к публикации.

Заливаем пакет на Pub.dev

Важно! Публикация пакета - необратимый процесс. То что попало в pub.dev, то удалить уже не получится. Максимум что можно будет сделать это пометить свой пакет как discontinued.

Первое, что надо сделать - это прогнать публикацию "на сухую". Запускаем в терминале команду "flutter pub publish --dry-run". Она проанализирует наш пакет, выдаст какие-то предписания, которые надо поправить и получить заветную надпись "Package has 0 warnings". Значит можно постить.

Дальше нужно войти на pub.dev, для этого нужно иметь гугл аккаунт, так как при публикации он попросит авторизоваться.

И теперь пишем в консоли "flutter pub publish", он опять прогоняет тест и в конце спрашивает: "Do you want to publish my_package 0.0.1 (y/N)?"

-21

Отвечаем Y - ес оф кос. Авторизовались... И... Всё! Наш пакет на pub.dev! После публикации в течение дня пакет проходит автоматические тесты по которым определяется сколько будет начислено очков.

Поздравляю! Мы проделали большой путь! И если всё сделано правильно, то вот он заветный результат 130 из 130.

-22

P.S. После того как опубликовал свой пакет, не забудь здесь в комментариях к статье написать слова благодарности в мой адрес и скинуть ссылку на свой пакет, я старался для тебя. Слова проклятий, а также вопросы и предложения тоже не нужно держать в себе - всё пиши.

P.S.S. Ссылки на официальную документацию по разработке пакета:

Developing packages & plugins
Creating packages

P.S.S.S. Чтобы сделать обновление уже опубликованного пакета, нужно: сменить версию в pubspec.yaml файле, сделать описание этой версии в CHANGELOG.md и опять запустить "flutter pub publish".