Привет друзья. В жизни разработчика рано или поздно наступает момент, когда проектов становится так много, что одной единственной (обычно это stable) версией flutter sdk уже не обойтись. Это может произойти по причине использования форкнутым проектом старой, несовместимой (это не только мажорные) с текущей любимой stable, версии. Либо же вы хотите попробовать новую функциональность из beta версии в вашем проекте. Вроде можно обойтись разделом "Flutter SDK archive" и вручную менять пути в IDE, но предлагаю вам вариант получше.

Сегодня я поведаю о том, как можно использовать пакет (программу) fvm для управления разными версиями flutter sdk. Изначально я предполагал, что такой материал уже есть на Хабре, но поиск результатов не дал (здесь было моё большое удивление, ведь его нет даже в формате "Перевод"). Поэтому смело восполняю данный пробел.

В конце данной статьи вы также найдёте полезные ссылки на материалы других авторов по данной теме. Приступим!


Содержание

Введение

Управление разными версиями чего бы то ни было — одна из важных тем в разработке программного обеспечения. В контексте flutter sdk это означает, что может существовать только одна используемая версия, а переключение между ними занимает много времени из-за отсутствия кэширования (я про flutter [down|up]grade).

Получается так, что если мы работаем над многими проектами с разными требуемыми версиями flutter sdk, то нужно каким-то образом иметь необходимые версии под рукой и переключаться между ними по мановению программерской палочки. Более того, это оказывается крайне удобным для тестировании "реакции" вашего приложения на разные каналы flutter sdk, быстро прыгая между ветками stable и beta.

Этой палочкой и является FVM, инструмент для контроля flutter sdk версий. Первый commit датируется от 22 февраля 2019г, а первый релиз состоялся уже 27 фев 2019г. Официальной страницей является сгенерированный сайт-документация fvm.app, и вот что встречает нас на широком крыльце парадного входа:

  • Множество Flutter SDK версий – "Возможность управлять и кэшировать несколько версий Flutter SDK. Быстрое переключение между каналами и релизами. Просмотр доступных каналов и релизов."

  • Управление версиями проекта – "Настройте и используйте версию Flutter SDK для каждого проекта. Динамические пути SDK для поддержки отладки в IDE. Обеспечивает согласованность между командами и CI средами."

  • Расширенный инструментарий – "Управление глобальной версией Flutter SDK. Создание процессов в любой версии Flutter SDK. Docker-образы для CI и рабочего процесса разработки. Установка Flutter из определенных коммитов."

В общем, без преувеличений, всё так и есть.

Начало работы

Для начала установите flutter sdk следуя официальной документации. Это версия будет использоваться глобально. Затем переходим к установке fvm.

ℹ Весь материал основан на версии 2.4.1. На момент выпуска статьи в changelog.md уже есть некоторая информация о версии 3.0.0, и косвенно я прошёлся по некоторым представленным там грядущим изменениям.

Есть несколько способов установить сие обеспечение на ваш пк. Начнём с того, что рекомендуемый способ установки заключается в использовании brew для unix или choco для windows:

brew tap leoafarias/fvm  
brew install fvm

choco install fvm

Либо, вы можете просто скачать исполняемый файл последней версии из репозитория проекта.

В качестве другого решения вы можете использовать fvm как глобально действующий dart-пакет, установив его простой командой:

dart pub global activate fvm

Большинство статей, на которые я наталкивался, советуют делать именно так (мы же flutter dev!?), однако данный способ уже не рекомендуется (на официальном уровне), потому что будет возникать вот такая милая ошибочка – Running a globally activated binary after SDK upgrade - Can't load Kernel binary: Invalid SDK hash. Это происходит потому, что в момент изменения глобальной версии flutter происходит изменение встроенной версии dart, на которую и опирается snapshot данного пакета. И нет никаких гарантий того, что VM новой версии dart захочет запустить snapshot, сделанный старой версией dart.

Поэтому смело устанавливаем первым способом и движемся дальше.

Команды

Посмотрим на имеющиеся команды с помощью простого запуска fvm из командной строки:

