Skip to content

Commit

Permalink
feat: handle ios build flavor from config
Browse files Browse the repository at this point in the history
  • Loading branch information
rams23 committed Feb 26, 2023
1 parent 24989c5 commit 10b1107
Show file tree
Hide file tree
Showing 6 changed files with 171 additions and 136 deletions.
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
"@oclif/plugin-plugins": "^2.3.2",
"@react-native-community/cli-platform-ios": "^10.2.0",
"axios": "^1.3.4",



"chalk": "^4.1.2",
"prompts": "^2.4.2"
},
Expand Down
86 changes: 36 additions & 50 deletions src/application/buildIos.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,27 @@
import path from "path";
import path from 'path'
import {executeCommand, getAppName, getProjectRootDir, getRootDestinationFolder} from './utils'
import {ux} from "@oclif/core";
import {ux} from '@oclif/core'
import {getIosBuildDestination, iosBuildPlatforms} from './iosUtils'
import {getIosFlavors} from './config'

const appName = getAppName();

const IOSBuildFlavors = {
dev: { scheme: appName, config: "Debug", flavorDir: "Debug" }
};

const iosBuildPlatforms = {
"simulator": {
"name": "iphonesimulator",
"ext": "app",
"buildCmd": "build"
},
"iphone": {
"name": "iphoneos",
"ext": "ipa",
"buildCmd": "archive"
}
};
const appName = getAppName()

function installPods() {
ux.debug('Pod install');
const iosFolder = path.join(getProjectRootDir(), "ios");
executeCommand("pod install", { cwd: iosFolder });
ux.debug('Pod install')
const iosFolder = path.join(getProjectRootDir(), 'ios')
executeCommand('pod install', {cwd: iosFolder})
}

function _buildIos(buildType: keyof typeof IOSBuildFlavors, platformName: keyof typeof iosBuildPlatforms) {
const iosFolder = path.join(getProjectRootDir(), "ios");
const workspacePath = path.join(iosFolder, `${appName}.xcworkspace`);
const buildFlavor = IOSBuildFlavors[buildType];
const platform = iosBuildPlatforms[platformName];
function _buildIos(buildType: string, platformName: keyof typeof iosBuildPlatforms) {
const iosFolder = path.join(getProjectRootDir(), 'ios')
const workspacePath = path.join(iosFolder, `${appName}.xcworkspace`)
const buildFlavor = getIosFlavors(buildType)
if (!buildFlavor) {
throw new Error(`No build flavor found for ${buildType}`)
}
const platform = iosBuildPlatforms[platformName]

const archivePath = `${iosFolder}/build/Products/${appName}.xcarchive`;
const archivePath = `${iosFolder}/build/Products/${appName}.xcarchive`

const buildCommand = `RCT_NO_LAUNCH_PACKAGER=true xcodebuild \
-workspace "${workspacePath}" \
Expand All @@ -43,36 +31,34 @@ function _buildIos(buildType: keyof typeof IOSBuildFlavors, platformName: keyof
-archivePath '${archivePath}' \
-derivedDataPath ${iosFolder}/DerivedData/${appName} \
${platform.buildCmd}
`;
`

console.log("Executing:", buildCommand);
executeCommand(buildCommand);
executeCommand(buildCommand)

if (platform.buildCmd === "build") {
const source = `${iosFolder}/DerivedData/${appName}/build/Products/${buildFlavor.flavorDir}-${platform.name}/${appName}.${platform.ext}`;
const destinationDir = `${getRootDestinationFolder()}/ios/${platform.name}/${buildType}`;
executeCommand(`mkdir -p ${destinationDir}`);
const destination = `${destinationDir}/${appName}.app`;
executeCommand(`rm -rf ${destination}`);
const copyCommand = `cp -a '${source}' '${destination}'`;
console.log(`Copying: ${copyCommand}`);
executeCommand(copyCommand);
return destination;
if (platform.buildCmd === 'build') {
const source = `${iosFolder}/DerivedData/${appName}/build/Products/${buildFlavor.flavorDir}-${platform.name}/${appName}.${platform.ext}`
const {destinationDir, destination} = getIosBuildDestination(platform, buildType);

executeCommand(`mkdir -p ${destinationDir}`)
executeCommand(`rm -rf ${destination}`)
const copyCommand = `cp -a '${source}' '${destination}'`
console.log(`Copying: ${copyCommand}`)
executeCommand(copyCommand)
return destination
} else { // archive
// todo
}

const generateIpaCommand = `xcodebuild -exportArchive \
const generateIpaCommand = `xcodebuild -exportArchive \
-archivePath '${archivePath}' \
-exportPath "${iosFolder}/build/Products/IPA" \
-exportOptionsPlist ${iosFolder}/${appName}/info.plist \
-allowProvisioningUpdates
`;
executeCommand(generateIpaCommand);
`
executeCommand(generateIpaCommand)
}

}

export function buildIos(buildType: keyof typeof IOSBuildFlavors, platformName: keyof typeof iosBuildPlatforms) {
installPods();
_buildIos(buildType, platformName);
export function buildIos(buildType: string, platformName: keyof typeof iosBuildPlatforms) {
installPods()
_buildIos(buildType, platformName)
}
51 changes: 51 additions & 0 deletions src/application/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import path from 'path'
import {getAppName, getProjectRootDir} from './utils'
import fs from 'fs'

const configFileName = 'rn-enginerc.json'

export type Config = {
ios: {
flavors: {
[key: string]: {
scheme: string;
config: string;
flavorDir: string;
}
}
}
}

function getDefaultConfig(): Config {
return {
ios: {
flavors: {
dev: {
scheme: getAppName(),
config: 'Debug',
flavorDir: 'Debug',
},
},
},
}
}

export function loadConfig() {
const configPath = path.join(getProjectRootDir(), configFileName)

if (fs.existsSync(configPath)) {
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'))
return config as Config
} else {
return getDefaultConfig()
}

}

const config = loadConfig()

export function getIosFlavors(flavorName:string) {
return config.ios.flavors[flavorName];
}

export default config
22 changes: 22 additions & 0 deletions src/application/iosUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import {getAppName, getRootDestinationFolder} from './utils'

export const iosBuildPlatforms = {
"simulator": {
"name": "iphonesimulator",
"ext": "app",
"buildCmd": "build"
},
"iphone": {
"name": "iphoneos",
"ext": "ipa",
"buildCmd": "archive"
}
};



export function getIosBuildDestination(platform: { ext: string; buildCmd: string; name: string }, buildType: string) {
const destinationDir = `${getRootDestinationFolder()}/ios/${platform.name}/${buildType}`
const destination = `${destinationDir}/${getAppName()}.${platform.ext}`
return {destinationDir, destination}
}
Loading

0 comments on commit 10b1107

Please sign in to comment.