Здравствуй, дорогой коллега! Сейчас я расскажу как сделать и опубликовать пакет для флаттера. Пройдем с тобой путь от создания до публикации. Я опишу все нюансы, всё то где я в своё время застрял.
Погнали!
Создаем Package и в нём проект example
В Android студии выбираем File - New - New Flutter progect
В "Project type" ставим "Package" название я поставил "my_package"
После создания проекта давай сразу создадим example. Это проект в котором мы будем подключать наш пакет для тестирования и "горячей" разработки.
Для этого открываем терминал в нашем пакете и запускаем команду:
flutter create example
Дальше нам необходимо добавить конфигурацию, чтобы уже привычными движениями запускать наш проект:
Жмем "Add Configuration...", далее "Add new..." и выбираем Flutter
Здесь прописываем имя Example и путь до его файла с main функцией нашего экзампла:
./example/lib/main.dart
Супер, теперь работает запуск!
Далее нужно в example подключить наш package. Для этого заходим в example/pubspec.yaml (именно в example, не перепутайте с pubspec.yaml нашего пакета) и подключаем наш пакет в dependencies по path: ..\ (папкой выше):
my_package:
path: ../
И чтобы всё это дело закруглить импортнём наш пакет в example/lib/main.dart, прописываем прямо сверху после импорта material:
import 'package:my_package/my_package.dart';
Удалим лишний example/README.md - это нам не надо, чтобы лишнее место не занимал и чтобы нам в дальнейшем не путаться. Также можно удалить папку example/test - тестировать example мы тоже не будем.
Фуф!!! Выдохнули. Болванка готова. Можно приступать к наполнению нашего пакета.
Пишем код самого пакета
Создаем наш собственный велосипед... Точнее наполняем функционал. Это творческая часть :)
По структуре пакета можно почитать в официальной документации. Проще конечно всё писать в одном файле, но если надо разбивать, то можно создать каталог lib/src в нем распихать функционал по разным файлам. Эти файлы потом нужно экспортировать в основной:
export 'src/my_class.dart' show MyClass;
Из обязательного - пишите код так, чтобы не было ворнингов от линтера. И применяйте автоформатер кода, чтобы всё было по феншую. Иначе снимут pub points.
Если всё настроили верно на первом этапе, то тут мы себе сильно облегчили разработку. Можно сразу писать пакет и тут же его запускать в проекте example. То есть мы и пакет сразу пишем и пример использования пакета для людей за что нам начислят дополнительные pub points.
В идеале нужно также свой пакет покрыть тестами. Напишите хоть один (напомню на всякий, тесты лежат в папке test), за это дадут ещё pub points.
Наш пакет готов!
Заливаем наш пакет на GitHub
Первым делом создаем репозитарий на гите прямо тутже из студии:
Называем его точно также как называется наш пакет и обязательно оставляем его публичным
Коммитим всё наше добро... Ура! Наше творение увидело белый свет!
На самом деле уже на этом этапе другие люди уже могут использовать этот пакет. Пакеты по умолчанию загружаются с pub.dev, но можно вручную прописать локальный путь (мы это делали, когда создавали example), а также прямой пусть к репозиторию:
Но не торопись кидать ссылку своему коллеге, нужно же как-то рассказать как пользоваться нашим пакетом...
Оформляем README.md и README.ru.md
Копируем файл README.md сюда же в корень и называем его README.ru.md - будем делать описание сначала на родном языке.
В README.ru.md нужно описать что у нас за пакет, какой функционал и как его использовать - без этого неокрепшие умы не поймут всей прелести этого шедевра. По этому надо в доступной форме всё рассказать и показать.
Можно (и нужно, если у вас визуалка) в описание вставлять картинки. Для этого создадим в корне папку ".github".
Туда добавляем скрины-картинки, а в саму разметку в README.ru.md вставляем их так "" (папку и файлы картинок естественно нужно добавить в репозитарий).
Текст с картинками есть! Теперь делаем описание для людей на английском языке. Мы же вещаем на международную аудиторию?.. Если у нас туго с английским - запихиваем русский ридми в Google Translate. В общем заполняем файл README.md
В нём сразу после описания (после первого абзаца) вставляем ссылку на русский ридми вот так: "[Русский README.md](README.ru.md)".
По умолчанию будет открываться англоязычная страница. И там на видном месте сразу будет ссылка на русское описание. Круто! (подсмотрел это у китайцев - вот ребята молодцы!)
Даже не думай пропускать перевод на русский язык - оформляй русский ридми, пиши статьи и снимай видео на русском языке по Flutter и по своему пакету - не будь снобом! Поддержи русское Flutter сообщество!
Всё готово. Коммитим, смотрим что всё корректно отображается на GitHub (точно также будет отображаться и на пабе). Коллегам уже не стыдно показать :)
Теперь вперёд на pub.dev!
Подготавливаем пакет к публикации
Ну что, остались последние штрихи...
Настраиваем pubspec.yaml файл. Что там за поля есть, можно почитать в документации. Мы же сделаем по минимуму:
- Заполняем description - просто копируем первый абзац из README.md
- Вместо homepage ставим параметр repository - копируем туда ссылку на репозитарий, который создали выше
- Почистим от комментов и убедимся что у нас последние версии зависимостей в dependencies
Далее открываем CHANGELOG.md и не мудрствуя лукаво пишем туда под версией 0.0.1 - Initial release
Дальше открываем файл LICENSE. Чтобы ничего не выдумывать, будем публиковаться под абсолютно свободной MIT лицензией. Тупо копируем туда весь текст лицензии (можно для успокоения взять у flutter_bloc), только не забываем проставить текущий год и вашу фамилию и имя транслитом
И последний мааааалюсенький нюанс... Если мы хотим максимальных pub points, то нам придется всё задокументировать в исходниках. По этому, прописываем вообще везде где только можно documentation comments - перед каждой переменной или функцией или классом описание после трех слешей /// Эта документация появляется при наведении на функцию или переменную в среде разработки:
Ура! Всё готово к публикации.
Заливаем пакет на 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)?"
Отвечаем Y - ес оф кос. Авторизовались... И... Всё! Наш пакет на pub.dev! После публикации в течение дня пакет проходит автоматические тесты по которым определяется сколько будет начислено очков.
Поздравляю! Мы проделали большой путь! И если всё сделано правильно, то вот он заветный результат 130 из 130.
P.S. После того как опубликовал свой пакет, не забудь здесь в комментариях к статье написать слова благодарности в мой адрес и скинуть ссылку на свой пакет, я старался для тебя. Слова проклятий, а также вопросы и предложения тоже не нужно держать в себе - всё пиши.
P.S.S. Ссылки на официальную документацию по разработке пакета:
P.S.S.S. Чтобы сделать обновление уже опубликованного пакета, нужно: сменить версию в pubspec.yaml файле, сделать описание этой версии в CHANGELOG.md и опять запустить "flutter pub publish".