Available commands:
  config     Set configuration for FVM
  dart       Proxies Dart Commands
  destroy    Destroy FVM cache by deleting FVM directory
  doctor     Shows information about environment, and project configuration.
  exec       Executes scripts with the configured Flutter SDK
  flavor     Switches between different project flavors
  flutter    Proxies Flutter Commands
  global     Sets Flutter SDK Version as a global
  install    Installs Flutter SDK Version
  list       Lists installed Flutter SDK Versions
  releases   View all Flutter SDK releases available for install.
  remove     Removes Flutter SDK Version
  spawn      Spawns a command on a Flutter version
  use        Sets Flutter SDK Version you would like to use in a project

Доступно 14 великолепных команд, каждую из которых мы рассмотрим детально, используя микроскоп (gh repo clone fluttertools/fvm) периодически :)

Частые

Чаще всего вы будете использовать следующие команды:

  • fvm install <version> – позволяет скачать и закэшировать определённую версию/канал flutter sdk.

  • fvm dart – вызывайте команды dart sdk, встроенный в текущий flutter sdk. Это крайне полезно, если необходимо иметь доступ к командам dart sdk, таким как:

    • dart run build_runner build, dart pub upgrade, dart migrate, dart fix —apply, dart create, dart test и прочим;

  • fvm flutter – представляет оригинальные команды из flutter sdk, такие как flutter build, flutter pub, flutter run и т.д.

  • fvm use <version> – используйте данную команду, чтобы к текущему проекту применить определенную flutter sdk версию. Это создаст папку .fvm в корне проекта с символической ссылкой на flutter sdk и файл fvm_config.json с текущей конфигурацией. Есть также некоторые полезные флаги:

    • --force, чтобы игнорировать предупреждения о том, что текущий проект не является flutter-проектом. Это может быть полезно в разных случаях, например, при использовании в dart-проекте или же, если вы хотите создать flutter-проект позже.

    • --pin, чтобы использовать именно последний релиз с канала. Например, fvm use stable --pin предложит скачать последнюю версию flutter sdk с канала stable (если она ещё не закэширована) и будет использовать именно её в данном проекте.

    • --flavor позволяет использовать разные версии sdk для разных релизов. Собственно, логика похожа на "ароматы", представленные во flutter. Чтобы выбрать определённую версию flutter sdk для конкретного "аромата" делаем так:

      • fvm use <version> --flavor <flavor_name> и после нескольких итераций мы имеем такой конфиг-файл:

{
  "flutterSdkVersion": "stable",
  "flavors": {
    "dev": "beta",
    "staging": "2.0.3",
    "prod": "1.22.6"
  }
}

И теперь, когда нам понадобится определённый "аромат", мы делаем так:

  • fvm flavor staging, что переключает данный проект на использование flutter sdk версии 2.0.3

Редкие

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

  • fvm global – установить данную версию в качестве default-версии. Это означает, что когда вы будете находиться НЕ в проекте и вызывать fvm flutter <command>, то будет использоваться именно эта глобальная версия. Эту опцию автор пакета в будущем хочет объявить в качестве устаревшей ИЛИ включить в качестве экспериментальной по ряду причин.

  • fvm list – просмотр всех кэшированных версий flutter sdk. Это крайне удобно сделать перед тем, как использовать команду fvm use, чтобы случайно не загрузить лишнюю версию (хотя и есть предупреждение на установку) или же, если имеется кастомная версия со сложным названием.

  • fvm releases – посмотреть все доступные выпуски для установки. Признаюсь честно, это может выглядеть крайне запутанным, быть может из-за того, что dev канал был недавно закрыт.

  • fvm destroy – удалятся все кэшированные версии flutter sdk и сама директория fvm.

  • fvm remove – возможность удалить конкретный кэшированный выпуск. То есть пишем команду fvm remove <version> и происходит удаление sdk. Есть также флаг --force, чтобы пропустить проверку "Установлена ли данная версия в качестве глобальной".

Эпизодические

