From b26b9ea41b98b9a66954e047d5aad64de782da71 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Mon, 20 Feb 2023 10:05:21 -0300 Subject: [PATCH] [EC-763] Cake build watchOS (#2278) * EC-763 Implemented watchOS parts on cake build * EC-763 Improved setting the version name of the watch by caching the version on when updating the ios info plist file * EC-763 Fix cake build criteria to use lambda version so that it takes into consideration that the field might change on executing the script * EC-763 Added iOS and watchOS icons update to the cake build script --- appIcons/Android/beta-layered-excluded.svg | 11 ++ appIcons/Android/beta-layered.svg | 17 +++ appIcons/Android/dev-layered-excluded.svg | 11 ++ appIcons/Android/dev-layered.svg | 17 +++ appIcons/Android/qa-layered-excluded.svg | 11 ++ appIcons/Android/qa-layered.svg | 17 +++ appIcons/iOS/beta.png | Bin 0 -> 16147 bytes appIcons/iOS/dev.png | Bin 0 -> 15990 bytes appIcons/iOS/prod.png | Bin 0 -> 13009 bytes appIcons/iOS/qa.png | Bin 0 -> 17488 bytes appIcons/icongen.sh | 136 +++++++++++++++++++++ build.cake | 106 +++++++++++++++- 12 files changed, 320 insertions(+), 6 deletions(-) create mode 100644 appIcons/Android/beta-layered-excluded.svg create mode 100644 appIcons/Android/beta-layered.svg create mode 100644 appIcons/Android/dev-layered-excluded.svg create mode 100644 appIcons/Android/dev-layered.svg create mode 100644 appIcons/Android/qa-layered-excluded.svg create mode 100644 appIcons/Android/qa-layered.svg create mode 100644 appIcons/iOS/beta.png create mode 100644 appIcons/iOS/dev.png create mode 100644 appIcons/iOS/prod.png create mode 100644 appIcons/iOS/qa.png create mode 100755 appIcons/icongen.sh diff --git a/appIcons/Android/beta-layered-excluded.svg b/appIcons/Android/beta-layered-excluded.svg new file mode 100644 index 000000000..dc39f61aa --- /dev/null +++ b/appIcons/Android/beta-layered-excluded.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/appIcons/Android/beta-layered.svg b/appIcons/Android/beta-layered.svg new file mode 100644 index 000000000..73d5e8f3b --- /dev/null +++ b/appIcons/Android/beta-layered.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/appIcons/Android/dev-layered-excluded.svg b/appIcons/Android/dev-layered-excluded.svg new file mode 100644 index 000000000..5f8b22a4b --- /dev/null +++ b/appIcons/Android/dev-layered-excluded.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/appIcons/Android/dev-layered.svg b/appIcons/Android/dev-layered.svg new file mode 100644 index 000000000..cfe9c9a7c --- /dev/null +++ b/appIcons/Android/dev-layered.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/appIcons/Android/qa-layered-excluded.svg b/appIcons/Android/qa-layered-excluded.svg new file mode 100644 index 000000000..c2641004c --- /dev/null +++ b/appIcons/Android/qa-layered-excluded.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/appIcons/Android/qa-layered.svg b/appIcons/Android/qa-layered.svg new file mode 100644 index 000000000..ca2422b87 --- /dev/null +++ b/appIcons/Android/qa-layered.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/appIcons/iOS/beta.png b/appIcons/iOS/beta.png new file mode 100644 index 0000000000000000000000000000000000000000..04623a250722e2991f29d3a04bf857feb42c0d0a GIT binary patch literal 16147 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 Lw`FW`yzqYj@X*>$ literal 0 HcmV?d00001 diff --git a/appIcons/iOS/prod.png b/appIcons/iOS/prod.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d47292d395dc3a712f738af1a3f10609a0a186 GIT binary patch literal 13009 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 I(0Bj;0e1OiZ2$lO literal 0 HcmV?d00001 diff --git a/appIcons/iOS/qa.png b/appIcons/iOS/qa.png new file mode 100644 index 0000000000000000000000000000000000000000..adff0ba353369476a603f992b9927c5da23a4f34 GIT binary patch literal 17488 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 p{4ZMa- in-file.pdf (out-dir)" +} + +function command_exists() { + if type "$1" >/dev/null 2>&1; then + return 1 + else + return 0 + fi +} + +if command_exists "sips" == 0 ; then + echo "sips tool not found" + exit 1 +fi + +if [ "$1" = "--help" ] || [ "$1" = "-h" ] ; then + print_usage + exit 0 +fi + +PLATFORM="$1" +FILE="$2" +if [ -z "$PLATFORM" ] || [ -z "$FILE" ] ; then + echo "Error: missing arguments" + echo "" + print_usage + echo "" + print_example + exit 1 +fi + +DIR="$3" +if [ -z "$DIR" ] ; then + DIR=$(dirname $FILE) +fi + +# Create directory if needed +mkdir -p "$DIR" + +if [[ "$PLATFORM" == *"ios"* ]] ; then # iOS + sips -s format png -Z '180' "${FILE}" --out "${DIR}"/Icon-180.png + sips -s format png -Z '29' "${FILE}" --out "${DIR}"/Icon-29.png + sips -s format png -Z '58' "${FILE}" --out "${DIR}"/Icon-58.png + sips -s format png -Z '120' "${FILE}" --out "${DIR}"/Icon-120.png + sips -s format png -Z '87' "${FILE}" --out "${DIR}"/Icon-87.png + sips -s format png -Z '40' "${FILE}" --out "${DIR}"/Icon-40.png + sips -s format png -Z '80' "${FILE}" --out "${DIR}"/Icon-80.png + sips -s format png -Z '76' "${FILE}" --out "${DIR}"/Icon-76.png + sips -s format png -Z '152' "${FILE}" --out "${DIR}"/Icon-152.png + sips -s format png -Z '167' "${FILE}" --out "${DIR}"/Icon-167.png + sips -s format png -Z '60' "${FILE}" --out "${DIR}"/Icon-60.png + sips -s format png -Z '20' "${FILE}" --out "${DIR}"/Icon-20.png + sips -s format png -Z '1024' "${FILE}" --out "${DIR}"/Icon-1024.png + + # https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_ref-Asset_Catalog_Format/AppIconType.html + contents_json='{"images":[{"size":"20x20","idiom":"iphone","filename":"iPhoneNotification@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"iPhoneNotification@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"iPhoneSettings@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"iPhoneSettings@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"iPhoneSpotlight@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"iPhoneSpotlight@3x.png","scale":"3x"},{"size":"60x60","idiom":"iphone","filename":"iPhone@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"iPhone@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"iPadNotification.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"iPadNotification@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"iPadSettings.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"iPadSettings@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"iPadSpotlight.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"iPadSpotlight@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"iPad.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"iPad@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"iPadPro@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"AppStoreMarketing.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}' + echo $contents_json > "${DIR}"/Contents.json +fi + +if [[ "$PLATFORM" == *"watch"* ]] ; then # Apple Watch + sips -s format png -Z '48' "${FILE}" --out "${DIR}"/Watch38mmNotificationCenter.png + sips -s format png -Z '55' "${FILE}" --out "${DIR}"/Watch42mmNotificationCenter.png + sips -s format png -Z '66' "${FILE}" --out "${DIR}"/Watch66NotificationCenter.png + sips -s format png -Z '58' "${FILE}" --out "${DIR}"/WatchCompanionSettings@2x.png + sips -s format png -Z '87' "${FILE}" --out "${DIR}"/WatchCompanionSettings@3x.png + sips -s format png -Z '80' "${FILE}" --out "${DIR}"/Watch38MM42MMHomeScreen.png + sips -s format png -Z '88' "${FILE}" --out "${DIR}"/Watch40MMHomeScreen.png + sips -s format png -Z '92' "${FILE}" --out "${DIR}"/Watch41MMHomeScreen.png + sips -s format png -Z '100' "${FILE}" --out "${DIR}"/Watch44MMHomeScreen.png + sips -s format png -Z '102' "${FILE}" --out "${DIR}"/Watch45MMHomeScreen.png + sips -s format png -Z '108' "${FILE}" --out "${DIR}"/Watch49MMHomeScreen.png + sips -s format png -Z '172' "${FILE}" --out "${DIR}"/Watch38MMShortLook.png + sips -s format png -Z '196' "${FILE}" --out "${DIR}"/Watch40MM42MMShortLook.png + sips -s format png -Z '216' "${FILE}" --out "${DIR}"/Watch44MMShortLook.png + sips -s format png -Z '234' "${FILE}" --out "${DIR}"/Watch234ShortLook.png + sips -s format png -Z '258' "${FILE}" --out "${DIR}"/Watch258ShortLook.png + sips -s format png -Z '1024' "${FILE}" --out "${DIR}"/WatchAppStore.png + + # https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_ref-Asset_Catalog_Format/AppIconType.html + contents_json='{"images":[{"size":"24x24","idiom":"watch","scale":"2x","filename":"Watch38mmNotificationCenter.png","role":"notificationCenter","subtype":"38mm"},{"size":"27.5x27.5","idiom":"watch","scale":"2x","filename":"Watch42mmNotificationCenter.png","role":"notificationCenter","subtype":"42mm"},{"size":"29x29","idiom":"watch","filename":"WatchCompanionSettings@2x.png","role":"companionSettings","scale":"2x"},{"size":"29x29","idiom":"watch","filename":"WatchCompanionSettings@3x.png","role":"companionSettings","scale":"3x"},{"size":"40x40","idiom":"watch","filename":"Watch38MM42MMHomeScreen.png","scale":"2x","role":"appLauncher","subtype":"38mm"},{"size":"44x44","idiom":"watch","scale":"2x","filename":"Watch40MMHomeScreen.png","role":"appLauncher","subtype":"40mm"},{"size":"50x50","idiom":"watch","scale":"2x","filename":"Watch44MMHomeScreen.png","role":"appLauncher","subtype":"44mm"},{"size":"86x86","idiom":"watch","scale":"2x","filename":"Watch38MMShortLook.png","role":"quickLook","subtype":"38mm"},{"size":"98x98","idiom":"watch","scale":"2x","filename":"Watch40MM42MMShortLook.png","role":"quickLook","subtype":"42mm"},{"size":"108x108","idiom":"watch","scale":"2x","filename":"Watch44MMShortLook.png","role":"quickLook","subtype":"44mm"},{"idiom":"watch-marketing","filename":"WatchAppStore.png","size":"1024x1024","scale":"1x"}],"info":{"version":1,"author":"xcode"}}' + echo $contents_json > "${DIR}"/Contents.json +fi + +if [[ "$PLATFORM" == *"complication"* ]] ; then # Apple Watch + sips -s format png -Z '32' "${FILE}" --out "${DIR}"/Circular38mm2x.png + sips -s format png -Z '36' "${FILE}" --out "${DIR}"/Circular40mm2x.png + sips -s format png -Z '36' "${FILE}" --out "${DIR}"/Circular42mm2x.png + sips -s format png -Z '40' "${FILE}" --out "${DIR}"/Circular44mm2x.png + sips -s format png -Z '182' "${FILE}" --out "${DIR}"/ExtraLarge38mm2x.png + sips -s format png -Z '203' "${FILE}" --out "${DIR}"/ExtraLarge40mm2x.png + sips -s format png -Z '203' "${FILE}" --out "${DIR}"/ExtraLarge42mm2x.png + sips -s format png -Z '224' "${FILE}" --out "${DIR}"/ExtraLarge44mm2x.png + sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicBezel40mm2x.png + sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicBezel42mm2x.png + sips -s format png -Z '94' "${FILE}" --out "${DIR}"/GraphicBezel44mm2x.png + sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicCircular40mm2x.png + sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicCircular42mm2x.png + sips -s format png -Z '94' "${FILE}" --out "${DIR}"/GraphicCircular44mm2x.png + sips -s format png -Z '40' "${FILE}" --out "${DIR}"/GraphicCorner40mm2x.png + sips -s format png -Z '40' "${FILE}" --out "${DIR}"/GraphicCorner42mm2x.png + sips -s format png -Z '44' "${FILE}" --out "${DIR}"/GraphicCorner44mm2x.png + sips -s format png -Z '52' "${FILE}" --out "${DIR}"/GraphicModular38mm2x.png + sips -s format png -Z '58' "${FILE}" --out "${DIR}"/GraphicModular40mm2x.png + sips -s format png -Z '58' "${FILE}" --out "${DIR}"/GraphicModular42mm2x.png + sips -s format png -Z '64' "${FILE}" --out "${DIR}"/GraphicModular44mm2x.png + sips -s format png -Z '40' "${FILE}" --out "${DIR}"/GraphicUtilitarian38mm2x.png + sips -s format png -Z '44' "${FILE}" --out "${DIR}"/GraphicUtilitarian40mm2x.png + sips -s format png -Z '44' "${FILE}" --out "${DIR}"/GraphicUtilitarian42mm2x.png + sips -s format png -Z '50' "${FILE}" --out "${DIR}"/GraphicUtilitarian44mm2x.png + sips -s format png -Z '206' "${FILE}" --out "${DIR}"/GraphicExtraLarge38mm2x.png + sips -s format png -Z '264' "${FILE}" --out "${DIR}"/GraphicExtraLarge44mm2x.png + echo "NOTE: Graphic Extra Large is not generated since that is not rectangular" +fi + +if [[ "$PLATFORM" == *"macos"* ]] ; then # macOS + sips -s format png -Z '1024' "${FILE}" --out "${DIR}"/icon_512x512@2x.png + sips -s format png -Z '512' "${FILE}" --out "${DIR}"/icon_512x512.png + sips -s format png -Z '512' "${FILE}" --out "${DIR}"/icon_256x256@2x.png + sips -s format png -Z '256' "${FILE}" --out "${DIR}"/icon_256x256.png + sips -s format png -Z '256' "${FILE}" --out "${DIR}"/icon_128x128@2x.png + sips -s format png -Z '128' "${FILE}" --out "${DIR}"/icon_128x128.png + sips -s format png -Z '64' "${FILE}" --out "${DIR}"/icon_32x32@2x.png + sips -s format png -Z '32' "${FILE}" --out "${DIR}"/icon_32x32.png + sips -s format png -Z '32' "${FILE}" --out "${DIR}"/icon_16x16@2x.png + sips -s format png -Z '16' "${FILE}" --out "${DIR}"/icon_16x16.png +fi \ No newline at end of file diff --git a/build.cake b/build.cake index f30c8404b..466a96cc8 100644 --- a/build.cake +++ b/build.cake @@ -4,6 +4,7 @@ #addin nuget:?package=Cake.Incubator&version=7.0.0 #tool dotnet:?package=GitVersion.Tool&version=5.10.3 using Path = System.IO.Path; +using System.Text.RegularExpressions; var debugScript = Argument("debugScript", false); var target = Argument("target", "Default"); @@ -35,6 +36,7 @@ VariantConfig GetVariant() => variant.ToLower() switch{ GitVersion _gitVersion; //will be set by GetGitInfo task var _slnPath = Path.Combine(""); //base path used to access files. If build.cake file is moved, just update this string _androidPackageName = string.Empty; //will be set by UpdateAndroidManifest task +string _iOSVersionName = string.Empty; //will be set by UpdateiOSPlist task string CreateFeatureBranch(string prevVersionName, GitVersion git) => $"{prevVersionName}-{git.BranchName.Replace("/","-")}"; string GetVersionName(string prevVersionName, VariantConfig buildVariant, GitVersion git) => buildVariant is Prod? prevVersionName : CreateFeatureBranch(prevVersionName, git); int CreateBuildNumber(int previousNumber) => ++previousNumber; @@ -163,7 +165,8 @@ enum iOSProjectType MainApp, Autofill, Extension, - ShareExtension + ShareExtension, + WatchApp } string GetiOSBundleId(VariantConfig buildVariant, iOSProjectType projectType) => projectType switch @@ -171,6 +174,7 @@ string GetiOSBundleId(VariantConfig buildVariant, iOSProjectType projectType) => iOSProjectType.Autofill => $"{buildVariant.iOSBundleId}.autofill", iOSProjectType.Extension => $"{buildVariant.iOSBundleId}.find-login-action-extension", iOSProjectType.ShareExtension => $"{buildVariant.iOSBundleId}.share-extension", + iOSProjectType.WatchApp => $"{buildVariant.iOSBundleId}.watchkitapp", _ => buildVariant.iOSBundleId }; @@ -205,6 +209,7 @@ private void UpdateiOSInfoPlist(string plistPath, VariantConfig buildVariant, Gi if(projectType == iOSProjectType.MainApp) { + _iOSVersionName = newVersionName; plist["CFBundleURLTypes"][0]["CFBundleURLName"] = $"{buildVariant.iOSBundleId}.url"; } @@ -240,10 +245,79 @@ private void UpdateiOSEntitlementsPlist(string entitlementsPath, VariantConfig b Information($"{entitlementsPath} updated with success!"); } -Task("UpdateiOSIcon") +private void UpdateWatchKitAppInfoPlist(string plistPath, VariantConfig buildVariant) +{ + var plistFile = File(plistPath); + dynamic plist = DeserializePlist(plistFile); + + var prevBundleId = plist["NSExtension"]["NSExtensionAttributes"]["WKAppBundleIdentifier"]; + var newBundleId = GetiOSBundleId(buildVariant, iOSProjectType.WatchApp); + + plist["NSExtension"]["NSExtensionAttributes"]["WKAppBundleIdentifier"] = newBundleId; + + SerializePlist(plistFile, plist); + + Information($"Changed Bundle Identifier from {prevBundleId} to {newBundleId}"); + Information($"{plistPath} updated with success!"); +} + +private void UpdateWatchPbxproj(string pbxprojPath, string newVersion) +{ + var fileText = FileReadText(pbxprojPath); + if (string.IsNullOrEmpty(fileText)) + { + throw new Exception($"Couldn't find {pbxprojPath}"); + } + + const string pattern = @"MARKETING_VERSION = [^;]*;"; + + fileText = Regex.Replace(fileText, pattern, $"MARKETING_VERSION = {newVersion};"); + + FileWriteText(pbxprojPath, fileText); + Information($"{pbxprojPath} modified successfully."); +} + +/// +/// Updates the target icons on the given appiconset target +/// taking as source the icon in appIcons/iOS folder for the giving variant +/// +/// It can be +/// Folder to copy the generated icons to +private void UpdateAppleIcons(string target, string appiconsetTarget) +{ + Information($"Updating {target} App Icons"); + + var iconsTempDirPath = Path.Combine(_slnPath, "appIcons", "temp"); + CreateDirectory(iconsTempDirPath); + + var arguments = new ProcessArgumentBuilder(); + arguments.Append(target); + arguments.Append(Path.Combine(_slnPath, "appIcons", "iOS", $"{variant}.png")); + arguments.Append(iconsTempDirPath); + + using(var process = StartAndReturnProcess(Path.Combine(_slnPath, "appIcons", "icongen.sh"), + new ProcessSettings { Arguments = arguments })) + { + process.WaitForExit(); + Information("Exit code: {0}", process.GetExitCode()); + } + + var generatedIconsPath = Path.Combine(iconsTempDirPath, "*.png"); + CopyFiles(generatedIconsPath, appiconsetTarget); + + DeleteDirectory(iconsTempDirPath, new DeleteDirectorySettings { + Recursive = true, + Force = true + }); + + Information($"{target} App Icons have been updated"); +} + +Task("UpdateiOSIcons") .Does(()=>{ - //TODO we'll implement variant icons later - Information($"Updating IOS App Icon"); + UpdateAppleIcons("ios", Path.Combine(_slnPath, "src", "iOS", "Resources", "Assets.xcassets", "AppIcons.appiconset")); + UpdateAppleIcons("watch", Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden WatchKit App", "Assets.xcassets", "AppIcon.appiconset")); + // TODO: Update complication icons when they start working }); Task("UpdateiOSPlist") @@ -296,8 +370,10 @@ Task("UpdateiOSCodeFiles") var fileList = new string[] { Path.Combine(_slnPath, "src", "iOS.Core", "Utilities", "iOSCoreHelpers.cs"), Path.Combine(_slnPath, "src", "iOS.Core", "Constants.cs"), + Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden.xcodeproj", "project.pbxproj"), + Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden WatchKit Extension", "Helpers", "KeychainHelper.swift"), Path.Combine(".github", "resources", "export-options-ad-hoc.plist"), - Path.Combine(".github", "resources", "export-options-app-store.plist"), + Path.Combine(".github", "resources", "export-options-app-store.plist") }; foreach(string path in fileList) @@ -305,6 +381,22 @@ Task("UpdateiOSCodeFiles") ReplaceInFile(path, "com.8bit.bitwarden", buildVariant.iOSBundleId); } }); + +Task("UpdateWatchProject") + .IsDependentOn("UpdateiOSPlist") + .WithCriteria(() => !string.IsNullOrEmpty(_iOSVersionName)) + .Does(()=> { + var watchProjectPath = Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden.xcodeproj", "project.pbxproj"); + UpdateWatchPbxproj(watchProjectPath, _iOSVersionName); + }); + +Task("UpdateWatchKitAppInfoPlist") + .Does(()=> { + var buildVariant = GetVariant(); + var infoPath = Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden WatchKit Extension", "Info.plist"); + UpdateWatchKitAppInfoPlist(infoPath, buildVariant); + }); + #endregion iOS #region Main Tasks @@ -318,12 +410,14 @@ Task("Android") }); Task("iOS") - //.IsDependentOn("UpdateiOSIcon") + .IsDependentOn("UpdateiOSIcons") .IsDependentOn("UpdateiOSPlist") .IsDependentOn("UpdateiOSAutofillPlist") .IsDependentOn("UpdateiOSExtensionPlist") .IsDependentOn("UpdateiOSShareExtensionPlist") .IsDependentOn("UpdateiOSCodeFiles") + .IsDependentOn("UpdateWatchProject") + .IsDependentOn("UpdateWatchKitAppInfoPlist") .Does(()=> { Information("iOS app updated");