From 8ebfe6ca44d9903a9fe1ee3af988c176b80d81cc Mon Sep 17 00:00:00 2001 From: fatme Date: Wed, 5 Jun 2019 08:28:56 +0300 Subject: [PATCH 1/2] refactor: remove IAndroidBuildConfig and use IAndroidBuildData instead --- lib/controllers/build-controller.ts | 2 +- lib/definitions/gradle.d.ts | 12 +++----- lib/services/android-project-service.ts | 14 +++++----- .../android/gradle-build-args-service.ts | 28 +++++++++---------- lib/services/android/gradle-build-service.ts | 10 +++---- .../prepare-native-platform-service.ts | 6 ++-- lib/services/webpack/webpack.d.ts | 3 +- .../android/gradle-build-args-service.ts | 6 ++-- test/stubs.ts | 2 +- 9 files changed, 39 insertions(+), 44 deletions(-) diff --git a/lib/controllers/build-controller.ts b/lib/controllers/build-controller.ts index 1818f6e564..a5e0bbf2f2 100644 --- a/lib/controllers/build-controller.ts +++ b/lib/controllers/build-controller.ts @@ -47,7 +47,7 @@ export class BuildController extends EventEmitter implements IBuildController { }); if (buildData.clean) { - await platformData.platformProjectService.cleanProject(platformData.projectRoot, projectData); + await platformData.platformProjectService.cleanProject(platformData.projectRoot); } const handler = (data: any) => { diff --git a/lib/definitions/gradle.d.ts b/lib/definitions/gradle.d.ts index aa6bdf6ac8..5e40bb1ed6 100644 --- a/lib/definitions/gradle.d.ts +++ b/lib/definitions/gradle.d.ts @@ -9,16 +9,12 @@ interface IGradleCommandOptions { spawnOptions?: ISpawnFromEventOptions; } -interface IAndroidBuildConfig extends IRelease, IAndroidReleaseOptions, IHasAndroidBundle { - buildOutputStdio?: string; -} - interface IGradleBuildService { - buildProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise; - cleanProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise; + buildProject(projectRoot: string, buildData: IAndroidBuildData): Promise; + cleanProject(projectRoot: string, buildData: IAndroidBuildData): Promise; } interface IGradleBuildArgsService { - getBuildTaskArgs(buildConfig: IAndroidBuildConfig): string[]; - getCleanTaskArgs(buildConfig: IAndroidBuildConfig): string[]; + getBuildTaskArgs(buildData: IAndroidBuildData): string[]; + getCleanTaskArgs(buildData: IAndroidBuildData): string[]; } diff --git a/lib/services/android-project-service.ts b/lib/services/android-project-service.ts index bfecc6f763..cea0b9ec23 100644 --- a/lib/services/android-project-service.ts +++ b/lib/services/android-project-service.ts @@ -233,16 +233,16 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject } @performanceLog() - public async buildProject(projectRoot: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise { + public async buildProject(projectRoot: string, projectData: IProjectData, buildData: IAndroidBuildData): Promise { const platformData = this.getPlatformData(projectData); - await this.$gradleBuildService.buildProject(platformData.projectRoot, buildConfig); + await this.$gradleBuildService.buildProject(platformData.projectRoot, buildData); - const outputPath = platformData.getBuildOutputPath(buildConfig); + const outputPath = platformData.getBuildOutputPath(buildData); await this.$filesHashService.saveHashesForProject(this._platformData, outputPath); } - public async buildForDeploy(projectRoot: string, projectData: IProjectData, buildConfig?: IBuildConfig): Promise { - return this.buildProject(projectRoot, projectData, buildConfig); + public async buildForDeploy(projectRoot: string, projectData: IProjectData, buildData?: IAndroidBuildData): Promise { + return this.buildProject(projectRoot, projectData, buildData); } public isPlatformPrepared(projectRoot: string, projectData: IProjectData): boolean { @@ -376,8 +376,8 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject return result; } - public async cleanProject(projectRoot: string, projectData: IProjectData): Promise { - await this.$gradleBuildService.cleanProject(projectRoot, { release: false }); + public async cleanProject(projectRoot: string): Promise { + await this.$gradleBuildService.cleanProject(projectRoot, { release: false }); } public async cleanDeviceTempFolder(deviceIdentifier: string, projectData: IProjectData): Promise { diff --git a/lib/services/android/gradle-build-args-service.ts b/lib/services/android/gradle-build-args-service.ts index e00f71d784..d2d50a8468 100644 --- a/lib/services/android/gradle-build-args-service.ts +++ b/lib/services/android/gradle-build-args-service.ts @@ -5,21 +5,21 @@ export class GradleBuildArgsService implements IGradleBuildArgsService { constructor(private $androidToolsInfo: IAndroidToolsInfo, private $logger: ILogger) { } - public getBuildTaskArgs(buildConfig: IAndroidBuildConfig): string[] { - const args = this.getBaseTaskArgs(buildConfig); - args.unshift(this.getBuildTaskName(buildConfig)); + public getBuildTaskArgs(buildData: IAndroidBuildData): string[] { + const args = this.getBaseTaskArgs(buildData); + args.unshift(this.getBuildTaskName(buildData)); return args; } - public getCleanTaskArgs(buildConfig: IAndroidBuildConfig): string[] { - const args = this.getBaseTaskArgs(buildConfig); + public getCleanTaskArgs(buildData: IAndroidBuildData): string[] { + const args = this.getBaseTaskArgs(buildData); args.unshift("clean"); return args; } - private getBaseTaskArgs(buildConfig: IAndroidBuildConfig): string[] { + private getBaseTaskArgs(buildData: IAndroidBuildData): string[] { const args = this.getBuildLoggingArgs(); const toolsInfo = this.$androidToolsInfo.getToolsInfo(); @@ -30,13 +30,13 @@ export class GradleBuildArgsService implements IGradleBuildArgsService { `-PgenerateTypings=${toolsInfo.generateTypings}` ); - if (buildConfig.release) { + if (buildData.release) { args.push( "-Prelease", - `-PksPath=${path.resolve(buildConfig.keyStorePath)}`, - `-Palias=${buildConfig.keyStoreAlias}`, - `-Ppassword=${buildConfig.keyStoreAliasPassword}`, - `-PksPassword=${buildConfig.keyStorePassword}` + `-PksPath=${path.resolve(buildData.keyStorePath)}`, + `-Palias=${buildData.keyStoreAlias}`, + `-Ppassword=${buildData.keyStoreAliasPassword}`, + `-PksPassword=${buildData.keyStorePassword}` ); } @@ -56,9 +56,9 @@ export class GradleBuildArgsService implements IGradleBuildArgsService { return args; } - private getBuildTaskName(buildConfig: IAndroidBuildConfig): string { - const baseTaskName = buildConfig.androidBundle ? "bundle" : "assemble"; - const buildTaskName = buildConfig.release ? `${baseTaskName}${Configurations.Release}` : `${baseTaskName}${Configurations.Debug}`; + private getBuildTaskName(buildData: IAndroidBuildData): string { + const baseTaskName = buildData.androidBundle ? "bundle" : "assemble"; + const buildTaskName = buildData.release ? `${baseTaskName}${Configurations.Release}` : `${baseTaskName}${Configurations.Debug}`; return buildTaskName; } diff --git a/lib/services/android/gradle-build-service.ts b/lib/services/android/gradle-build-service.ts index 499d5bd9ab..1f34367b5c 100644 --- a/lib/services/android/gradle-build-service.ts +++ b/lib/services/android/gradle-build-service.ts @@ -9,10 +9,10 @@ export class GradleBuildService extends EventEmitter implements IGradleBuildServ private $gradleCommandService: IGradleCommandService, ) { super(); } - public async buildProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise { - const buildTaskArgs = this.$gradleBuildArgsService.getBuildTaskArgs(buildConfig); + public async buildProject(projectRoot: string, buildData: IAndroidBuildData): Promise { + const buildTaskArgs = this.$gradleBuildArgsService.getBuildTaskArgs(buildData); const spawnOptions = { emitOptions: { eventName: constants.BUILD_OUTPUT_EVENT_NAME }, throwError: true }; - const gradleCommandOptions = { cwd: projectRoot, message: "Gradle build...", stdio: buildConfig.buildOutputStdio, spawnOptions }; + const gradleCommandOptions = { cwd: projectRoot, message: "Gradle build...", stdio: buildData.buildOutputStdio, spawnOptions }; await attachAwaitDetach(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, @@ -21,8 +21,8 @@ export class GradleBuildService extends EventEmitter implements IGradleBuildServ ); } - public async cleanProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise { - const cleanTaskArgs = this.$gradleBuildArgsService.getCleanTaskArgs(buildConfig); + public async cleanProject(projectRoot: string, buildData: IAndroidBuildData): Promise { + const cleanTaskArgs = this.$gradleBuildArgsService.getCleanTaskArgs(buildData); const gradleCommandOptions = { cwd: projectRoot, message: "Gradle clean..." }; await this.$gradleCommandService.executeCommand(cleanTaskArgs, gradleCommandOptions); } diff --git a/lib/services/platform/prepare-native-platform-service.ts b/lib/services/platform/prepare-native-platform-service.ts index 2e5ed21b88..253f3d189b 100644 --- a/lib/services/platform/prepare-native-platform-service.ts +++ b/lib/services/platform/prepare-native-platform-service.ts @@ -28,7 +28,7 @@ export class PrepareNativePlatformService implements IPrepareNativePlatformServi const hasChanges = hasModulesChange || hasConfigChange || hasChangesRequirePrepare; if (changesInfo.hasChanges) { - await this.cleanProject(platformData, projectData, { release }); + await this.cleanProject(platformData, { release }); } platformData.platformProjectService.prepareAppResources(projectData); @@ -52,7 +52,7 @@ export class PrepareNativePlatformService implements IPrepareNativePlatformServi return hasChanges; } - private async cleanProject(platformData: IPlatformData, projectData: IProjectData, options: { release: boolean }): Promise { + private async cleanProject(platformData: IPlatformData, options: { release: boolean }): Promise { // android build artifacts need to be cleaned up // when switching between debug, release and webpack builds if (platformData.platformNameLowerCase !== "android") { @@ -67,7 +67,7 @@ export class PrepareNativePlatformService implements IPrepareNativePlatformServi const { release: previousWasRelease } = previousPrepareInfo; const { release: currentIsRelease } = options; if (previousWasRelease !== currentIsRelease) { - await platformData.platformProjectService.cleanProject(platformData.projectRoot, projectData); + await platformData.platformProjectService.cleanProject(platformData.projectRoot); } } } diff --git a/lib/services/webpack/webpack.d.ts b/lib/services/webpack/webpack.d.ts index b0e5e56388..e6732c79b3 100644 --- a/lib/services/webpack/webpack.d.ts +++ b/lib/services/webpack/webpack.d.ts @@ -129,10 +129,9 @@ declare global { /** * Removes build artifacts specific to the platform * @param {string} projectRoot The root directory of the native project. - * @param {IProjectData} projectData DTO with information about the project. * @returns {void} */ - cleanProject?(projectRoot: string, projectData: IProjectData): Promise + cleanProject?(projectRoot: string): Promise /** * Check the current state of the project, and validate against the options. diff --git a/test/services/android/gradle-build-args-service.ts b/test/services/android/gradle-build-args-service.ts index 0a93c8ebdf..7c23bdb2cd 100644 --- a/test/services/android/gradle-build-args-service.ts +++ b/test/services/android/gradle-build-args-service.ts @@ -18,7 +18,7 @@ function createTestInjector(): IInjector { return injector; } -function executeTests(testCases: any[], testFunction: (gradleBuildArgsService: IGradleBuildArgsService, buildConfig: IAndroidBuildConfig) => string[]) { +function executeTests(testCases: any[], testFunction: (gradleBuildArgsService: IGradleBuildArgsService, buildData: IAndroidBuildData) => string[]) { _.each(testCases, testCase => { it(testCase.name, () => { const injector = createTestInjector(); @@ -102,7 +102,7 @@ describe("GradleBuildArgsService", () => { } ]; - executeTests(testCases, (gradleBuildArgsService: IGradleBuildArgsService, buildConfig: IAndroidBuildConfig) => gradleBuildArgsService.getBuildTaskArgs(buildConfig)); + executeTests(testCases, (gradleBuildArgsService: IGradleBuildArgsService, buildData: IAndroidBuildData) => gradleBuildArgsService.getBuildTaskArgs(buildData)); }); describe("getCleanTaskArgs", () => { @@ -157,6 +157,6 @@ describe("GradleBuildArgsService", () => { } ]; - executeTests(testCases, (gradleBuildArgsService: IGradleBuildArgsService, buildConfig: IAndroidBuildConfig) => gradleBuildArgsService.getCleanTaskArgs(buildConfig)); + executeTests(testCases, (gradleBuildArgsService: IGradleBuildArgsService, buildData: IAndroidBuildData) => gradleBuildArgsService.getCleanTaskArgs(buildData)); }); }); diff --git a/test/stubs.ts b/test/stubs.ts index 1d24713d9a..05964e8250 100644 --- a/test/stubs.ts +++ b/test/stubs.ts @@ -453,7 +453,7 @@ export class PlatformProjectServiceStub extends EventEmitter implements IPlatfor async stopServices(): Promise { return Promise.resolve({ stderr: "", stdout: "", exitCode: 0 }); } - async cleanProject(projectRoot: string, projectData: IProjectData): Promise { + async cleanProject(projectRoot: string): Promise { return Promise.resolve(); } async checkForChanges(changesInfo: IProjectChangesInfo, options: any, projectData: IProjectData): Promise { From dcd50ae842310e7a81fd5397207ebaa46ced0891 Mon Sep 17 00:00:00 2001 From: fatme Date: Wed, 5 Jun 2019 08:30:51 +0300 Subject: [PATCH 2/2] fix: pass correct keyStore* args when building in release mode --- lib/controllers/deploy-controller.ts | 7 ++--- lib/definitions/run.d.ts | 5 ++++ lib/helpers/deploy-command-helper.ts | 40 ++++++-------------------- lib/helpers/livesync-command-helper.ts | 33 +++++++-------------- 4 files changed, 25 insertions(+), 60 deletions(-) diff --git a/lib/controllers/deploy-controller.ts b/lib/controllers/deploy-controller.ts index 78d3aaeff8..7f572f3fd5 100644 --- a/lib/controllers/deploy-controller.ts +++ b/lib/controllers/deploy-controller.ts @@ -1,18 +1,15 @@ export class DeployController { constructor( - private $buildDataService: IBuildDataService, private $buildController: IBuildController, private $deviceInstallAppService: IDeviceInstallAppService, private $devicesService: Mobile.IDevicesService ) { } - public async deploy(data: IRunData): Promise { - const { liveSyncInfo, deviceDescriptors } = data; + public async deploy(data: IDeployData): Promise { + const { buildData, deviceDescriptors } = data; const executeAction = async (device: Mobile.IDevice) => { - const options = { ...liveSyncInfo, buildForDevice: !device.isEmulator }; - const buildData = this.$buildDataService.getBuildData(liveSyncInfo.projectDir, device.deviceInfo.platform, options); await this.$buildController.prepareAndBuild(buildData); await this.$deviceInstallAppService.installOnDevice(device, buildData); }; diff --git a/lib/definitions/run.d.ts b/lib/definitions/run.d.ts index 2fb421c716..3dfe93169a 100644 --- a/lib/definitions/run.d.ts +++ b/lib/definitions/run.d.ts @@ -7,6 +7,11 @@ declare global { deviceDescriptors: ILiveSyncDeviceDescriptor[]; } + interface IDeployData { + buildData: IBuildData; + deviceDescriptors: ILiveSyncDeviceDescriptor[]; + } + interface IStopRunData { projectDir: string; deviceIdentifiers?: string[]; diff --git a/lib/helpers/deploy-command-helper.ts b/lib/helpers/deploy-command-helper.ts index 40a78e01cd..2fa86c18c6 100644 --- a/lib/helpers/deploy-command-helper.ts +++ b/lib/helpers/deploy-command-helper.ts @@ -3,6 +3,7 @@ import { BuildController } from "../controllers/build-controller"; export class DeployCommandHelper { constructor( + private $buildDataService: IBuildDataService, private $buildController: BuildController, private $devicesService: Mobile.IDevicesService, private $deployController: DeployController, @@ -25,31 +26,18 @@ export class DeployCommandHelper { const deviceDescriptors: ILiveSyncDeviceDescriptor[] = devices .map(d => { - const buildConfig: IBuildConfig = { - buildForDevice: !d.isEmulator, - iCloudContainerEnvironment: this.$options.iCloudContainerEnvironment, - projectDir: this.$options.path, - clean: this.$options.clean, - teamId: this.$options.teamId, - device: this.$options.device, - provision: this.$options.provision, - release: this.$options.release, - keyStoreAlias: this.$options.keyStoreAlias, - keyStorePath: this.$options.keyStorePath, - keyStoreAliasPassword: this.$options.keyStoreAliasPassword, - keyStorePassword: this.$options.keyStorePassword - }; - - const buildAction = additionalOptions && additionalOptions.buildPlatform ? - additionalOptions.buildPlatform.bind(additionalOptions.buildPlatform, d.deviceInfo.platform, buildConfig, this.$projectData) : - this.$buildController.prepareAndBuild.bind(this.$buildController, d.deviceInfo.platform, buildConfig, this.$projectData); - const outputPath = additionalOptions && additionalOptions.getOutputDirectory && additionalOptions.getOutputDirectory({ platform: d.deviceInfo.platform, emulator: d.isEmulator, projectDir: this.$projectData.projectDir }); + const buildData = this.$buildDataService.getBuildData(this.$projectData.projectDir, d.deviceInfo.platform, { ...this.$options, outputPath, buildForDevice: !d.isEmulator }); + + const buildAction = additionalOptions && additionalOptions.buildPlatform ? + additionalOptions.buildPlatform.bind(additionalOptions.buildPlatform, d.deviceInfo.platform, buildData, this.$projectData) : + this.$buildController.prepareAndBuild.bind(this.$buildController, d.deviceInfo.platform, buildData, this.$projectData); + const info: ILiveSyncDeviceDescriptor = { identifier: d.deviceInfo.identifier, buildAction, @@ -62,20 +50,8 @@ export class DeployCommandHelper { return info; }); - const liveSyncInfo: ILiveSyncInfo = { - projectDir: this.$projectData.projectDir, - skipWatcher: !this.$options.watch, - clean: this.$options.clean, - release: this.$options.release, - env: this.$options.env, - timeout: this.$options.timeout, - useHotModuleReload: this.$options.hmr, - force: this.$options.force, - emulator: this.$options.emulator - }; - await this.$deployController.deploy({ - liveSyncInfo, + buildData: this.$buildDataService.getBuildData(this.$projectData.projectDir, platform, { ...this.$options, skipWatcher: !this.$options.watch }), deviceDescriptors }); } diff --git a/lib/helpers/livesync-command-helper.ts b/lib/helpers/livesync-command-helper.ts index 38500958d9..343e970e2e 100644 --- a/lib/helpers/livesync-command-helper.ts +++ b/lib/helpers/livesync-command-helper.ts @@ -62,31 +62,16 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper { // Now let's take data for each device: const deviceDescriptors: ILiveSyncDeviceDescriptor[] = devices .map(d => { - const buildConfig: IBuildConfig = { - buildForDevice: !d.isEmulator, - iCloudContainerEnvironment: this.$options.iCloudContainerEnvironment, - projectDir: this.$options.path, - clean: this.$options.clean, - teamId: this.$options.teamId, - device: this.$options.device, - provision: this.$options.provision, - release: this.$options.release, - keyStoreAlias: this.$options.keyStoreAlias, - keyStorePath: this.$options.keyStorePath, - keyStoreAliasPassword: this.$options.keyStoreAliasPassword, - keyStorePassword: this.$options.keyStorePassword - }; - const outputPath = additionalOptions && additionalOptions.getOutputDirectory && additionalOptions.getOutputDirectory({ platform: d.deviceInfo.platform, emulator: d.isEmulator, projectDir: this.$projectData.projectDir }); - const buildData = this.$buildDataService.getBuildData(this.$projectData.projectDir, d.deviceInfo.platform, { ...buildConfig, outputPath }); + const buildData = this.$buildDataService.getBuildData(this.$projectData.projectDir, d.deviceInfo.platform, { ...this.$options, outputPath, buildForDevice: !d.isEmulator }); const buildAction = additionalOptions && additionalOptions.buildPlatform ? - additionalOptions.buildPlatform.bind(additionalOptions.buildPlatform, d.deviceInfo.platform, buildConfig, this.$projectData) : + additionalOptions.buildPlatform.bind(additionalOptions.buildPlatform, d.deviceInfo.platform, buildData, this.$projectData) : this.$buildController.build.bind(this.$buildController, buildData); const info: ILiveSyncDeviceDescriptor = { @@ -117,6 +102,11 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper { public async executeLiveSyncOperation(devices: Mobile.IDevice[], platform: string, additionalOptions?: ILiveSyncCommandHelperAdditionalOptions): Promise { const { liveSyncInfo, deviceDescriptors } = await this.executeLiveSyncOperationCore(devices, platform, additionalOptions); + if (this.$options.release) { + await this.runInRelease(platform, deviceDescriptors, liveSyncInfo); + return; + } + await this.$runController.run({ liveSyncInfo, deviceDescriptors @@ -173,11 +163,6 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper { const deviceDescriptors = await this.createDeviceDescriptors(devices, platform, additionalOptions); const liveSyncInfo = this.getLiveSyncData(this.$projectData.projectDir); - if (this.$options.release) { - await this.runInRelease(platform, deviceDescriptors, liveSyncInfo); - return; - } - return { liveSyncInfo, deviceDescriptors }; } @@ -190,8 +175,10 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper { sdk: this.$options.sdk }); + const buildData = this.$buildDataService.getBuildData(liveSyncInfo.projectDir, platform, { ...this.$options, clean: true, skipWatcher: true }); + await this.$deployController.deploy({ - liveSyncInfo: { ...liveSyncInfo, clean: true, skipWatcher: true }, + buildData, deviceDescriptors });