И есть ещё более редкие команды, которые я рассмотрю, чтобы сделать данное руководство наиболее полным:

  • fvm exec – позволяет выполнить произвольную команду flutter cli из найденной рядом версии flutter sdk (лежащей в директории .fvm/flutter_sdk/bin). Частая ситуация, когда необходимо выполнить какой-либо скрипт из под текущей версии flutter. Например, у вас лежит скрипт generate_secrets.sh. Теперь обзор двух вариантов того, как мы можем это сделать:

  • обычным образом:

PATH="$(pwd)/.fvm/flutter_sdk/bin:$PATH" ./generate_secrets.sh
  • с помощью exec:

fvm exec ./generate_secrets.sh

Некоторую дополнительную информацию вы можете найти в этом issue, который завершился внедрением данной функциональности: [Feature Request] fvm exec.

  • fvm spawn <version> – выполнить определённую команду в flutter cli для конкретной версии flutter sdk. Это сильно похоже на обычное проксирование команд с помощью fvm flutter за тем исключением, что мы сами выбираем версию sdk, на которой будем выполнять команду. Примеры:

fvm spawn 3.10.6 test
fvm spawn 3.13.0-0.3.pre test
fvm spawn 2.10.5 analyze
  • fvm config – работа с конфигурационным файлом fvm. В данный момент этот файл называется .settings (почему бы не назвать его settings.json? Намёк на то, чтобы ручками не лазили? ) и находится по пути домашнего каталога (USERPROFILE для windows пользователей, HOME для unix). Доступные флаги:

    • --cache-path – указать путь, где будут лежать ваши кэшированные версии flutter sdk. Это будет иметь приоритет над переменной окружения FVM_HOME, которую мы можем установить в переменные среды и, согласно которой путь будет %USERPROFILE%/fvm/versions/.

    • --[no-]skip-setup – можно пропустить настройку flutter sdk, лишь скачав её дистрибутив (под капотом это подразумевает, что мы пропускаем запуск команды flutter --version)

    • --[no-]git-cache – кэширует локальную версию репозитория Flutter для более быстрой загрузки

  • fvm doctor – если команда запускается не из под проекта, то мы увидим конфигурацию переменных окружения: пути Flutter, Dart , FVM_HOME, FVM_GIT_CACHE (установка данной переменной позволяет использовать свой flutter репозиторий, будь-то форк или локальный кэш). При запуске из-под проекта дополнительно получим название текущего проекта, полный путь до проекта, используемую версию flutter sdk и настройку flavor'ов + настроенные пути к flutter sdk в IDE. Есть подсказки, когда всё ещё только предстоит настроить.

Стоит отметить, что официальная документация (ровно как и документация кода) слабенькая, непоследовательная, неполноценная, частенько очевидно-избыточная (ужимка ради 96.2% dartdoc comments?) и всё в том самом духе с приставкой не. Плюс малоинформативное readme.md, что в большей степени компенсируется отдельным gh-pages сайтом fvm.app/docs, однако и тот сильно упрощён и отрывочен. Короче, opensource, все всё понимают, и данный абзац не хочет цинично уничтожить труды контрибьютеров и уважаемого Leo Farias, а лишь подчёркивает данный изъян для любителей форкнуть, разобраться самостоятельно и внести вклад. И тут я поспешу вас обрадовать, потому что сам код более чем понятный и структурированный. Быть может, нам дано увидеть наяву практику "Самодокументируемый Код" от известного дядюшки?

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

Применение

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

В системе

Скачиваем дистрибутив (или помним о brew и choco) и размещаем его в своей любимой папочке с тулзами. Весь дистрибутив выглядит так (fvm-2.4.1-windows-x64.zip):

fvm
└─fvm.bat
└─src
  └─dart.exe
  └─fvm.snapshot
  └─LICENSE

Так как скоро fvm global станет устаревшей командой, установите flutter sdk глобально согласно официальной инструкции. В моём случае глобально установлена stable-ветка flutter sdk. Это предполагает, что мы выделим отдельную папочку для stable, а fvm будем использовать исключительно для управления версиями проектов.

