Очень полезное дело и практика для лухури анны
Создать скрипт для автоматизации увеличения версии приложения
3 файла формата json (package.json, appCsp.json, appSahalin.json)
5 изменяемых полей:
package.json | appCsp.json и appSahalin.json |
---|---|
version | expo.version |
- | expo.ios.buildNumber |
- | expo.android.versionCode |
7 процессов:
- повышение версии в package
- повышение версии в appCsp
- повышение версии в appSahalin
- 4 команды, которые будут заменены после выполнения задания (задание 2):
print("build sahalin")
print("build csp")
print("bundle sahalin")
print("bundle csp")
Скрипт должен иметь имя update и принимать на вход ключ --build
или --bundle
и необязательный ключ --circuit
(далее ключ build, ключ bundle и необязательный ключ circuit).
При запуске скрипт просит выбрать одну из опций (patch, minor, major). В консоли это действие должно быть похоже на:
Повысить версию:
> patch
minor
major
Если присутствует ключ circuit, то дополнительно спрашивается:
Контур:
> csp
sahalin
Выбор происходит с помощью стрелки вверх или вниз (по-умолчанию выбор на первом элементе) и после нажатия на enter запускается скрипт. Т.e процесс запускается с ключом и опцией (опциями).
Сначала происходит увеличение версии (увеличение конкретного поля на один):
package
version | |
---|---|
до запуска | 2.1.0 |
patch | 2.1.1 |
minor | 2.2.0 |
major | 3.1.0 |
appCsp/appSahalin
Для appCsp/appSahalin поля одинаковые, однако при указании ключа circuit изменения работают соответственно для одного из файлов
expo.version (если указан ключ build или bundle) | expo.ios.buildNumber (если указан ключ build) | expo.android.versionCode (если указан ключ build) | |
---|---|---|---|
до запуска | 2.1.0 | 17 | "17" |
patch | 2.1.1 | 18 | "18" |
minor | 2.2.0 | 18 | "18" |
major | 3.1.0 | 18 | "18" |
если до запуска в файлах версии отличаются и при запуске не указан ключ circuit, то берется последняя версия(2.1.0 и 3.0.0 -> 3.0.0 | 2.3.0 и 2.2.6 -> 2.3.0 | "18" и "20" -> "20" | 21 и 23 -> 23) и далее манипуляции и запись в файл происходит уже исходя от нее.
buildNumber и versionCode с одинаковыми значениями, но с разными типами
Необходимо добавить функционал запуска команд. Команды выполняются последовательно. В зависимости от ключей скрипт запускает определенные задачи:
- Eсли указан ключ build, то запускает
print("build csp")
иprint("build sahalin")
- Eсли указан ключ build и circuit, то запускает
print("build csp")
илиprint("build sahalin")
- Eсли указан ключ bundle, то запускает
print("bundle csp")
иprint("bundle sahalin")
- Eсли указан ключ bundle и circuit, то запускает
print("bundle csp")
илиprint("bundle sahalin")
Далее выводится
Update info
sahalin: v0.0.0 | build 18
csp: v0.0.0 | build 18
Get builds https://expo.io/builds
build можно взять из поля buildNumber или versionCode
Желательно, но необязательно чтобы ссылка была спрятана в словах get builds
Для каждой команды и действия, которое может завершиться неудачей, сделать обработку исключения с последующей записью в файл лога. Например если не указан ключ build/bundle то записать в лог ошибку, что не указан ключ. Если выполняемая команда завершилась ошибкой, то записать ее также в лог(если это возможно отловить вообще)
Файл лога должен иметь название update.log и создаваться, если отсутствует в директории.
Необходимо записывать в файл лога вывод запущенной команды, имя команды (можно пока заглушку поставить), дату, те print("hello")
запишет в файл лога 2019-08-03 21:24:58,425 - commandName -> hello
.
Можно использовать модуль для логирования с похожим форматом записи. Просмотр файла лога в реальном времени необходимо запускать сразу после запуска скрипта.
Задание 1 - можно выводить после выполнения скрипта все значения, например:
Версии:
package:
version: <версия>
appCsp:
version: <версия>
buildNumber: <версия>
versionCode: <версия>
appSahalin:
version: <версия>
buildNumber: <версия>
versionCode: <версия>
Задание 2 - реализованный код сам покажет правильный вывод
Задание 3 - можно вместо print("bundle")
запустить процесс ping google.com
, начнется запись в файл вывод процесса и его просмотр, далее асинхронно запустить таймер, по истечению которого запуститься команда исключения, например raise Exception(<ошибка>)
(если это возможно реализовать)
Все задания можно выполнять любыми удобными средствами. Желательно оптимально использовать время и ресурсы, чтобы за минимальный промежуток времени выполнять задание максимально продуктивно