Closed1

EAS で build number にタイムスタンプを使いたい

tsugittatsugitta
  • app.config.ts で buildNumber 等を埋めるのは Bare workflow + EAS では意味をなさない
  • 自動で書き換える仕組みとしては appVersionSource: remote にして autoIncrement: true として 1 ずつインクリメントするものしかなさそう
  • 適当な数値よりはタイムスタンプで埋めたい

とりあえず、実行すると Info.plist の build number をタイムスタンプで埋めるスクリプトを書いた

import fs from "fs/promises";

const dateToTimestamp = (date) => {
  return [
    date.getFullYear(),
    `${date.getMonth() + 1}`.padStart(2, "0"),
    `${date.getDate()}`.padStart(2, "0"),
    `${date.getHours()}`.padStart(2, "0"),
    `${date.getMinutes()}`.padStart(2, "0"),
    `${date.getSeconds()}`.padStart(2, "0"),
  ].join("");
};

const bundleVersion = dateToTimestamp(new Date());
const infoPlistPath = "ios/your-app/Info.plist";
const infoPlistContent = await fs.readFile(infoPlistPath, "utf-8");

await fs.writeFile(
  infoPlistPath,
  infoPlistContent.replace(
    /(<key>CFBundleVersion<\/key>\s*<string>).*(<\/string>)/,
    `$1${bundleVersion}$2`,
  ),
);

これが実行されればタイムスタンプ YYYYMMDDHHmmss が build number として埋まることとなる。
ただ eas-build-pre-install フック等で実行しても生成される ipa を見ると Info.plist の更新が確認できなかった。恐らく EAS build のその後の Configure Xcode project ステップで Info.plist が上書きされているのだと思われる。
そこで、Xcode の Build Phases のおよそ先頭に Run script を配置し、そこで実行するようにした。これにより意図通りの挙動が確認できた。

cd ..
node scripts/set-timestamp-to-build-number.mjs

ただ、 Expo のビルド一覧等に表示される build number は各種ステップ実行前に評価されるもののようで、そこと差が生じる点に注意が必要。

このスクラップは2022/10/18にクローズされました