Ага и ахах, как бы не так. В реальности мои env-пути выглядят вот так (если будете так делать, то располагайте пути обязательно именно в этом порядке – да, я просто развожу руками от том, что здесь всё "вот-так" и мы обретаем зависимость от единственно-верного расположения путей, но тем самым предостерегаю вас от потраченного времени на отладку):

Папка default здесь это символическая ссылка на реальную версию flutter sdk. И это прекрасно работает, как и ожидается, в том числе и из-под терминала Android Studio. Вот пруф из обычной консоли:

Это позволяет проверять самые различные гипотезы быстро и надёжно, даже не будучи в данный момент в проекте с настроенной папочкой .fvm – из любого места, о чём далее и пойдёт речь.

Добавляем путь к файлу fvm.bat в переменные среды > переменная Path > C:\...\tools\fvm\fvm.bat и теперь обязательно перезапустите вашу консоль (или IDE), чтобы изменения вступили в силу. Поздравляю, доступ к fvm имеется повсюду.

Теперь необходимо указать путь к FVM_HOME в переменных средах, при чём именно сейчас, так как иначе после он будет создан автоматически по пути домашнего каталога, а мы хотим всё хранить там же, где хранятся наши flutter sdk. Ну, по крайне мере, я так хочу. Если вы не я, пропустите этот шаг :)

Далее, настроим конфиг fvm – для этого вызываем команду fvm config (не забудьте ввести свой путь до места, где будут храниться ваши flutter sdk):

fvm config --no-skip-setup --git-cache --cache-path=C:\<YOUR_PATH>\sdk\flutter\v\

Теперь самое время установить (то есть закэшировать) вашу первую версию flutter sdk. Делаем вот так (вы также можете установить конкретную ревизию, указав git-коммит или короткий хэш):

fvm install 3.10.6

Поздравляю ????, вы поставили свою первую версию и теперь можно убедиться, что всё в порядке выполнив команду doctor:

fvm doctor

К этому моменту мы имеем следующее строение папок:

C:\<YOUR_PATH>\sdk\flutter\
└─default\  # символическая ссылка на версию, только если вы использовали fvm global <version>
└─v
| └─3.10.6\
└─.settings

На этом благостном этапе, утирая нос всем завистникам с 4к монитора капли возмущений некоторой замороченности установки fvm, мы гордо идём в любимую uiшечку, дабы опробовать новоиспечённое чудо.

В IDE

Мы в нужном flutter-проекте (пусть это будет my_project), где теперь можно смело использовать команду fvm use. Однако перед этим я настойчиво рекомендую убедиться в том, какими версиями мы располагаем:

fvm list

Скопировав из этого списка нужную версию, выполняем команду:

fvm use 3.10.6

Что создаст папку .fvm в корне:

my_project
└─.fvm
  └─flutter_sdk # символическая ссылка
  └─fvm_config.json # конфигурация проекта

Поздравляю снова ????, вам доступны все команды fvm в данном проекте, но пока что сама IDE не использует все доступные преференции. Настроим и это.

По большому счёту, всё сводится к одной цели – указать путь к символической папке нашего flutter sdk.

В Android Studio

  1. Перейдите в раздел File > Settings... > Languages & Frameworks > Flutter и установите Flutter SDK Path на полный путь вида C:\my_project\.fvm\flutter_sdk. Терпеливо ждём и нажимаем Apply.

  2. В разделе Languages & Frameworks > Dart установите полный путь до dart sdk C:\my_project\.fvm\flutter_sdk\bin\cache\dart-sdk, если это необходимо. Уже на этих этапах может произойти неприятная вещь, согласно которой версия подтягиваться не захочет. Вероятнее всего, вы просто ранее не завершили установку flutter sdk. Это могло произойти из-за ручного перемещения flutter sdk в папку с кэшированными версиями или же установка с флагом fvm install --skip-setup. Просто выполните команду fvm flutter --version из под проекта, и ошибка пройдёт.

  3. Перезагрузите ide (древнее правило "просто перезагрузи" для ремонта любых вещей ????).

Поздравляю в очередной раз, вы можете запускать любые встроенные в IDE команды, касающиеся flutter, а из терминала не забывайте использовать приставку fvm, как fvm flutter ..., fvm dart ... и т.д.

