AutoVer: pubspec.yaml 버전업 자동화

ENOOSOFT·2024년 8월 24일

flutter build bundle 하기전에 자동으로 pubspec.yaml 파일의 앱 버전을 올려주는 유틸리티.

보통 릴리즈 할때 버전을 올린다. 버전을 올리지 않고 빌드하면 스토어에서 버전코드 중복이라는 귀찮은 메시지를 보게 된다. 그래서 작은 유틸리티를 만들었다.

1. 동작방식

  • pubspec.yaml 파일을 읽어 현재 버전명의 Patch 코드와 Build Number 를 가져온다
  • Patch num. & Build num. 을 1씩올리고 저장한다.
  • dart run autover.dart 로 실행하면 올라간 버전을 확인할 수 있다.
// ignore_for_file: avoid_print
import 'dart:io';

void main() {
  incrementPubspecVersion();
}

int incrementPubspecVersion() {
  final pubspecFile = File('pubspec.yaml');
  final lines = pubspecFile.readAsLinesSync();

  // find version line
  final versionIndex = lines.indexWhere((line) => line.startsWith('version:'));

  if (versionIndex == -1) {
    print('No version found in pubspec.yaml');
    return 1;
  }

  final versionLine = lines[versionIndex];
  final version = versionLine.split(' ').last.trim();

  // verson + buildNumber
  final parts = version.split('+');
  final versionNumber = parts[0];
  int versionNumberLast = 0;
  int buildNumber = 0;
  var versionNumbers = versionNumber.split(".");
  try {
    versionNumberLast = int.parse(versionNumbers.last);
    buildNumber = int.parse(parts[1]);
  } catch (ignored) {
    print('Invalid version or build numbe. set to 0');
  }
  // new version string
  final newVersion =
      '${versionNumbers.first}.${versionNumbers[1]}.${versionNumberLast + 1}+${buildNumber + 1}';

  lines[versionIndex] = 'version: $newVersion';

  // update pubspec.yaml file
  pubspecFile.writeAsStringSync(lines.join('\n'));

  print('pubspec version: $newVersion');
  return buildNumber + 1;
}

2. 사용

  • 아래와 같이 flutter build bundle shell 을 만들어 사용하고 있었다.
# flutterbuildbundle [package code] [mac or win]

cd ~/Workspace/flutter/$1
cp ~/Workspace/key/android/key.$2.properties ~/Workspace/flutter/$1/android/key.properties

flutter build appbundle --release
  • flutter build appbundle --release 직전에 project root 에 autover.dart 를 생성하고 실행한 후 build 하도록 한다.
  • full script
cd ~/Workspace/flutter/$1

cat > autover.dart <<EOF
// ignore_for_file: avoid_print
import 'dart:io';

void main() {
  incrementPubspecVersion();
}

int incrementPubspecVersion() {
  final pubspecFile = File('pubspec.yaml');
  final lines = pubspecFile.readAsLinesSync();

  // find version line
  final versionIndex = lines.indexWhere((line) => line.startsWith('version:'));

  if (versionIndex == -1) {
    print('No version found in pubspec.yaml');
    return 1;
  }

  final versionLine = lines[versionIndex];
  final version = versionLine.split(' ').last.trim();

  // verson + buildNumber
  final parts = version.split('+');
  final versionNumber = parts[0];
  int versionNumberLast = 0;
  int buildNumber = 0;
  var versionNumbers = versionNumber.split(".");
  try {
    versionNumberLast = int.parse(versionNumbers.last);
    buildNumber = int.parse(parts[1]);
  } catch (ignored) {
    print('Invalid version or build numbe. set to 0');
  }
  // new version string
  final newVersion =
      '\${versionNumbers.first}.\${versionNumbers[1]}.\${versionNumberLast + 1}+\${buildNumber + 1}';

  lines[versionIndex] = 'version: \$newVersion';

  // update pubspec.yaml file
  pubspecFile.writeAsStringSync(lines.join('\n'));

  print('pubspec version: \$newVersion');
  return buildNumber + 1;
}

EOF

dart run autover.dart

cp ~/Workspace/key/android/key.$2.properties ~/Workspace/flutter/$1/android/key.properties

flutter build appbundle --release  

참고) 버전코드의 구조

버전 1.0.1+1 구조는 소프트웨어 버전 번호를 나타내는 일반적인 형식이며, 각 자릿수는 다음과 같은 의미를 가집니다:

  • 1 (첫 번째 자릿수): 주요 버전 (Major Version) - 소프트웨어에 대한 주요 변경 사항이나 새로운 기능 추가를 나타냅니다. 주요 버전 변경은 이전 버전과의 호환성에 영향을 미칠 수 있습니다.
  • 0 (두 번째 자릿수): 부 버전 (Minor Version) - 소프트웨어에 대한 작은 변경 사항이나 개선 사항을 나타냅니다. 일반적으로 새로운 기능 추가보다는 기존 기능 개선이나 버그 수정에 중점을 둡니다. 이전 버전과의 호환성은 대부분 유지됩니다.
  • 1 (세 번째 자릿수): 패치 버전 (Patch Version) - 소프트웨어에 대한 중요한 버그 수정이나 보안 업데이트를 나타냅니다. 일반적으로 새로운 기능 추가는 없으며, 이전 버전과의 호환성을 유지하는 데 중점을 둡니다.
  • +1 (빌드 번호, Build Number) - 소프트웨어 빌드의 특정 인스턴스를 식별하는 데 사용됩니다. 일반적으로 개발 과정에서 소프트웨어가 빌드될 때마다 증가합니다. 동일한 주, 부, 패치 버전 내에서 여러 빌드가 존재할 수 있으며, 각 빌드는 특정 변경 사항이나 수정 사항을 포함할 수 있습니다.
profile
Tiny coder

0개의 댓글