From 249db303e258237479cd16b94c1349f2be65978b Mon Sep 17 00:00:00 2001 From: Darryl Pogue Date: Thu, 15 Sep 2016 16:58:21 -0700 Subject: [PATCH 1/4] CB-11860 - Update packaging strategy for Xcode 8 --- bin/templates/scripts/cordova/build | 1 + bin/templates/scripts/cordova/lib/build.js | 63 ++++++++++++++++------ 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/bin/templates/scripts/cordova/build b/bin/templates/scripts/cordova/build index f5b79353d4..133fd940aa 100755 --- a/bin/templates/scripts/cordova/build +++ b/bin/templates/scripts/cordova/build @@ -43,6 +43,7 @@ var buildOpts = nopt({ 'codeSignResourceRules': String, 'provisioningProfile': String, 'developmentTeam': String, + 'packageType': String, 'buildConfig' : String, 'noSign' : Boolean }, { '-r': '--release', 'd' : '--verbose' }, args); diff --git a/bin/templates/scripts/cordova/lib/build.js b/bin/templates/scripts/cordova/lib/build.js index a0d7668c97..ee03891fee 100644 --- a/bin/templates/scripts/cordova/lib/build.js +++ b/bin/templates/scripts/cordova/lib/build.js @@ -24,7 +24,8 @@ var Q = require('q'), shell = require('shelljs'), spawn = require('./spawn'), check_reqs = require('./check_reqs'), - fs = require('fs'); + fs = require('fs'), + plist = require('plist'); var events = require('cordova-common').events; @@ -54,7 +55,7 @@ module.exports.run = function (buildOpts) { var buildType = buildOpts.release ? 'release' : 'debug'; var config = buildConfig.ios[buildType]; if(config) { - ['codeSignIdentity', 'codeSignResourceRules', 'provisioningProfile', 'developmentTeam'].forEach( + ['codeSignIdentity', 'codeSignResourceRules', 'provisioningProfile', 'developmentTeam', 'packageType'].forEach( function(key) { buildOpts[key] = buildOpts[key] || config[key]; }); @@ -88,25 +89,35 @@ module.exports.run = function (buildOpts) { events.emit('log','\tConfiguration: ' + configuration); events.emit('log','\tPlatform: ' + (buildOpts.device ? 'device' : 'emulator')); - var xcodebuildArgs = getXcodeArgs(projectName, projectPath, configuration, buildOpts.device); + var xcodebuildArgs = getXcodeBuildArgs(projectName, projectPath, configuration, buildOpts.device); return spawn('xcodebuild', xcodebuildArgs, projectPath); }).then(function () { if (!buildOpts.device || buildOpts.noSign) { return; } - var buildOutputDir = path.join(projectPath, 'build', 'device'); - var pathToApp = path.join(buildOutputDir, projectName + '.app'); - var pathToIpa = path.join(buildOutputDir, projectName + '.ipa'); - var xcRunArgs = ['-sdk', 'iphoneos', 'PackageApplication', - pathToApp, - '-o', pathToIpa]; - if (buildOpts.codeSignIdentity) { - xcRunArgs.concat('--sign', buildOpts.codeSignIdentity); + + var exportOptions = {'compileBitcode': false, 'method': 'development'}; + + if (buildOpts.packageType) { + exportOptions.method = buildOpts.packageType; } - if (buildOpts.provisioningProfile) { - xcRunArgs.concat('--embed', buildOpts.provisioningProfile); + + if (buildOpts.developmentTeam) { + exportOptions.teamID = buildOpts.developmentTeam; } - return spawn('xcrun', xcRunArgs, projectPath); + + var exportOptionsPlist = plist.build(exportOptions); + var exportOptionsPath = path.join(projectPath, 'exportOptions.plist'); + + var buildOutputDir = path.join(projectPath, 'build', 'device'); + + function packageArchive() { + var xcodearchiveArgs = getXcodeArchiveArgs(projectName, projectPath, buildOutputDir, exportOptionsPath); + return spawn('xcodebuild', xcodearchiveArgs, projectPath); + } + + return Q.nfcall(fs.writeFile, exportOptionsPath, exportOptionsPlist, 'utf-8') + .then(packageArchive); }); }; @@ -143,7 +154,7 @@ module.exports.findXCodeProjectIn = findXCodeProjectIn; * @param {Boolean} isDevice Flag that specify target for package (device/emulator) * @return {Array} Array of arguments that could be passed directly to spawn method */ -function getXcodeArgs(projectName, projectPath, configuration, isDevice) { +function getXcodeBuildArgs(projectName, projectPath, configuration, isDevice) { var xcodebuildArgs; if (isDevice) { xcodebuildArgs = [ @@ -152,7 +163,8 @@ function getXcodeArgs(projectName, projectPath, configuration, isDevice) { '-scheme', projectName, '-configuration', configuration, '-destination', 'generic/platform=iOS', - 'build', + '-archivePath', projectName + '.xcarchive', + 'archive', 'CONFIGURATION_BUILD_DIR=' + path.join(projectPath, 'build', 'device'), 'SHARED_PRECOMPS_DIR=' + path.join(projectPath, 'build', 'sharedpch') ]; @@ -172,6 +184,25 @@ function getXcodeArgs(projectName, projectPath, configuration, isDevice) { return xcodebuildArgs; } + +/** + * Returns array of arguments for xcodebuild + * @param {String} projectName Name of xcode project + * @param {String} projectPath Path to project file. Will be used to set CWD for xcodebuild + * @param {String} outputPath Output directory to contain the IPA + * @param {String} exportOptionsPath Path to the exportOptions.plist file + * @return {Array} Array of arguments that could be passed directly to spawn method + */ +function getXcodeArchiveArgs(projectName, projectPath, outputPath, exportOptionsPath) { + return [ + '-exportArchive', + '-archivePath', projectName + '.xcarchive', + '-exportOptionsPlist', exportOptionsPath, + '-exportPath', outputPath + ]; +} + + // help/usage function module.exports.help = function help() { console.log(''); From 861cac84f5d1e3d04d7dd587610a8d5a7e0d4e76 Mon Sep 17 00:00:00 2001 From: Darryl Pogue Date: Fri, 16 Sep 2016 16:15:13 -0700 Subject: [PATCH 2/4] CB-11860 - Fix ios-sim tests on Xcode 8 --- .../CordovaLibTests.xcodeproj/project.pbxproj | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/CordovaLibTests/CordovaLibTests.xcodeproj/project.pbxproj b/tests/CordovaLibTests/CordovaLibTests.xcodeproj/project.pbxproj index dcc6d7fad5..319b6824af 100644 --- a/tests/CordovaLibTests/CordovaLibTests.xcodeproj/project.pbxproj +++ b/tests/CordovaLibTests/CordovaLibTests.xcodeproj/project.pbxproj @@ -208,7 +208,6 @@ 686357A4141002F100DF4CF2 /* Sources */, 686357A5141002F100DF4CF2 /* Frameworks */, 686357A6141002F100DF4CF2 /* Resources */, - 686357A7141002F100DF4CF2 /* ShellScript */, ); buildRules = ( ); @@ -290,19 +289,6 @@ shellScript = "cp ../../CordovaLib/cordova.js \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME/www/cordova.js\""; showEnvVarsInLog = 0; }; - 686357A7141002F100DF4CF2 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ From 7061221863d409110190f38353457c4314df7e9b Mon Sep 17 00:00:00 2001 From: Shazron Abdullah Date: Fri, 30 Sep 2016 13:02:37 -0700 Subject: [PATCH 3/4] CB-11860 - Add post-archive step to unpack the .ipa --- bin/templates/scripts/cordova/lib/build.js | 28 +++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/bin/templates/scripts/cordova/lib/build.js b/bin/templates/scripts/cordova/lib/build.js index ee03891fee..e173235611 100644 --- a/bin/templates/scripts/cordova/lib/build.js +++ b/bin/templates/scripts/cordova/lib/build.js @@ -116,8 +116,34 @@ module.exports.run = function (buildOpts) { return spawn('xcodebuild', xcodearchiveArgs, projectPath); } + function unpackIPA() { + var ipafile = path.join(buildOutputDir, projectName + '.ipa'); + + // unpack the existing platform/ios/build/device/appname.ipa (zipfile), will create a Payload folder + return spawn('unzip', [ '-o', '-qq', ipafile ], buildOutputDir); + } + + function moveApp() { + var appFileInflated = path.join(buildOutputDir, 'Payload', projectName + '.app'); + var appFile = path.join(buildOutputDir, projectName + '.app'); + var payloadFolder = path.join(buildOutputDir, 'Payload'); + + // delete the existing platform/ios/build/device/appname.app + return spawn('rm', [ '-rf', appFile ], buildOutputDir) + .then(function() { + // move the platform/ios/build/device/Payload/appname.app to parent + return spawn('mv', [ '-f', appFileInflated, buildOutputDir ], buildOutputDir); + }) + .then(function() { + // delete the platform/ios/build/device/Payload folder + return spawn('rm', [ '-rf', payloadFolder ], buildOutputDir); + }); + } + return Q.nfcall(fs.writeFile, exportOptionsPath, exportOptionsPlist, 'utf-8') - .then(packageArchive); + .then(packageArchive) + .then(unpackIPA) + .then(moveApp); }); }; From c609c35c03629dc38cde960b1ae957553008f712 Mon Sep 17 00:00:00 2001 From: Shazron Abdullah Date: Mon, 3 Oct 2016 19:07:12 -0700 Subject: [PATCH 4/4] CB-11860 - Remove build/device folder before building --- bin/templates/scripts/cordova/lib/build.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/templates/scripts/cordova/lib/build.js b/bin/templates/scripts/cordova/lib/build.js index e173235611..cfe017eb2f 100644 --- a/bin/templates/scripts/cordova/lib/build.js +++ b/bin/templates/scripts/cordova/lib/build.js @@ -89,8 +89,15 @@ module.exports.run = function (buildOpts) { events.emit('log','\tConfiguration: ' + configuration); events.emit('log','\tPlatform: ' + (buildOpts.device ? 'device' : 'emulator')); - var xcodebuildArgs = getXcodeBuildArgs(projectName, projectPath, configuration, buildOpts.device); - return spawn('xcodebuild', xcodebuildArgs, projectPath); + var buildOutputDir = path.join(projectPath, 'build', 'device'); + + // remove the build/device folder before building + return spawn('rm', [ '-rf', buildOutputDir ], projectPath) + .then(function() { + var xcodebuildArgs = getXcodeBuildArgs(projectName, projectPath, configuration, buildOpts.device); + return spawn('xcodebuild', xcodebuildArgs, projectPath); + }); + }).then(function () { if (!buildOpts.device || buildOpts.noSign) { return;