Skip to content

Commit

Permalink
feat: add release build
Browse files Browse the repository at this point in the history
  • Loading branch information
rams23 committed Mar 5, 2023
1 parent 299fed7 commit 30333a5
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 38 deletions.
9 changes: 5 additions & 4 deletions src/application/androidUtils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import {getAppName, getRootDestinationFolder} from './utils'
import {getRootDestinationFolder} from './utils'

export function getAppBuildFolder(buildType?: string) {
// todo add debug
const appPath = `${getRootDestinationFolder()}/android/${buildType ? `${buildType}/` : ''}debug`
export function getAppBuildFolder(flavorName?: string, release?: boolean) {
const buildType = release ? 'release' : 'debug'

const appPath = `${getRootDestinationFolder()}/android/${flavorName ? `${flavorName}/` : ''}${buildType}`
return appPath
}
36 changes: 19 additions & 17 deletions src/application/buildAndroid.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
import path from 'path'
import {
executeCommand, executeCommandAsync,
executeCommand,
executeCommandAsync,
getApkToolExecutable,
getAppName,
getProjectRootDir,
getRootDestinationFolder,
getUberSignJava,
} from './utils'
import {getAndroidFlavors} from './config'
import {getAppBuildFolder} from './androidUtils'
import fs from 'fs'
import {findBestApkInFolder} from './runAndroid'
import {channelAWSDir} from 'oclif/lib/upload-util'

function capitalize(str: string) {
return str
return str;
}

async function rebuildIncrementallyTheApk(apkPath: string, bundleOutput: string, resOutput: string, tempAssetBundle: string) {
Expand Down Expand Up @@ -77,11 +75,10 @@ async function rebuildIncrementally(buildType: string | undefined) {
--dev false \
--entry-file index.js \
--bundle-output ${bundleOutput} \
--assets-dest ${resOutput}`, {cwd: getProjectRootDir()});

--assets-dest ${resOutput}`, {cwd: getProjectRootDir()})

await Promise.all(fs.readdirSync(getAppBuildFolder(buildType)).filter(f => f.endsWith('.apk')).map(async apkFileName => {
console.log(`rebuilding ${apkFileName}`);
console.log(`rebuilding ${apkFileName}`)
if (apkFileName.endsWith('.apk')) {
const apkPath = path.join(getAppBuildFolder(buildType), apkFileName)

Expand All @@ -91,33 +88,38 @@ async function rebuildIncrementally(buildType: string | undefined) {

}

export async function buildAndroid(buildType?: string, incrementalBuild: boolean = false) {
// todo improve flavor management with debug and release and no flavor usage
const buildFlavor = getAndroidFlavors(buildType)
function getBuildTask(gradleFlavor: string | undefined, release: boolean) {
const buildType = release ? 'Release' : 'Debug'
const gradleBuildTask = (gradleFlavor && gradleFlavor !== 'debug') ? `assemble${capitalize(gradleFlavor)}${buildType}` : `assemble${buildType}`
return gradleBuildTask
}

export async function buildAndroid(flavorName: string | undefined, incrementalBuild: boolean = false, release: boolean = false) {
const buildFlavor = getAndroidFlavors(flavorName)
if (!buildFlavor) {
throw new Error(`No android flavor found for ${buildType}`)
throw new Error(`No android flavor found for ${flavorName}`)
}
const {gradleFlavor} = buildFlavor

const androidFolder = path.join(getProjectRootDir(), 'android')
// todo handle Debug/release

if (incrementalBuild) {
// todo check previous build existance
// create a temp directory
await rebuildIncrementally(buildType)
await rebuildIncrementally(flavorName)

} else {
const gradleBuildTask = (gradleFlavor && gradleFlavor !== 'debug') ? `install${capitalize(gradleFlavor)}Debug` : 'installDebug'
const gradleBuildTask = getBuildTask(gradleFlavor, release)

executeCommand(`${androidFolder}/gradlew \
-Duser.dir=${androidFolder} \
app:${gradleBuildTask} \
`, {stdio: 'inherit'})

const destinationDir = getAppBuildFolder(buildType)
const destinationDir = getAppBuildFolder(flavorName, release)
const buildType = release ? 'release' : 'debug'
executeCommand(`rm -rf ${destinationDir} && mkdir -p ${destinationDir}`)
const destinationFlavorFolder = (gradleFlavor && gradleFlavor !== 'debug') ? `${gradleFlavor}/debug` : 'debug'
const destinationFlavorFolder = (gradleFlavor && gradleFlavor !== 'debug') ? `${gradleFlavor}/${buildType}` : buildType
const gradleOutputDir = `${androidFolder}/app/build/outputs/apk/${destinationFlavorFolder}/`
executeCommand(`cp -R ${gradleOutputDir} ${destinationDir}`)
}
Expand Down
32 changes: 15 additions & 17 deletions src/commands/build.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,47 @@
import {Args, Command, Flags} from '@oclif/core'
import {Command, Flags} from '@oclif/core'
import {buildIos} from '../application/buildIos'
import {buildAndroid} from '../application/buildAndroid'
import {getAppName} from '../application/utils'
import {iosBuildPlatforms} from '../application/iosUtils'
import logger from '../application/logger'

export default class Build extends Command {
static description = 'Create native builds for android and ios'

static examples = [
'<%= config.bin %> <%= command.id %> -i -f=dev',
'<%= config.bin %> <%= command.id %> -a -f=prod',
'<%= config.bin %> <%= command.id %> -all',
'<%= config.bin %> <%= command.id %> -a -f=prod --release',
'<%= config.bin %> <%= command.id %> -a --release',
'<%= config.bin %> <%= command.id %> -a --incremental',
]

static flags = {
ios: Flags.boolean({char: 'i', description: 'Generate ios native build'}),
android: Flags.boolean({char: 'a', description: 'Generate android native build'}),
all: Flags.boolean({description: 'Generate both ios and android native build'}),
flavor: Flags.string({char: 'f', description: 'Specify flavor to build'}),
release: Flags.boolean({description: 'Optimized release build'}),
incremental: Flags.boolean({char: 'I', description: 'Incremental build', default: false}),
}

static args = {
file: Args.string({description: 'file to read'}),
}

public async run(): Promise<void> {
const {args, flags} = await this.parse(Build)
const {flags} = await this.parse(Build)

const shouldBuildAndroid = flags.android ?? flags.all
const shouldBuildIos = flags.ios ?? flags.all
const shouldBuildAndroid = flags.android;
const shouldBuildIos = flags.ios;
const buildFlavor = flags.flavor
const release = flags.release;
const incremental = flags.incremental;

this.log('Build app', getAppName())
const start = performance.now();

if (shouldBuildIos) {
this.log('Build ios')
logger.info('Building ios app')
buildIos(buildFlavor, iosBuildPlatforms.simulator)
}
if (shouldBuildAndroid) {
this.log('Building android')
// build release and debug?
await buildAndroid(buildFlavor, flags.incremental)
logger.info('Building android')
await buildAndroid(buildFlavor, incremental, release)
}
this.log('Build finished in', (performance.now() - start) / 1000, 'seconds');
logger.info(`Build finished in ${(performance.now() - start) / 1000} seconds`);
}
}

0 comments on commit 30333a5

Please sign in to comment.