????Бонус: чтобы всякий раз при запуске не индексировалась папка .fvm/flutter_sdk, вы можете её исключить. Для этого перейдите File > Settings... > Editor -> File Types -> Ignored Files and Folders и добавьте flutter_sdk. Папка также будет скрыта из ide.

В VS Code

Тут даже пункты не понадобятся. Просто добавьте файл (если его ещё нет) по пути .vscode/settings.json и напишите следующее:

{
  "dart.flutterSdkPath":".fvm/flutter_sdk",
  "search.exclude":{
    "**/.fvm":true
  },
  "files.watcherExclude":{
    "**/.fvm":true
  }
}

Хотя тут также может потребоваться перезагрузка ide.

GUI

Да-да, вы не ослышались, ведь под fvm есть приложение с графическим дизайном. Называется оно Sidekick – для тех, кто предпочитает интерфейсы консольным приложениям. Ниже представлен скриншот, взятый из официального репозитория:

Написано на flutter, менеджер состояния Riverpod версии 2, хранилище – hive. Частенько используются хуки в виджетах. Скажу так – задумка прекрасная, но приложение всё ещё малофункциональное. Далее, разговор исключительно про версию 1.1.1.

Что хочется, а нельзя:

  • нельзя использовать специфические версии flutter sdk для проектов – issue #242

  • нет возможности указать свой путь для кэшированных версий

  • нет кнопки отмены загрузки

  • нет возможности настроить flavor для проекта

  • хочется увидеть больше информации о проекте (иконка, версия, ограничения sdk) – например, issue #298

Ошибки, которые раздражают уже долгое время:

  • бесконечная загрузка при запуске приложения – issue #297, или даже просто белый экран

  • предлагает обновить flutter sdk на старую версию, вместо новой – issue #269 или даже вообще отказывается обновлять – issue #280

Ранее я ещё мог запустить sidekick, но сейчас при запуске белый экран, и, честно говоря, нет желания в этом разбираться.

Шучу, есть конечно. Если у вас есть время, вы можете прочитать следующий мини-детектив, иначе, это можно пропустить, так как отношение к данной статьи это имеет посредственное.

Мини-расследование

Естественно я склонировал репозиторий и попытался запуститься под windows с main ветки (если что, номер ревизии – 5cb956c5bce37fae0df1ab3311465fe69d67168e) – снова белый экран. [Hot restart] – запустилось. Чееегоо??

Ладно, вспоминая молодость и лазая по разделам в попытках найти новую функциональность за прошедшее время, обнаружил, что изменений то и нет. Решил сделать [Hot restart] – опять всё плохо, только на этот раз зависший значок загрузки. Блен, он реально завис.

Консоль молчит.

На этом этапе я понял, что код уже не обойдётся без моего неодобрительного взгляда, и зашёл в main:

Да, отличная обработка ошибок. Добавляю catch (e, s) {print(e); print(s);}. Ничего. Добавляю FlutterError.onError. Ничего. Добавляю PlatformDispatcher.instance.onError. Снова ничего. Далее, что я пробовал делать:

  • добавил принты во все места, где ошибка игнорировалась

  • потыкал этот самый FVMScreen; понял, что данные приходят

  • заменил виджет на просто Scaffold

  • пошёл изучать releasesStateProvider, который отвечает за данные, которые этот экран отображает. Выглядит он ужасно; может лучше отдельный класс, расширяющийся от StateNotifier<AsyncValue<AppReleasesState>> (современного AsyncNorifier тогда ещё не было) c логико-разделёнными методами? Неее, зачем. Я даже не прошу хотя бы sealed классы сделать с помощью freezed, чтобы AppReleasesState был иммутабельным и с состояниями. Ладно, проехали. Проверка показала, что данный провайдер работает, данные поставляет.

кусочки кода для изучения

В итоге – то работает, то не работает. Просто жмём Hot Restart и каждый раз ????. При чём данные приходят, провайдер корректно обновляется. Вероятно, проблема в одном из пакетов для корректировки окна. На этом критика обзор завершен, ибо итак этому уделено слишком много времени.

