CB-11860 - Update packaging strategy for Xcode 8
Project: http://git-wip-us.apache.org/repos/asf/cordova-ios/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-ios/commit/249db303 Tree: http://git-wip-us.apache.org/repos/asf/cordova-ios/tree/249db303 Diff: http://git-wip-us.apache.org/repos/asf/cordova-ios/diff/249db303 Branch: refs/heads/master Commit: 249db303e258237479cd16b94c1349f2be65978b Parents: c6587cf Author: Darryl Pogue <[email protected]> Authored: Thu Sep 15 16:58:21 2016 -0700 Committer: Darryl Pogue <[email protected]> Committed: Fri Sep 30 17:33:16 2016 -0700 ---------------------------------------------------------------------- bin/templates/scripts/cordova/build | 1 + bin/templates/scripts/cordova/lib/build.js | 63 ++++++++++++++++++------- 2 files changed, 48 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/249db303/bin/templates/scripts/cordova/build ---------------------------------------------------------------------- diff --git a/bin/templates/scripts/cordova/build b/bin/templates/scripts/cordova/build index f5b7935..133fd94 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); http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/249db303/bin/templates/scripts/cordova/lib/build.js ---------------------------------------------------------------------- diff --git a/bin/templates/scripts/cordova/lib/build.js b/bin/templates/scripts/cordova/lib/build.js index a0d7668..ee03891 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(''); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
