Skip to content

fix: fix release run for android #4677

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/controllers/build-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
7 changes: 2 additions & 5 deletions lib/controllers/deploy-controller.ts
Original file line number Diff line number Diff line change
@@ -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<void> {
const { liveSyncInfo, deviceDescriptors } = data;
public async deploy(data: IDeployData): Promise<void> {
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);
};
Expand Down
12 changes: 4 additions & 8 deletions lib/definitions/gradle.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,12 @@ interface IGradleCommandOptions {
spawnOptions?: ISpawnFromEventOptions;
}

interface IAndroidBuildConfig extends IRelease, IAndroidReleaseOptions, IHasAndroidBundle {
buildOutputStdio?: string;
}

interface IGradleBuildService {
buildProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise<void>;
cleanProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise<void>;
buildProject(projectRoot: string, buildData: IAndroidBuildData): Promise<void>;
cleanProject(projectRoot: string, buildData: IAndroidBuildData): Promise<void>;
}

interface IGradleBuildArgsService {
getBuildTaskArgs(buildConfig: IAndroidBuildConfig): string[];
getCleanTaskArgs(buildConfig: IAndroidBuildConfig): string[];
getBuildTaskArgs(buildData: IAndroidBuildData): string[];
getCleanTaskArgs(buildData: IAndroidBuildData): string[];
}
5 changes: 5 additions & 0 deletions lib/definitions/run.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ declare global {
deviceDescriptors: ILiveSyncDeviceDescriptor[];
}

interface IDeployData {
buildData: IBuildData;
deviceDescriptors: ILiveSyncDeviceDescriptor[];
}

interface IStopRunData {
projectDir: string;
deviceIdentifiers?: string[];
Expand Down
40 changes: 8 additions & 32 deletions lib/helpers/deploy-command-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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
});
}
Expand Down
33 changes: 10 additions & 23 deletions lib/helpers/livesync-command-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -117,6 +102,11 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper {
public async executeLiveSyncOperation(devices: Mobile.IDevice[], platform: string, additionalOptions?: ILiveSyncCommandHelperAdditionalOptions): Promise<void> {
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
Expand Down Expand Up @@ -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 };
}

Expand All @@ -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
});

Expand Down
14 changes: 7 additions & 7 deletions lib/services/android-project-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,16 +233,16 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
}

@performanceLog()
public async buildProject(projectRoot: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise<void> {
public async buildProject(projectRoot: string, projectData: IProjectData, buildData: IAndroidBuildData): Promise<void> {
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<void> {
return this.buildProject(projectRoot, projectData, buildConfig);
public async buildForDeploy(projectRoot: string, projectData: IProjectData, buildData?: IAndroidBuildData): Promise<void> {
return this.buildProject(projectRoot, projectData, buildData);
}

public isPlatformPrepared(projectRoot: string, projectData: IProjectData): boolean {
Expand Down Expand Up @@ -376,8 +376,8 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
return result;
}

public async cleanProject(projectRoot: string, projectData: IProjectData): Promise<void> {
await this.$gradleBuildService.cleanProject(projectRoot, { release: false });
public async cleanProject(projectRoot: string): Promise<void> {
await this.$gradleBuildService.cleanProject(projectRoot, <any>{ release: false });
}

public async cleanDeviceTempFolder(deviceIdentifier: string, projectData: IProjectData): Promise<void> {
Expand Down
28 changes: 14 additions & 14 deletions lib/services/android/gradle-build-args-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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}`
);
}

Expand All @@ -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;
}
Expand Down
10 changes: 5 additions & 5 deletions lib/services/android/gradle-build-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ export class GradleBuildService extends EventEmitter implements IGradleBuildServ
private $gradleCommandService: IGradleCommandService,
) { super(); }

public async buildProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise<void> {
const buildTaskArgs = this.$gradleBuildArgsService.getBuildTaskArgs(buildConfig);
public async buildProject(projectRoot: string, buildData: IAndroidBuildData): Promise<void> {
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,
Expand All @@ -21,8 +21,8 @@ export class GradleBuildService extends EventEmitter implements IGradleBuildServ
);
}

public async cleanProject(projectRoot: string, buildConfig: IAndroidBuildConfig): Promise<void> {
const cleanTaskArgs = this.$gradleBuildArgsService.getCleanTaskArgs(buildConfig);
public async cleanProject(projectRoot: string, buildData: IAndroidBuildData): Promise<void> {
const cleanTaskArgs = this.$gradleBuildArgsService.getCleanTaskArgs(buildData);
const gradleCommandOptions = { cwd: projectRoot, message: "Gradle clean..." };
await this.$gradleCommandService.executeCommand(cleanTaskArgs, gradleCommandOptions);
}
Expand Down
6 changes: 3 additions & 3 deletions lib/services/platform/prepare-native-platform-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -52,7 +52,7 @@ export class PrepareNativePlatformService implements IPrepareNativePlatformServi
return hasChanges;
}

private async cleanProject(platformData: IPlatformData, projectData: IProjectData, options: { release: boolean }): Promise<void> {
private async cleanProject(platformData: IPlatformData, options: { release: boolean }): Promise<void> {
// android build artifacts need to be cleaned up
// when switching between debug, release and webpack builds
if (platformData.platformNameLowerCase !== "android") {
Expand All @@ -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);
}
}
}
Expand Down
3 changes: 1 addition & 2 deletions lib/services/webpack/webpack.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<void>
cleanProject?(projectRoot: string): Promise<void>

/**
* Check the current state of the project, and validate against the options.
Expand Down
6 changes: 3 additions & 3 deletions test/services/android/gradle-build-args-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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", () => {
Expand Down Expand Up @@ -157,6 +157,6 @@ describe("GradleBuildArgsService", () => {
}
];

executeTests(testCases, (gradleBuildArgsService: IGradleBuildArgsService, buildConfig: IAndroidBuildConfig) => gradleBuildArgsService.getCleanTaskArgs(buildConfig));
executeTests(testCases, (gradleBuildArgsService: IGradleBuildArgsService, buildData: IAndroidBuildData) => gradleBuildArgsService.getCleanTaskArgs(buildData));
});
});
2 changes: 1 addition & 1 deletion test/stubs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ export class PlatformProjectServiceStub extends EventEmitter implements IPlatfor
async stopServices(): Promise<ISpawnResult> {
return Promise.resolve({ stderr: "", stdout: "", exitCode: 0 });
}
async cleanProject(projectRoot: string, projectData: IProjectData): Promise<void> {
async cleanProject(projectRoot: string): Promise<void> {
return Promise.resolve();
}
async checkForChanges(changesInfo: IProjectChangesInfo, options: any, projectData: IProjectData): Promise<void> {
Expand Down