Handling standalone build versions with Expo is quite painful. I guess you guys may want to improve it.
TL;DR
Can I build a standalone with increased build number, without publishing the JS again?
Scenario
I want to use the same js code for ios and android. So, my steps to publish a new version:
- publish to prod-v1
exp build:ios --release-channel prod-v1 --no-publish
exp build:android --release-channel prod-v1 --no-publish
app.json example
{
"expo": {
"sdkVersion": "27.0.0",
"version": "1.4.2",
"ios": {
"buildNumber": "1.4.2",
},
"android": {
"versionCode": 14,
},
}
}
Problem
Assume I faced some error on ios standalone build when I am testing on Testflight. I just need to rebuild the same version to fix it. But if I rebuild it, I will face the “Redundant Binary Upload” error from Apple:
ERROR ITMS-4238: "Redundant Binary Upload. You’ve already uploaded a build with build number 'x.x.x' for version number 'x.x.x'.
So I need to increase my version number of iOS build. But when I increase it and rebuild, the edited app.json
is not used in the new build, because:
$ exp build:ios --release-channel prod-v1 --no-publish
20:34:11 [exp] Making sure project is set up correctly...
20:34:18 [exp] Your project looks good!
20:34:18 [exp] Checking if current build exists...
20:34:19 [exp] No currently active or previous builds for this project.
20:34:20 [exp] Using existing credentials for this build
20:34:20 [exp] Looking for releases...
20:34:21 [exp] Using existing release on channel "prod-v1":
publicationId: xxxxxxxxxxxx
publishedTime: xxxxxxxxxxxx
20:34:21 [exp] Building...
20:34:22 [exp] Build started, it may take a few minutes to complete.
20:34:22 [exp] You can monitor the build at
...
Note "Using existing release on channel “prod-v1"”. Normally if you publish it when building, it will use the local app.json
. Without publishing, it ignores the local one.
Maybe just publish JS bundle when building ios?
No. As of SDK v27, I have some logics on prompting the users to reload js if new version is downloaded. So if I publish when building ios standalone, the old android one (on Google Play) will always has a new JS version waiting for it (and prompt on every new download).
Solution:
- Increase version number
- Publish again
- Build both ios and android again
- Resubmit everything onto the store
Conclusion
This is driving me crazy because sometimes there are just some bug on Expo build server, for example this time with SDK v27 deployment. I uploaded the Android version and waited for iOS build service for a whole week to build it. And then to find out some building bug on Testflight. And then I need to put down my Android app on Google Play in order to have a new iOS build.
Please point out if I am doing wrong on something. If not, please see if the workflow can be improved. More specifically, standalone build config should not depend on the published app.json
.