diff --git a/lib/common b/lib/common index 3aefd62e53..b948847b2c 160000 --- a/lib/common +++ b/lib/common @@ -1 +1 @@ -Subproject commit 3aefd62e53bccf12c00814d3e954929dabe4c8ba +Subproject commit b948847b2cb4f01f44b5c8a6fc61904161ffa046 diff --git a/lib/services/android-project-service.ts b/lib/services/android-project-service.ts index a3fb160f66..1401628ae0 100644 --- a/lib/services/android-project-service.ts +++ b/lib/services/android-project-service.ts @@ -4,6 +4,7 @@ import * as constants from "../constants"; import * as semver from "semver"; import * as projectServiceBaseLib from "./platform-project-service-base"; import { DeviceAndroidDebugBridge } from "../common/mobile/android/device-android-debug-bridge"; +import { attachAwaitDetach } from "../common/helpers"; import { EOL } from "os"; import { Configurations } from "../common/constants"; import { SpawnOptions } from "child_process"; @@ -257,13 +258,17 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject buildOptions.unshift("buildapk"); - this.$childProcess.on(constants.BUILD_OUTPUT_EVENT_NAME, (data: any) => { + const handler = (data: any) => { this.emit(constants.BUILD_OUTPUT_EVENT_NAME, data); - }); + }; - await this.executeGradleCommand(this.getPlatformData(projectData).projectRoot, buildOptions, - { stdio: buildConfig.buildOutputStdio || "inherit" }, - { emitOptions: { eventName: constants.BUILD_OUTPUT_EVENT_NAME }, throwError: true }); + await attachAwaitDetach(constants.BUILD_OUTPUT_EVENT_NAME, + this.$childProcess, + handler, + this.executeGradleCommand(this.getPlatformData(projectData).projectRoot, + buildOptions, + { stdio: buildConfig.buildOutputStdio || "inherit" }, + { emitOptions: { eventName: constants.BUILD_OUTPUT_EVENT_NAME }, throwError: true })); } else { this.$errors.failWithoutHelp("Cannot complete build because this project is ANT-based." + EOL + "Run `tns platform remove android && tns platform add android` to switch to Gradle and try again."); diff --git a/lib/services/ios-project-service.ts b/lib/services/ios-project-service.ts index 28957e0044..f68525d998 100644 --- a/lib/services/ios-project-service.ts +++ b/lib/services/ios-project-service.ts @@ -5,6 +5,7 @@ import * as semver from "semver"; import * as xcode from "xcode"; import * as constants from "../constants"; import * as helpers from "../common/helpers"; +import { attachAwaitDetach } from "../common/helpers"; import * as projectServiceBaseLib from "./platform-project-service-base"; import { PlistSession } from "plist-merge-patch"; import { EOL } from "os"; @@ -180,7 +181,7 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ let projectRoot = this.getPlatformData(projectData).projectRoot; let archivePath = options && options.archivePath ? path.resolve(options.archivePath) : path.join(projectRoot, "/build/archive/", projectData.projectName + ".xcarchive"); let args = ["archive", "-archivePath", archivePath, "-configuration", - (!buildConfig || buildConfig.release) ? "Release" : "Debug" ] + (!buildConfig || buildConfig.release) ? "Release" : "Debug"] .concat(this.xcbuildProjectArgs(projectRoot, projectData, "scheme")); await this.$childProcess.spawnFromEvent("xcodebuild", args, "exit", { stdio: 'inherit' }); return archivePath; @@ -287,15 +288,21 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ // } // } - this.$childProcess.on(constants.BUILD_OUTPUT_EVENT_NAME, (data: any) => { + const handler = (data: any) => { this.emit(constants.BUILD_OUTPUT_EVENT_NAME, data); - }); + }; + if (buildConfig.buildForDevice) { - await this.buildForDevice(projectRoot, basicArgs, buildConfig, projectData); + await attachAwaitDetach(constants.BUILD_OUTPUT_EVENT_NAME, + this.$childProcess, + handler, + this.buildForDevice(projectRoot, basicArgs, buildConfig, projectData)); } else { - await this.buildForSimulator(projectRoot, basicArgs, projectData, buildConfig.buildOutputStdio); + await attachAwaitDetach(constants.BUILD_OUTPUT_EVENT_NAME, + this.$childProcess, + handler, + this.buildForSimulator(projectRoot, basicArgs, projectData, buildConfig.buildOutputStdio)); } - } public async validatePlugins(projectData: IProjectData): Promise { diff --git a/lib/services/local-build-service.ts b/lib/services/local-build-service.ts index fedaeb1ce9..f76b8ad6bc 100644 --- a/lib/services/local-build-service.ts +++ b/lib/services/local-build-service.ts @@ -1,21 +1,23 @@ import { EventEmitter } from "events"; import { BUILD_OUTPUT_EVENT_NAME } from "../constants"; +import { attachAwaitDetach } from "../common/helpers"; export class LocalBuildService extends EventEmitter { constructor(private $projectData: IProjectData, - private $platformService: IPlatformService) { + private $platformService: IPlatformService) { super(); } public async build(platform: string, platformBuildOptions: IPlatformBuildData, platformTemplate?: string): Promise { this.$projectData.initializeProjectData(platformBuildOptions.projectDir); await this.$platformService.preparePlatform(platform, platformBuildOptions, platformTemplate, this.$projectData, { provision: platformBuildOptions.provision, sdk: null }); - this.$platformService.on(BUILD_OUTPUT_EVENT_NAME, (data: any) => { + const handler = (data: any) => { data.projectDir = platformBuildOptions.projectDir; this.emit(BUILD_OUTPUT_EVENT_NAME, data); - }); + }; platformBuildOptions.buildOutputStdio = "pipe"; - await this.$platformService.buildPlatform(platform, platformBuildOptions, this.$projectData); + + await attachAwaitDetach(BUILD_OUTPUT_EVENT_NAME, this.$platformService, handler, this.$platformService.buildPlatform(platform, platformBuildOptions, this.$projectData)); return this.$platformService.lastOutputPath(platform, platformBuildOptions, this.$projectData); } } diff --git a/lib/services/platform-service.ts b/lib/services/platform-service.ts index 813e462754..1df21befb2 100644 --- a/lib/services/platform-service.ts +++ b/lib/services/platform-service.ts @@ -5,6 +5,7 @@ import * as helpers from "../common/helpers"; import * as semver from "semver"; import { EventEmitter } from "events"; import { AppFilesUpdater } from "./app-files-updater"; +import { attachAwaitDetach } from "../common/helpers"; import * as temp from "temp"; temp.track(); let clui = require("clui"); @@ -425,10 +426,13 @@ export class PlatformService extends EventEmitter implements IPlatformService { await this.trackActionForPlatform({ action: "Build", platform, isForDevice }); let platformData = this.$platformsData.getPlatformData(platform, projectData); - platformData.platformProjectService.on(constants.BUILD_OUTPUT_EVENT_NAME, (data: any) => { + const handler = (data: any) => { this.emit(constants.BUILD_OUTPUT_EVENT_NAME, data); - }); - await platformData.platformProjectService.buildProject(platformData.projectRoot, projectData, buildConfig); + this.$logger.printInfoMessageOnSameLine(data.data.toString()); + }; + + await attachAwaitDetach(constants.BUILD_OUTPUT_EVENT_NAME, platformData.platformProjectService, handler, platformData.platformProjectService.buildProject(platformData.projectRoot, projectData, buildConfig)); + let prepareInfo = this.$projectChangesService.getPrepareInfo(platform, projectData); let buildInfoFilePath = this.getBuildOutputPath(platform, platformData, buildConfig); let buildInfoFile = path.join(buildInfoFilePath, buildInfoFileName);