В конце подчеркну некоторые удобства использования ui-версии fvm (в скобках указаны команды из fvm, чтобы получить аналогичный результат):

  • раздел с установленными версиями с разными возможностями (fvm list + fvm global + fvm flutter upgrade + fvm remove), но, как я уже говорил ранее, не видит специфически-именованные версии. Есть кнопка "удалить неиспользуемые версии flutter sdk", основываясь на разделе имеющихся проектов;

  • полезная информация о каждой версии sdk (жаль только, что релизные заметки не получается внедрить): дата релиза + расположение кэша + прямая ссылка на скачивание + hash|sha256 с функцией копирования. Есть возможность открыть проект в выбранной ide одним щелчком;

  • список всех релизов в удобной форме с возможностью сортировки по каналу и возможностью установки (fvm releases + fvm install);

  • раздел ваших flutter-проектов, где вы можете в два клика сменить flutter sdk (fvm use). Также существует Playground-режим с командной строкой и возможностью позапускать dart|flutter команды для текущего проекта от определённой версии flutter sdk (условно fvm spawn). Удобно.

  • в настройках можно отключить аналитику (flutter config --[no-]analytics) сразу для всех свежеустанавливаемых версий flutter sdk и также изменить плашки для поддерживаемых платформ (flutter config --[no-]enable-web и коллеги);

  • есть локализация (доступно 22 языка);

  • для тех, кто предпочитает интерфейс вместо консоли.

Полезные советы

Подборка полезных решений на все случаи жизни, о которых я должен написать:

  • использование для dart-проектов всё ещё под вопросом. Однако, я делаю это так – устанавливаю необходимую версию flutter sdk (который содержит нужную мне версию dart sdk) и использую .fvm\flutter_sdk\bin\cache\dart-sdk в проекте. Да, решение крайне сомнительное, но в целом, вполне удобное, поскольку часто достаточно последней версии flutter со stable канала. Так, например, я использую последнюю dart-версию до dart 3, просто установив flutter sdk 3.7.12, который содержит dart sdk 2.19.6.

  • иногда релиз может существовать в нескольких каналах сразу. Например, flutter sdk версии 2.5.0 есть на стабильном и бета каналах. FVM будет определять приоритет канала по стабильности, т.е. Stable > Beta, и выберет версию из стабильного канала. Если же по какой-то причине вам нужна версия именно из беты, то сделайте так fvm install 2.5.0@beta .

  • обратите внимание на полезные инструменты вроде:

  • если вы переходите на fvm и у вас уже есть какие-либо flutter sdk, то рекомендую их не просто закинуть в папку со всеми версиями, но и выполнить для каждого закинутого sdk команду fvm spawn <version> --version . Перед этим убедитесь, что они отображаются через fvm list. Это поможет в дальнейшем избежать проблем при указании путей в вашей IDE;

  • чтобы не набирать каждый раз команду fvm list для последующего использования скопированной версии в команде fvm use <скопированная_версия> вы можете просто вызвать fvm use . Затем последует предложение выбрать версию из списка. К моему большому сожалению, это работает только если проект ранее не использовал fvm (то есть не содержал папку .fvm).

  • когда вы форкаете проект и в нём содержится папка .fvm, то достаточно просто выполнить команду fvm install и будет скачана и закэширована (если её ещё нет) версия flutter sdk, указанная в файлике .fvm/fvm_config.json;

Бонусная история

Здесь стоит начать повествование как в самых лучших заголовках той самой бесплатной газеты в вашем почтовом ящике, где проиллюстрированы истории бабушек и дедушек по очередному исцелению после употребления волшебных капель – "Когда я попробовал это, то обомлел...! Результаты повергли в шок!!!". На этот раз единственной командой я смог снести сразу все flutter sdk безвозвратно*. И вот как это повторить.

Просто введите команду fvm use . будучи находясь в проекте. Умная программа сразу о чём-то догадывается и торжественно принимает самовольное решение "снести" неисправное sdk. Пфф, всего-навсего просто удаляет ВСЕ кэшированные версии из вашей Cache Directory. На секундочку, в моём случае это 10гб отменных flutter sdk. Благо, у меня авто-бэкап всего и вся, поэтому всё обошлось ????. В любом другом случае ситуация сильно осложнится, если:

  • бэкапа нет

  • вы не запомнили, какие версии у вас хранились

  • sdk были кастомными

