ДЛя начала нужно убедиться что в package.json указана версия, например
{
"name": "app",
"version": "2.0.4",
"private": true,
"dependencies": {
"react": "16.6.3",
"react-native": "0.57.8"
},
}
Android версия собирается с помощью gradle. Для автоматического присвоения номера версии, ужно добавить настройки в файл android/app/build.gradle.
В начале файла дописываем:
import groovy.json.JsonSlurper
def getNpmVersion() {
def inputFile = new File("../package.json")
def packageJson = new JsonSlurper().parseText(inputFile.text)
return packageJson["version"]
}
/* calculated from git commits to give sequential integers */
def getGitVersion() {
def process = "git rev-list master --first-parent --count".execute()
return process.text.toInteger()
}
def userVer = getNpmVersion()
def googleVer = getGitVersion()
Затем ищем секцию defaulConfig, в которой прописаны номера версий и меняем на:
defaultConfig {
...
// versionCode 18
// versionName "2.0.3"
versionCode googleVer
versionName userVer
...
}
Теперь код версии будет равен количеству коммитов в гите, а название версии подтянется из package.json
В Xcode нет gradle сборщика, но есть возможность выполнить скрипт, который бы выполнялся перед сборкой проекта.
Создадим скрипт
PROJECT_DIR="ios/app"
INFOPLIST_FILE="Info.plist"
INFOPLIST_DIR="${PROJECT_DIR}/${INFOPLIST_FILE}"
PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g' | tr -d '[[:space:]]')
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_DIR}")
BUILD_NUMBER=$(($BUILD_NUMBER + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${PACKAGE_VERSION#*v}" "${INFOPLIST_DIR}"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${INFOPLIST_DIR}"
Данный скрипт читает строку с номером версии из package.json, затем с помощью утилиты PlistBuddy записывает в файл Info.plist. Теперь нужно в xcode перейти на вкладку build phases нажать на кнопку добавления, скопировать скрипт и поставить перед фазой "Compile Sources".