Ниже преднамеренная ситуация уставшего программиста в двух шагах:

  • вы создаёте новый проект командой flutter create .

  • потирая сонные глаза, выполняете команду fvm use .

Как говорится, берегите себя и свои данные. Делайте бэкапы.

Аналоги

Первое самое очевидное – скачивать вручную необходимые sdk архивы. Но удобства в этом мало, разве что на первых (и некоторых последующих) порах изучения dart | flutter действительно не стоит заморачиваться чем-то ещё. Если вы новичок, то просто доверьтесь течению времени – и необходимость придёт сама.

Puro

Второй вариант – Puro. Проект свежий, первый релиз датируется от 18 октября 2022. На мой взгляд, проект перспективный по ряду особенностей, заложенных автором в идею с самого начала – реализована дедупликация объектов, похожая на технологию GitLab по дедупликации объектов Git.

 Используем глобальный кэш для истории git и для версий движка (символические ссылки на одну и ту же версию), вместо постоянной загрузки всего для каждой версии flutter sdk, и таким образом избегаем повторной загрузки одних и тех же объектов git.
Используем глобальный кэш для истории git и для версий движка (символические ссылки на одну и ту же версию), вместо постоянной загрузки всего для каждой версии flutter sdk, и таким образом избегаем повторной загрузки одних и тех же объектов git.

И это даёт солидные преимущества по скорости работы и кэшированию выпусков. Если верить словам автора ПО, то приросты по скорости установки такие – первая установка происходит на 20% быстрее, а последующие установки на 50-95%:

Сверху – скорость установки flutter sdk, снизу – использование интернет-трафика.
Сверху – скорость установки flutter sdk, снизу – использование интернет-трафика.

При детальном ознакомлении я подметил ряд приятных особенностей:

  • умеет автоматически добавлять в PATH себя и flutter sdk, причём сообщит о конфликтующих путях;

  • puro может проверять обновления самого себя раз в день (это отключаемое поведение) и обновляться командой puro upgrade-puro;

  • мне очень нравится, как отображаются релизы через команду puro releases. 5 последних и 5 предыдущих мажорных релизов для каждого канала (stable и beta) + информация о версии dart sdk;

  • независим от flutter sdk и не конфликтует на этой почве;

  • автоматически настроит IDE (будь то Android Studio или VSCode) для работы с flutter и dart;

  • в целом список команд шире чем в fvm (есть даже eval) и имеет бóльшее число флагов для кастомизации.

В тот же момент нужно учитывать, что:

  • проект свежий, разработка ведётся силами одного разработчика

  • нет возможности контролировать dart-релизы (пока действуем по аналогии с fvm), issue #22

  • нет ui для тех, кому он важен

Инструмент – высокотехнологичный кастомизируемый самородок. Flutter сообщество пока что не очень знает о нём, и новый материал вот только-только начинает появляться. Сильное преимущество – меньшее использование интернет-трафика по сравнению с любыми другими вариантами. И если в ближайшем будущем интернет превратится в интранет, то этот вариант будет как раз кстати.

Ссылка на проект – https://github.com/pingbird/puro

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

Заключение

Благодарю вас за прочтение данного материала. Это был нелёгкий путь сквозь тернистые тропы мира версионирования, однако мы его прошли вместе. Ниже вы найдёте подборку полезных материалов для самостоятельного изучения.


Полезные ссылки

  1. Документация fvm – https://fvm.app/docs

  2. Репозиторий fvm – https://github.com/fluttertools/fvm

  3. Обсуждение судьбы проекта fvm – RFC: FVM Changes

  4. Setting up FVM (Flutter Version Management) properly

  5. Flutter Version Management (FVM) и с чем его едят

  6. FVM (Flutter Version Management) - An Easier Way To Maintain Flutter Versions

© 2023 Ruble

Комментарии (0)