From 06bd49d28e7d49d70537f9660fe6f39d6250e8ca Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Thu, 15 Feb 2018 14:33:10 -0800 Subject: [PATCH 01/28] Search all known hosts, support multiple template patterns --- UnitySetup/UnitySetup.psm1 | 90 ++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 33 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index 316e169..f0cedd0 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -157,22 +157,30 @@ function Find-UnitySetupInstaller [UnitySetupComponentType] $Components = [UnitySetupComponentType]::All ) + $unitySetupRegEx = "^(.+)\/([a-z0-9]+)\/Windows64EditorInstaller\/UnitySetup64-(\d+)\.(\d+)\.(\d+)([fpb])(\d+).exe$" + $knownBaseUrls = @( + "https://download.unity3d.com/download_unity", + "https://netstorage.unity3d.com/unity", + "https://beta.unity3d.com/download" + ) + $installerTemplates = @{ - [UnitySetupComponentType]::Setup = "Windows64EditorInstaller/UnitySetup64-$Version.exe"; - [UnitySetupComponentType]::Documentation = "WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; - [UnitySetupComponentType]::StandardAssets = "WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; - [UnitySetupComponentType]::ExampleProject = "WindowsExampleProjectInstaller/UnityExampleProjectSetup-$Version.exe"; - [UnitySetupComponentType]::Metro = "TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::UWP_IL2CPP = "TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Android = "TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::iOS = "TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::AppleTV = "TargetSupportInstaller/UnitySetup-AppleTV-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Facebook = "TargetSupportInstaller/UnitySetup-Facebook-Games-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Linux = "TargetSupportInstaller/UnitySetup-Linux-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Mac = "TargetSupportInstaller/UnitySetup-Mac-Mono-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Vuforia = "TargetSupportInstaller/UnitySetup-Vuforia-AR-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::WebGL = "TargetSupportInstaller/UnitySetup-WebGL-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Windows_IL2CPP = "TargetSupportInstaller/UnitySetup-Windows-IL2CPP-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Setup = ,"Windows64EditorInstaller/UnitySetup64-$Version.exe"; + [UnitySetupComponentType]::Documentation = ,"WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; + [UnitySetupComponentType]::StandardAssets = ,"WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; + [UnitySetupComponentType]::ExampleProject = ,"WindowsExampleProjectInstaller/UnityExampleProjectSetup-$Version.exe"; + [UnitySetupComponentType]::Metro = ,"TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::UWP_IL2CPP = ,"TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Android = ,"TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::iOS = ,"TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::AppleTV = ,"TargetSupportInstaller/UnitySetup-AppleTV-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Facebook = ,"TargetSupportInstaller/UnitySetup-Facebook-Games-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Linux = ,"TargetSupportInstaller/UnitySetup-Linux-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Mac = "TargetSupportInstaller/UnitySetup-Mac-Support-for-Editor-$Version.exe", + "TargetSupportInstaller/UnitySetup-Mac-Mono-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Vuforia = ,"TargetSupportInstaller/UnitySetup-Vuforia-AR-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::WebGL = ,"TargetSupportInstaller/UnitySetup-WebGL-Support-for-Editor-$Version.exe"; + [UnitySetupComponentType]::Windows_IL2CPP = ,"TargetSupportInstaller/UnitySetup-Windows-IL2CPP-Support-for-Editor-$Version.exe"; } # By default Tls12 protocol is not enabled, but is what backs Unity's website, so enable it @@ -217,30 +225,46 @@ function Find-UnitySetupInstaller throw "Could not find archives for Unity version $Version" } - $prototypeLink = $prototypeLink.Replace("$($installerTemplates[[UnitySetupComponentType]::Setup])", '') + $linkComponents = $prototypeLink -split $unitySetupRegEx -ne "" + + if($knownBaseUrls -notcontains $linkComponents[0]) { + $knownBaseUrls = $linkComponents[0], $knownBaseUrls + } + else { + $knownBaseUrls = $knownBaseUrls | Sort-Object -Property @{ Expression={[math]::Abs(($_.CompareTo($linkComponents[0])))}; Ascending=$true} + } $installerTemplates.Keys | Where-Object { $Components -band $_ } | ForEach-Object { - $template = $installerTemplates.Item($_); - $endpoint = [System.IO.Path]::Combine($prototypeLink, $template); - try - { - $testResult = Invoke-WebRequest $endpoint -Method HEAD - New-Object UnitySetupInstaller -Property @{ - 'ComponentType' = $_; - 'Version' = $Version; - 'DownloadUrl' = $endpoint; - 'Length' = [int64]$testResult.Headers['Content-Length']; - 'LastModified' = ([System.DateTime]$testResult.Headers['Last-Modified']); + $templates = $installerTemplates.Item($_); + $result = $null + foreach ($template in $templates ) { + foreach ( $baseUrl in $knownBaseUrls) { + $endpoint = [uri][System.IO.Path]::Combine($baseUrl, $linkComponents[1], $template); + try { + $testResult = Invoke-WebRequest $endpoint -Method HEAD + $result = New-Object UnitySetupInstaller -Property @{ + 'ComponentType' = $_; + 'Version' = $Version; + 'DownloadUrl' = $endpoint; + 'Length' = [int64]$testResult.Headers['Content-Length']; + 'LastModified' = ([System.DateTime]$testResult.Headers['Last-Modified']); + } + + break + } + catch { + Write-Verbose "$endpoint failed: $_" + } + } + + if( $result ) { + $result + break } } - catch - { - Write-Verbose "$endpoint failed: $_" - } - } | - Sort-Object -Property ComponentType + } | Sort-Object -Property ComponentType } <# From 3dcc6f1aa91a2b52871a4b68acc9c938c1ed6aef Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Thu, 15 Feb 2018 16:14:44 -0800 Subject: [PATCH 02/28] Skip tags, we don't use them this way, yet. --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 1e5c501..c2cd258 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,5 @@ version: '{build}' +skip_tags: true pull_requests: do_not_increment_build_number: true environment: From 0f649e24f87075ef60e4b70316b57a917ceb0b3b Mon Sep 17 00:00:00 2001 From: Derek Freed Date: Mon, 26 Feb 2018 12:47:49 -0800 Subject: [PATCH 03/28] Adds a validated set for unity build targets when starting editor --- UnitySetup/UnitySetup.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index 316e169..fb8a90e 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -620,6 +620,7 @@ function Start-UnityEditor [parameter(Mandatory=$false)] [string]$LogFile, [parameter(Mandatory=$false)] + [ValidateSet('StandaloneOSX','StandaloneWindows','iOS','Android','StandaloneLinux','StandaloneWindows64','WebGL','WSAPlayer','StandaloneLinux64','StandaloneLinuxUniversal','Tizen','PSP2','PS4','XBoxOne','N3DS','WiiU','tvOS','Switch')] [string]$BuildTarget, [parameter(Mandatory=$false)] [switch]$BatchMode, From 31643d15fdd11254dfc0b18c8efc35a843f20ca6 Mon Sep 17 00:00:00 2001 From: Derek Freed Date: Mon, 26 Feb 2018 14:58:15 -0800 Subject: [PATCH 04/28] Adds ability to import packages with start-unityeditor --- UnitySetup/UnitySetup.psm1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index 316e169..1d82e41 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -614,6 +614,8 @@ function Start-UnityEditor [parameter(Mandatory=$false)] [string[]]$ExportPackage, [parameter(Mandatory=$false)] + [string]$ImportPackage, + [parameter(Mandatory=$false)] [string]$CreateProject, [parameter(Mandatory=$false)] [string]$OutputPath, @@ -710,6 +712,7 @@ function Start-UnityEditor if( $BatchMode ) { $sharedArgs += "-batchmode" } if( $Quit ) { $sharedArgs += "-quit" } if( $ExportPackage ) { $sharedArgs += "-exportPackage","$ExportPackage" } + if( $ImportPackage ) { $sharedArgs += "-importPackage","$ImportPackage" } $instanceArgs = @() foreach( $p in $projectInstances ) { From 2909fe2e4c98628abf4c4f6008988d1139b3cd36 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Tue, 27 Feb 2018 14:25:02 -0800 Subject: [PATCH 05/28] Use basic parsing to avoid IE dependency --- UnitySetup/UnitySetup.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index bcc349f..e205995 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -201,7 +201,7 @@ function Find-UnitySetupInstaller $patchPage = "https://unity3d.com/unity/qa/patch-releases?version=$($Version.Major).$($Version.Minor)" $searchPages += $patchPage - $webResult = Invoke-WebRequest $patchPage + $webResult = Invoke-WebRequest $patchPage -UseBasicParsing $searchPages += $webResult.Links | Where-Object { $_.href -match "\/unity\/qa\/patch-releases\?version=$($Version.Major)\.$($Version.Minor)&page=(\d+)" -and $Matches[1] -gt 1 } | ForEach-Object { @@ -212,8 +212,8 @@ function Find-UnitySetupInstaller foreach($page in $searchPages) { - $webResult = Invoke-WebRequest $page - $prototypeLink = $webResult.Links | Select-Object -ExpandProperty href | Where-Object { + $webResult = Invoke-WebRequest $page -UseBasicParsing + $prototypeLink = $webResult.Links | Select-Object -ExpandProperty href -ErrorAction SilentlyContinue | Where-Object { $_ -match "$($installerTemplates[[UnitySetupComponentType]::Setup])$" } @@ -243,7 +243,7 @@ function Find-UnitySetupInstaller foreach ( $baseUrl in $knownBaseUrls) { $endpoint = [uri][System.IO.Path]::Combine($baseUrl, $linkComponents[1], $template); try { - $testResult = Invoke-WebRequest $endpoint -Method HEAD + $testResult = Invoke-WebRequest $endpoint -Method HEAD -UseBasicParsing $result = New-Object UnitySetupInstaller -Property @{ 'ComponentType' = $_; 'Version' = $Version; From bbbf9823eb7690602bd2ab1d69681c82bc70575d Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Thu, 1 Mar 2018 17:21:11 -0800 Subject: [PATCH 06/28] Update examples to reflect reality --- UnitySetup/UnitySetup.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index e205995..8920bc8 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -140,11 +140,11 @@ class UnityVersion : System.IComparable .PARAMETER Version What version of Unity are you looking for? .PARAMETER Components - What components would you like to search for? Defaults to [UnitySetupComponentType]::All + What components would you like to search for? Defaults to All .EXAMPLE Find-UnitySetupInstaller -Version 2017.3.0f3 .EXAMPLE - Find-UnitySetupInstaller -Version 2017.3.0f3 -Components ([UnitySetupComponentType]::Setup, [UnitySetupComponentType]::Documentation) + Find-UnitySetupInstaller -Version 2017.3.0f3 -Components Setup,Documentation #> function Find-UnitySetupInstaller { From 9abefbec7bef1658273f2fe2c627179bc65de1ca Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Thu, 1 Mar 2018 17:29:56 -0800 Subject: [PATCH 07/28] Drop examples installer support --- README.md | 1 - UnitySetup/UnitySetup.psm1 | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 179220f..fefc35b 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,6 @@ Find-UnitySetupInstaller -Version '2017.3.0f3' | Format-Table # Setup 2017.3.0f3 553688024 2017-12-18 08:15:20 https://netstorage.unity3d.com/unity/... # Documentation 2017.3.0f3 358911256 2017-12-18 08:18:37 https://netstorage.unity3d.com/unity/... # StandardAssets 2017.3.0f3 189886032 2017-12-18 08:15:52 https://netstorage.unity3d.com/unity/... -# ExampleProject 2017.3.0f3 258824680 2017-12-18 08:15:39 https://netstorage.unity3d.com/unity/... # Metro 2017.3.0f3 172298008 2017-12-18 08:17:44 https://netstorage.unity3d.com/unity/... # UWP_IL2CPP 2017.3.0f3 152933480 2017-12-18 08:17:55 https://netstorage.unity3d.com/unity/... # Android 2017.3.0f3 194240888 2017-12-18 08:16:06 https://netstorage.unity3d.com/unity/... diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index e205995..5430d89 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -8,7 +8,7 @@ enum UnitySetupComponentType Setup = (1 -shl 0) Documentation = (1 -shl 1) StandardAssets = (1 -shl 2) - ExampleProject = (1 -shl 3) + Windows_IL2CPP = (1 -shl 3) Metro = (1 -shl 4) UWP_IL2CPP = (1 -shl 5) Android = (1 -shl 6) @@ -19,7 +19,6 @@ enum UnitySetupComponentType Mac = (1 -shl 11) Vuforia = (1 -shl 12) WebGL = (1 -shl 13) - Windows_IL2CPP = (1 -shl 14) All = (-1) } @@ -168,7 +167,6 @@ function Find-UnitySetupInstaller [UnitySetupComponentType]::Setup = ,"Windows64EditorInstaller/UnitySetup64-$Version.exe"; [UnitySetupComponentType]::Documentation = ,"WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; [UnitySetupComponentType]::StandardAssets = ,"WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; - [UnitySetupComponentType]::ExampleProject = ,"WindowsExampleProjectInstaller/UnityExampleProjectSetup-$Version.exe"; [UnitySetupComponentType]::Metro = ,"TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; [UnitySetupComponentType]::UWP_IL2CPP = ,"TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; [UnitySetupComponentType]::Android = ,"TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; From d73ee272a5a6e4345af0523133a383f169b0348c Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Thu, 1 Mar 2018 17:41:23 -0800 Subject: [PATCH 08/28] Write error for missing explicit version --- UnitySetup/UnitySetup.psm1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index e205995..e7d855b 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -724,6 +724,10 @@ function Start-UnityEditor { $setupInstances = ,$setupInstance } + else + { + Write-Error "Could not find Unity Editor for version $Version" + } } } } From e34a881f35f12b2d6479b2ef2febbbd92156fe65 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Fri, 2 Mar 2018 09:47:33 -0800 Subject: [PATCH 09/28] Bump the major version to reflect API changes --- UnitySetup/UnitySetup.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index 941effc..654968c 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -14,7 +14,7 @@ RootModule = 'UnitySetup' # Version number of this module. -ModuleVersion = '2.2' +ModuleVersion = '3.0' # Supported PSEditions # CompatiblePSEditions = @() From 727c9e85bd8e363ec1105f7ed8a3d128bd210179 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Fri, 2 Mar 2018 14:31:38 -0800 Subject: [PATCH 10/28] Support for Components on UnitySetupInstance --- UnitySetup/UnitySetup.psm1 | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index e9105b7..c6bef36 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -19,7 +19,7 @@ enum UnitySetupComponentType Mac = (1 -shl 11) Vuforia = (1 -shl 12) WebGL = (1 -shl 13) - All = (-1) + All = (1 -shl 14) - 1 } class UnitySetupInstaller @@ -34,8 +34,9 @@ class UnitySetupInstaller class UnitySetupInstance { [UnityVersion]$Version + [UnitySetupComponentType]$Components [string]$Path - + UnitySetupInstance([string]$path) { $ivyPath = [io.path]::Combine("$path", 'Data\UnityExtensions\Unity\Networking\ivy.xml'); @@ -44,10 +45,37 @@ class UnitySetupInstance if( !($xmlDoc.'ivy-module'.info.unityVersion)) { throw "Unity setup ivy is missing version: $ivyPath" - } + } $this.Path = $path $this.Version = $xmlDoc.'ivy-module'.info.unityVersion + $this.Components = [UnitySetupComponentType]::Setup + + $componentTests = @{ + [UnitySetupComponentType]::Documentation = ,"$Path\Data\Documentation"; + [UnitySetupComponentType]::StandardAssets = ,"$Path\Standard Assets"; + [UnitySetupComponentType]::Windows_IL2CPP = ,"$Path\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; + [UnitySetupComponentType]::Metro = "$Path\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", + "$Path\Data\PlaybackEngines\MetroSupport\Templates\UWP_D3D"; + [UnitySetupComponentType]::UWP_IL2CPP = ,"$Path\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; + [UnitySetupComponentType]::Android = ,"$Path\Data\PlaybackEngines\AndroidPlayer"; + [UnitySetupComponentType]::iOS = , "$Path\Data\PlaybackEngines\iOSSupport"; + [UnitySetupComponentType]::AppleTV = , "$Path\Data\PlaybackEngines\AppleTVSupport"; + [UnitySetupComponentType]::Facebook = , "$Path\Data\PlaybackEngines\Facebook"; + [UnitySetupComponentType]::Linux = , "$Path\Data\PlaybackEngines\LinuxStandaloneSupport"; + [UnitySetupComponentType]::Mac = , "$Path\Data\PlaybackEngines\MacStandaloneSupport"; + [UnitySetupComponentType]::Vuforia = , "$Path\Data\PlaybackEngines\VuforiaSupport"; + [UnitySetupComponentType]::WebGL = , "$Path\Data\PlaybackEngines\WebGLSupport"; + } + + $componentTests.Keys | ForEach-Object { + foreach( $test in $componentTests[$_] ) { + if( Test-Path -PathType Container -Path $test ) { + $this.Components += $_ + break; + } + } + } } } From bfe10b2f785014cf71b4ebc0257f1ff27aad61a7 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Fri, 2 Mar 2018 14:39:28 -0800 Subject: [PATCH 11/28] Fixup readme for recent updates --- README.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index fefc35b..89ca955 100644 --- a/README.md +++ b/README.md @@ -27,15 +27,19 @@ Find all of your Unity installs: Get-UnitySetupInstance # Example output: -# InstallationVersion InstallationPath -# ------------------- ---------------- -# 2017.2.1f1 C:\Program Files\Unity-2017.2.1f1\Editor\ -# 2017.1.0p5 C:\Program Files\Unity.2017.1.0p5\Editor\ -# 2017.1.1f1 C:\Program Files\Unity.2017.1.1f1\Editor\ -# 2017.1.1p3 C:\Program Files\Unity.2017.1.1p3\Editor\ -# 2017.2.0f3 C:\Program Files\Unity.2017.2.0f3\Editor\ -# 2017.3.0f3 C:\Program Files\Unity.2017.3.0f3\Editor\ -# 5.5.4p3 C:\Program Files (x86)\Unity.5.5.4p3\Editor\ +# Version Components Path +# ------- ---------- ---- +# 2017.1.2f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.1.2f1\Editor\ +# 2017.1.3f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.1.3f1\Editor\ +# 2017.2.1f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.2.1f1\Editor\ +# 2017.3.1f1 Setup, Metro, UWP_IL2CPP, Linux, Vuforia C:\Program Files\Unity-2017.3.1f1\Editor\ +# 2018.1.0b4 Setup, Metro, UWP_IL2CPP, Vuforia C:\Program Files\Unity-2018.1.0b4\Editor\ +# 2018.1.0b8 All C:\Program Files\Unity-2018.1.0b8\Editor\ +# 2017.1.0p5 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.0p5\Editor\ +# 2017.1.1f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.1f1\Editor\ +# 2017.1.1p3 Setup, StandardAssets, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.1p3\Editor\ +# 2017.2.0f3 Setup, Metro, UWP_IL2CPP, Vuforia C:\Program Files\Unity.2017.2.0f3\Editor\ +# 2017.3.0f3 Setup, Metro, UWP_IL2CPP, Mac, Vuforia C:\Program Files\Unity.2017.3.0f3\Editor\ ``` Select the Unity installs that you want: @@ -50,12 +54,12 @@ Find all the Unity projects recursively: Get-UnityProjectInstance -Recurse # Example output: -# ProjectPath UnityInstanceVersion -# ----------- -------------------- -# C:\Projects\Project1\OneUnity\ 2017.2.0f3 -# C:\Projects\Project1\TwoUnity\ 2017.3.0f3 -# C:\Projects\Project2\ 2017.1.1p1 -# C:\Projects\Project3\App.Unity\ 2017.1.2f1 +# Version Path +# ------- ---- +# 2017.2.0f3 C:\Projects\Project1\OneUnity\ +# 2017.3.0f3 C:\Projects\Project1\TwoUnity\ +# 2017.1.1p1 C:\Projects\Project2\ +# 2017.1.2f1 C:\Projects\Project3\App.Unity\ ``` Launch the right Unity editor for a project: ```powershell From f9a8ad8afc05cf4f9f7b0171cdc7ef611ef9d549 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Fri, 2 Mar 2018 15:57:54 -0800 Subject: [PATCH 12/28] Support for default Hub installs --- UnitySetup/UnitySetup.psm1 | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index e9105b7..f93fca7 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -443,7 +443,7 @@ function Uninstall-UnitySetupInstance { .DESCRIPTION Get the Unity versions installed and their locations .PARAMETER BasePath - Under what base pattern should we look for Unity installs? Defaults to 'C:\Program Files*\Unity*'. + Under what base patterns should we look for Unity installs? .EXAMPLE Get-UnitySetupInstance #> @@ -452,15 +452,17 @@ function Get-UnitySetupInstance [CmdletBinding()] param( [parameter(Mandatory=$false)] - [string] $BasePath = 'C:\Program Files*\Unity*' + [string[]] $BasePath = @('C:\Program Files*\Unity*','C:\Program Files\Unity\Hub\Editor\*') ) - $Path = [io.path]::Combine("$BasePath", 'Editor\Data\UnityExtensions\Unity\Networking\ivy.xml'); + foreach( $folder in $BasePath ) { + $path = [io.path]::Combine("$folder", 'Editor\Data\UnityExtensions\Unity\Networking\ivy.xml'); - Get-ChildItem $Path -Recurse -ErrorAction Ignore | - ForEach-Object { + Get-ChildItem $path -Recurse -ErrorAction Ignore | + ForEach-Object { [UnitySetupInstance]::new((Join-Path $_.Directory "..\..\..\..\" | Convert-Path)) - } + } + } } <# From 3c64a950e8c94cb0bd94420945ece9b3900efedf Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Fri, 2 Mar 2018 16:13:52 -0800 Subject: [PATCH 13/28] Add aliases for commands commonly ran from the terminal --- UnitySetup/UnitySetup.psd1 | 13 +++---------- UnitySetup/UnitySetup.psm1 | 10 +++++++++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index 941effc..6aa6d34 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -73,15 +73,8 @@ ScriptsToProcess = @() # NestedModules = @() # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -FunctionsToExport = @( - 'Find-UnitySetupInstaller', - 'Get-UnityProjectInstance', - 'Get-UnitySetupInstance', - 'Install-UnitySetupInstance', - 'Select-UnitySetupInstance', - 'Uninstall-UnitySetupInstance', - 'Start-UnityEditor' -) +FunctionsToExport = '*' + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @() @@ -89,7 +82,7 @@ CmdletsToExport = @() VariablesToExport = @() # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -AliasesToExport = @() +AliasesToExport = '*' # DSC resources to export from this module # DscResourcesToExport = @() diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index e9105b7..3cc95ea 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -819,4 +819,12 @@ function Start-UnityEditor if($PassThru) { $process } } } -} \ No newline at end of file +} + +New-Alias -Name gusi -Value Get-UnitySetupInstance +New-Alias -Name gupi -Value Get-UnityProjectInstance +New-Alias -Name susi -Value Select-UnitySetupInstance +New-Alias -Name sue -Value Start-UnityEditor + + +Export-ModuleMember -Function '*-Unity*' -Alias '*' \ No newline at end of file From 317ef6be71a4ef07f94d9a81c195e3e619c89b67 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Mon, 5 Mar 2018 10:26:44 -0800 Subject: [PATCH 14/28] Write a warning if a component is not found --- UnitySetup/UnitySetup.psm1 | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index f93fca7..fedf108 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -231,7 +231,7 @@ function Find-UnitySetupInstaller else { $knownBaseUrls = $knownBaseUrls | Sort-Object -Property @{ Expression={[math]::Abs(($_.CompareTo($linkComponents[0])))}; Ascending=$true} } - + $installerTemplates.Keys | Where-Object { $Components -band $_ } | ForEach-Object { @@ -257,12 +257,17 @@ function Find-UnitySetupInstaller } } - if( $result ) { - $result - break - } + if( $result ) { break } + } + + if( -not $result ) + { + Write-Warning "Unable to find installer for the $_ component." } + else { $result } + } | Sort-Object -Property ComponentType + } <# From 58c29ca0f351f7595e1b4129a5cc4fb5546002a3 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Tue, 6 Mar 2018 15:54:04 -0800 Subject: [PATCH 15/28] Explicit filter here for gallery discovery --- UnitySetup/UnitySetup.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index d1af642..8f64adf 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -73,7 +73,7 @@ ScriptsToProcess = @() # NestedModules = @() # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -FunctionsToExport = '*' +FunctionsToExport = '*-Unity*' # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @() From c8145c5cb2f2ad3476b83e2e721303ca7aa133e0 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Tue, 6 Mar 2018 16:03:51 -0800 Subject: [PATCH 16/28] Another attempt at exports --- UnitySetup/UnitySetup.psd1 | 18 ++++++++++++++++-- UnitySetup/UnitySetup.psm1 | 5 +---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index 8f64adf..b690562 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -73,7 +73,16 @@ ScriptsToProcess = @() # NestedModules = @() # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -FunctionsToExport = '*-Unity*' + +FunctionsToExport = @( + 'Find-UnitySetupInstaller', + 'Get-UnityProjectInstance', + 'Get-UnitySetupInstance', + 'Install-UnitySetupInstance', + 'Select-UnitySetupInstance', + 'Uninstall-UnitySetupInstance', + 'Start-UnityEditor' +) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @() @@ -82,7 +91,12 @@ CmdletsToExport = @() VariablesToExport = @() # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -AliasesToExport = '*' +AliasesToExport = @( + 'gusi', + 'gupi', + 'susi', + 'sue' +) # DSC resources to export from this module # DscResourcesToExport = @() diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index d928da5..5f6e8c0 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -859,7 +859,4 @@ function Start-UnityEditor New-Alias -Name gusi -Value Get-UnitySetupInstance New-Alias -Name gupi -Value Get-UnityProjectInstance New-Alias -Name susi -Value Select-UnitySetupInstance -New-Alias -Name sue -Value Start-UnityEditor - - -Export-ModuleMember -Function '*-Unity*' -Alias '*' \ No newline at end of file +New-Alias -Name sue -Value Start-UnityEditor \ No newline at end of file From 0de5a4f51c99f2f0faaedb27637ec0dc71696ba7 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Tue, 6 Mar 2018 16:58:29 -0800 Subject: [PATCH 17/28] Use install folder for setup instance path --- UnitySetup/UnitySetup.psm1 | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index 5f6e8c0..2f295d8 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -39,7 +39,7 @@ class UnitySetupInstance UnitySetupInstance([string]$path) { - $ivyPath = [io.path]::Combine("$path", 'Data\UnityExtensions\Unity\Networking\ivy.xml'); + $ivyPath = [io.path]::Combine("$path", 'Editor\Data\UnityExtensions\Unity\Networking\ivy.xml'); if(!(Test-Path $ivyPath)) { throw "Path is not a Unity setup: $path"} [xml]$xmlDoc = Get-Content $ivyPath @@ -52,20 +52,20 @@ class UnitySetupInstance $this.Components = [UnitySetupComponentType]::Setup $componentTests = @{ - [UnitySetupComponentType]::Documentation = ,"$Path\Data\Documentation"; - [UnitySetupComponentType]::StandardAssets = ,"$Path\Standard Assets"; - [UnitySetupComponentType]::Windows_IL2CPP = ,"$Path\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; - [UnitySetupComponentType]::Metro = "$Path\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", - "$Path\Data\PlaybackEngines\MetroSupport\Templates\UWP_D3D"; - [UnitySetupComponentType]::UWP_IL2CPP = ,"$Path\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; - [UnitySetupComponentType]::Android = ,"$Path\Data\PlaybackEngines\AndroidPlayer"; - [UnitySetupComponentType]::iOS = , "$Path\Data\PlaybackEngines\iOSSupport"; - [UnitySetupComponentType]::AppleTV = , "$Path\Data\PlaybackEngines\AppleTVSupport"; - [UnitySetupComponentType]::Facebook = , "$Path\Data\PlaybackEngines\Facebook"; - [UnitySetupComponentType]::Linux = , "$Path\Data\PlaybackEngines\LinuxStandaloneSupport"; - [UnitySetupComponentType]::Mac = , "$Path\Data\PlaybackEngines\MacStandaloneSupport"; - [UnitySetupComponentType]::Vuforia = , "$Path\Data\PlaybackEngines\VuforiaSupport"; - [UnitySetupComponentType]::WebGL = , "$Path\Data\PlaybackEngines\WebGLSupport"; + [UnitySetupComponentType]::Documentation = ,"$Path\Editor\Data\Documentation"; + [UnitySetupComponentType]::StandardAssets = ,"$Path\Editor\Standard Assets"; + [UnitySetupComponentType]::Windows_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; + [UnitySetupComponentType]::Metro = "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", + "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_D3D"; + [UnitySetupComponentType]::UWP_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; + [UnitySetupComponentType]::Android = ,"$Path\Editor\Data\PlaybackEngines\AndroidPlayer"; + [UnitySetupComponentType]::iOS = , "$Path\Editor\Data\PlaybackEngines\iOSSupport"; + [UnitySetupComponentType]::AppleTV = , "$Path\Editor\Data\PlaybackEngines\AppleTVSupport"; + [UnitySetupComponentType]::Facebook = , "$Path\Editor\Data\PlaybackEngines\Facebook"; + [UnitySetupComponentType]::Linux = , "$Path\Editor\Data\PlaybackEngines\LinuxStandaloneSupport"; + [UnitySetupComponentType]::Mac = , "$Path\Editor\Data\PlaybackEngines\MacStandaloneSupport"; + [UnitySetupComponentType]::Vuforia = , "$Path\Editor\Data\PlaybackEngines\VuforiaSupport"; + [UnitySetupComponentType]::WebGL = , "$Path\Editor\Data\PlaybackEngines\WebGLSupport"; } $componentTests.Keys | ForEach-Object { @@ -493,7 +493,7 @@ function Get-UnitySetupInstance Get-ChildItem $path -Recurse -ErrorAction Ignore | ForEach-Object { - [UnitySetupInstance]::new((Join-Path $_.Directory "..\..\..\..\" | Convert-Path)) + [UnitySetupInstance]::new((Join-Path $_.Directory "..\..\..\..\..\" | Convert-Path)) } } } From a7f9f6d2a6408f8f9195b9ba02f1e88e82c4531f Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Wed, 7 Mar 2018 13:52:18 -0800 Subject: [PATCH 18/28] Better support for UnitySetupComponent --- UnitySetup/UnitySetup.psd1 | 3 +- UnitySetup/UnitySetup.psm1 | 85 +++++++++++++++++++++++--------------- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index b690562..85b4a98 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -81,7 +81,8 @@ FunctionsToExport = @( 'Install-UnitySetupInstance', 'Select-UnitySetupInstance', 'Uninstall-UnitySetupInstance', - 'Start-UnityEditor' + 'Start-UnityEditor', + 'New-UnitySetupComponent' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index 2f295d8..bdd2832 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -3,7 +3,7 @@ Import-Module powershell-yaml -Force -ErrorAction Stop [Flags()] -enum UnitySetupComponentType +enum UnitySetupComponent { Setup = (1 -shl 0) Documentation = (1 -shl 1) @@ -24,7 +24,7 @@ enum UnitySetupComponentType class UnitySetupInstaller { - [UnitySetupComponentType] $ComponentType + [UnitySetupComponent] $ComponentType [UnityVersion] $Version [int64]$Length [DateTime]$LastModified @@ -34,7 +34,7 @@ class UnitySetupInstaller class UnitySetupInstance { [UnityVersion]$Version - [UnitySetupComponentType]$Components + [UnitySetupComponent]$Components [string]$Path UnitySetupInstance([string]$path) { @@ -49,23 +49,23 @@ class UnitySetupInstance $this.Path = $path $this.Version = $xmlDoc.'ivy-module'.info.unityVersion - $this.Components = [UnitySetupComponentType]::Setup + $this.Components = [UnitySetupComponent]::Setup $componentTests = @{ - [UnitySetupComponentType]::Documentation = ,"$Path\Editor\Data\Documentation"; - [UnitySetupComponentType]::StandardAssets = ,"$Path\Editor\Standard Assets"; - [UnitySetupComponentType]::Windows_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; - [UnitySetupComponentType]::Metro = "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", + [UnitySetupComponent]::Documentation = ,"$Path\Editor\Data\Documentation"; + [UnitySetupComponent]::StandardAssets = ,"$Path\Editor\Standard Assets"; + [UnitySetupComponent]::Windows_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; + [UnitySetupComponent]::Metro = "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_D3D"; - [UnitySetupComponentType]::UWP_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; - [UnitySetupComponentType]::Android = ,"$Path\Editor\Data\PlaybackEngines\AndroidPlayer"; - [UnitySetupComponentType]::iOS = , "$Path\Editor\Data\PlaybackEngines\iOSSupport"; - [UnitySetupComponentType]::AppleTV = , "$Path\Editor\Data\PlaybackEngines\AppleTVSupport"; - [UnitySetupComponentType]::Facebook = , "$Path\Editor\Data\PlaybackEngines\Facebook"; - [UnitySetupComponentType]::Linux = , "$Path\Editor\Data\PlaybackEngines\LinuxStandaloneSupport"; - [UnitySetupComponentType]::Mac = , "$Path\Editor\Data\PlaybackEngines\MacStandaloneSupport"; - [UnitySetupComponentType]::Vuforia = , "$Path\Editor\Data\PlaybackEngines\VuforiaSupport"; - [UnitySetupComponentType]::WebGL = , "$Path\Editor\Data\PlaybackEngines\WebGLSupport"; + [UnitySetupComponent]::UWP_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; + [UnitySetupComponent]::Android = ,"$Path\Editor\Data\PlaybackEngines\AndroidPlayer"; + [UnitySetupComponent]::iOS = , "$Path\Editor\Data\PlaybackEngines\iOSSupport"; + [UnitySetupComponent]::AppleTV = , "$Path\Editor\Data\PlaybackEngines\AppleTVSupport"; + [UnitySetupComponent]::Facebook = , "$Path\Editor\Data\PlaybackEngines\Facebook"; + [UnitySetupComponent]::Linux = , "$Path\Editor\Data\PlaybackEngines\LinuxStandaloneSupport"; + [UnitySetupComponent]::Mac = , "$Path\Editor\Data\PlaybackEngines\MacStandaloneSupport"; + [UnitySetupComponent]::Vuforia = , "$Path\Editor\Data\PlaybackEngines\VuforiaSupport"; + [UnitySetupComponent]::WebGL = , "$Path\Editor\Data\PlaybackEngines\WebGLSupport"; } $componentTests.Keys | ForEach-Object { @@ -159,6 +159,25 @@ class UnityVersion : System.IComparable } } +<# +.Synopsis + Help to create UnitySetupComponent +.PARAMETER Components + What components would you like included? +.EXAMPLE + New-UnitySetupComponent -Components Setup,Metro +#> +function New-UnitySetupComponent +{ + [CmdletBinding()] + param( + [parameter(Mandatory=$true)] + [UnitySetupComponent] $Components + ) + + $Components +} + <# .Synopsis Finds UnitySetup installers for a specified version. @@ -181,7 +200,7 @@ function Find-UnitySetupInstaller [UnityVersion] $Version, [parameter(Mandatory=$false)] - [UnitySetupComponentType] $Components = [UnitySetupComponentType]::All + [UnitySetupComponent] $Components = [UnitySetupComponent]::All ) $unitySetupRegEx = "^(.+)\/([a-z0-9]+)\/Windows64EditorInstaller\/UnitySetup64-(\d+)\.(\d+)\.(\d+)([fpb])(\d+).exe$" @@ -192,21 +211,21 @@ function Find-UnitySetupInstaller ) $installerTemplates = @{ - [UnitySetupComponentType]::Setup = ,"Windows64EditorInstaller/UnitySetup64-$Version.exe"; - [UnitySetupComponentType]::Documentation = ,"WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; - [UnitySetupComponentType]::StandardAssets = ,"WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; - [UnitySetupComponentType]::Metro = ,"TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::UWP_IL2CPP = ,"TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Android = ,"TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::iOS = ,"TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::AppleTV = ,"TargetSupportInstaller/UnitySetup-AppleTV-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Facebook = ,"TargetSupportInstaller/UnitySetup-Facebook-Games-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Linux = ,"TargetSupportInstaller/UnitySetup-Linux-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Mac = "TargetSupportInstaller/UnitySetup-Mac-Support-for-Editor-$Version.exe", + [UnitySetupComponent]::Setup = ,"Windows64EditorInstaller/UnitySetup64-$Version.exe"; + [UnitySetupComponent]::Documentation = ,"WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; + [UnitySetupComponent]::StandardAssets = ,"WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; + [UnitySetupComponent]::Metro = ,"TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::UWP_IL2CPP = ,"TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Android = ,"TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::iOS = ,"TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::AppleTV = ,"TargetSupportInstaller/UnitySetup-AppleTV-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Facebook = ,"TargetSupportInstaller/UnitySetup-Facebook-Games-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Linux = ,"TargetSupportInstaller/UnitySetup-Linux-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Mac = "TargetSupportInstaller/UnitySetup-Mac-Support-for-Editor-$Version.exe", "TargetSupportInstaller/UnitySetup-Mac-Mono-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Vuforia = ,"TargetSupportInstaller/UnitySetup-Vuforia-AR-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::WebGL = ,"TargetSupportInstaller/UnitySetup-WebGL-Support-for-Editor-$Version.exe"; - [UnitySetupComponentType]::Windows_IL2CPP = ,"TargetSupportInstaller/UnitySetup-Windows-IL2CPP-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Vuforia = ,"TargetSupportInstaller/UnitySetup-Vuforia-AR-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::WebGL = ,"TargetSupportInstaller/UnitySetup-WebGL-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Windows_IL2CPP = ,"TargetSupportInstaller/UnitySetup-Windows-IL2CPP-Support-for-Editor-$Version.exe"; } # By default Tls12 protocol is not enabled, but is what backs Unity's website, so enable it @@ -240,7 +259,7 @@ function Find-UnitySetupInstaller { $webResult = Invoke-WebRequest $page -UseBasicParsing $prototypeLink = $webResult.Links | Select-Object -ExpandProperty href -ErrorAction SilentlyContinue | Where-Object { - $_ -match "$($installerTemplates[[UnitySetupComponentType]::Setup])$" + $_ -match "$($installerTemplates[[UnitySetupComponent]::Setup])$" } if($null -ne $prototypeLink) { break } From 75285dcc0f18e779f7dfb9fad14fe1d5751146b0 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Mon, 12 Mar 2018 15:07:07 -0700 Subject: [PATCH 19/28] Update paths in example --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 89ca955..8cbf18b 100644 --- a/README.md +++ b/README.md @@ -29,17 +29,17 @@ Get-UnitySetupInstance # Example output: # Version Components Path # ------- ---------- ---- -# 2017.1.2f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.1.2f1\Editor\ -# 2017.1.3f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.1.3f1\Editor\ -# 2017.2.1f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.2.1f1\Editor\ -# 2017.3.1f1 Setup, Metro, UWP_IL2CPP, Linux, Vuforia C:\Program Files\Unity-2017.3.1f1\Editor\ -# 2018.1.0b4 Setup, Metro, UWP_IL2CPP, Vuforia C:\Program Files\Unity-2018.1.0b4\Editor\ -# 2018.1.0b8 All C:\Program Files\Unity-2018.1.0b8\Editor\ -# 2017.1.0p5 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.0p5\Editor\ -# 2017.1.1f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.1f1\Editor\ -# 2017.1.1p3 Setup, StandardAssets, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.1p3\Editor\ -# 2017.2.0f3 Setup, Metro, UWP_IL2CPP, Vuforia C:\Program Files\Unity.2017.2.0f3\Editor\ -# 2017.3.0f3 Setup, Metro, UWP_IL2CPP, Mac, Vuforia C:\Program Files\Unity.2017.3.0f3\Editor\ +# 2017.1.2f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.1.2f1\ +# 2017.1.3f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.1.3f1\ +# 2017.2.1f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity-2017.2.1f1\ +# 2017.3.1f1 Setup, Metro, UWP_IL2CPP, Linux, Vuforia C:\Program Files\Unity-2017.3.1f1\ +# 2018.1.0b4 Setup, Metro, UWP_IL2CPP, Vuforia C:\Program Files\Unity-2018.1.0b4\ +# 2018.1.0b8 All C:\Program Files\Unity-2018.1.0b8\ +# 2017.1.0p5 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.0p5\ +# 2017.1.1f1 Setup, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.1f1\ +# 2017.1.1p3 Setup, StandardAssets, Metro, UWP_IL2CPP C:\Program Files\Unity.2017.1.1p3\ +# 2017.2.0f3 Setup, Metro, UWP_IL2CPP, Vuforia C:\Program Files\Unity.2017.2.0f3\ +# 2017.3.0f3 Setup, Metro, UWP_IL2CPP, Mac, Vuforia C:\Program Files\Unity.2017.3.0f3\ ``` Select the Unity installs that you want: From 9037f8e19fedbc261e7713cc2d16de5f8eb3d5a0 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Wed, 7 Mar 2018 13:53:27 -0800 Subject: [PATCH 20/28] Added xUnity DSC Resource --- README.md | 24 ++ .../DSCResources/xUnitySetup/xUnitySetup.psm1 | 210 ++++++++++++++++++ .../xUnitySetup/xUnitySetup.schema.mof | Bin 0 -> 816 bytes UnitySetup/Examples/Sample_xUnitySetup.ps1 | 28 +++ .../Examples/Sample_xUnitySetup_Install.ps1 | 16 ++ .../Examples/Sample_xUnitySetup_Uninstall.ps1 | 15 ++ 6 files changed, 293 insertions(+) create mode 100644 UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 create mode 100644 UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof create mode 100644 UnitySetup/Examples/Sample_xUnitySetup.ps1 create mode 100644 UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 create mode 100644 UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 diff --git a/README.md b/README.md index 89ca955..c955c1b 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Install-Module UnitySetup -Scope CurrentUser ## Using +### Cmdlets Find all of your Unity installs: ```powershell Get-UnitySetupInstance @@ -113,6 +114,29 @@ Find-UnitySetupInstaller -Version '2017.3.0f3' | Install-UnitySetupInstance Install-UnitySetupInstance -Installers (Find-UnitySetupInstaller -Version '2017.3.0f3') ``` +### DSC +UnitySetup includes the xUnitySetup DSC Resource. An example configuration might look like: + +```powershell +<# + Install multiple versions of Unity and several components +#> +Configuration Sample_xUnitySetup_Install { + + Import-DscResource -ModuleName UnitySetup + + Node 'localhost' { + + xUnitySetup Unity { + Versions = '2017.3.1f1,2018.1.0b9' + Components = 'Setup', 'Mac', 'Linux', 'Metro', 'iOS' + Ensure = 'Present' + } + } +} +``` + +See more by perusing the `UnitySetup\Examples` folder. # Feedback To file issues or suggestions, please use the [Issues](https://github.com/Microsoft/unitysetup.powershell/issues) page for this project on GitHub. diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 new file mode 100644 index 0000000..aa4b4ac --- /dev/null +++ b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 @@ -0,0 +1,210 @@ + +<# +.Synopsis + Returns the status of Unity installs and the set of their overlapping components. +.Parameter Versions + The versions of Unity to test for. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $Versions + ) + Write-Verbose "Begin executing Get on $Versions" + + [string[]]$splitVersions = $Versions -split ',' | ForEach-Object { $_.Trim() } + + $setupInstances = Get-UnitySetupInstance | Where-Object { $splitVersions -contains $_.Version } + $result = @{ + "Versions" = $setupInstances | Select-Object -ExpandProperty Version | Sort-Object -Unique + "Ensure" = ($setupInstances.Count -gt 0) + } + + Write-Verbose "Found versions: $($result['Versions'])" + + if( $setupInstances.Count -gt 0 ) + { + $components = $setupInstances[0].Components; + for( $i = 1; $i -lt $setupInstances.Count; $i++) + { + $components = $components -band $setupInstances[$i].Components; + } + + $result["Components"] = $components + } + + $result + + Write-Verbose "Found overlapping components: $($result['Components'])" + Write-Verbose "End executing Get on $Versions" +} + +<# +.Synopsis + Installs or uninstalls the specified Versions of Unity and corresponding Components. +.Parameter Versions + What versions are we concered with? +.Parameter Ensure + Should we ensure they're there or ensure they're not? +.Parameter Components + What components are we concerned with? +.Notes + Only uninstalls whole versions of Unity. Ensuring components doesn't + mean other components weren't previously installed and aren't still available. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $Versions, + + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present', + + [System.String[]] + $Components = @('All') + ) + + Write-Verbose "Begin executing Set to Ensure $Versions with $Components are $Ensure" + + [string[]]$splitVersions = $Versions -split ',' | ForEach-Object { $_.Trim() } + + switch($Ensure) { + 'Present' { + foreach($version in $splitVersions) + { + $findArgs = @{ + 'Version' = $version + 'Components' = New-UnitySetupComponent -Components $Components + } + + $installArgs = @{ 'Cache' = "$env:TEMP\.unitysetup" } + + $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version + if($setupInstances.Count -gt 0) { + $findArgs["Components"] = ($findArgs.Components -band (-bnot ($setupInstances[0].Components -band $findArgs.Components))) + $installArgs["Destination"] = $setupInstances[0].Path + } + + # No missing components for this version + if( $findArgs.Components -eq 0 ) { + Write-Verbose "All components of $version were installed" + continue; + } + + Write-Verbose "Finding $($findArgs["Components"]) installers for $version" + $installArgs["Installers"] = Find-UnitySetupInstaller @findArgs -WarningAction Stop + if( $installArgs.Installers.Count -gt 0 ) { + Write-Verbose "Starting install of $($installArgs.Installers.Count) components for $version" + Install-UnitySetupInstance @installArgs + Write-Verbose "Finished install of $($installArgs.Installers.Count) components for $version" + } + } + } + 'Absent' { + $setupInstances = Get-UnitySetupInstance | Where-Object { $splitVersions -contains $_.Version } + Write-Verbose "Found $($setupInstances.Count) instance(s) of $splitVersions" + + if( $setupInstances.Count -gt 0 ) { + Write-Verbose "Starting uninstall of $($setupInstances.Count) versions of Unity" + Uninstall-UnitySetupInstance -Instances $setupInstances + Write-Verbose "Finished uninstall of $($setupInstances.Count) versions of Unity" + } + } + } + + Write-Verbose "End executing Set to Ensure $Versions with $Components are $Ensure" +} + +<# +.Synopsis + Test if the Unity installs are in the desired state. +.Parameter Versions + What versions are we concered with? +.Parameter Ensure + Should we ensure they're there or ensure they're not? +.Parameter Components + What components are we concerned with? +.Notes + This test is not strict. Versions and Components not described are not considered. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $Versions, + + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present', + + [System.String[]] + $Components = @('All') + ) + + Write-Verbose "Begin executing Test to verify $Versions with $Components are $Ensure" + + [string[]]$splitVersions = $Versions -split ',' | ForEach-Object { $_.Trim() } + + $result = $true + switch( $Ensure ) + { + 'Present' { + $setupComponents = New-UnitySetupComponent -Components $Components + foreach($version in $splitVersions) + { + Write-Verbose "Starting test for $version" + $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version + Write-Verbose "Found $($setupInstances.Count) instance(s) of $version" + + if($setupInstances.Count -eq 0) { + Write-Verbose "Found $version missing." + $result = $false + break + } + + $availableComponents = ($setupInstances[0].Components -band $setupComponents) + if($availableComponents -ne $setupComponents){ + $missingComponents = New-UnitySetupComponent ($setupComponents -bxor $availableComponents) + Write-Verbose "Found $version missing $($missingComponents)" + $result = $false + break + } + } + } + 'Absent' { + foreach($version in $splitVersions) + { + $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version + Write-Verbose "Found $($setupInstances.Count) instance(s) of $version" + + if($setupInstances.Count -gt 0) { + Write-Verbose "Found $version installed." + $result = $false + break + } + } + } + } + + $result + + Write-Verbose "End executing Test to verify $Versions with $Components are $Ensure" +} + + +Export-ModuleMember -Function *-TargetResource + diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..8d0d4be07780462d2f1c9a1cb7afb386bfbcef3f GIT binary patch literal 816 zcmbV~TT8=05QWdP;D1>1WI;q<^+B{MhrziT4cZdjlgp!PO6>uA%QX+P18t+H zE8?@D@GPJQL1&JJx}!EZ#*7$-2bHs%@D=Qb#8R-HlLPm{TzBL20jBoH&%8c0n;xuc|8M_Yy@k7R+_~Lb&YV^Kdny*3T{zb+*?q3N XRXVe-vV0HCyglA(sd!PX_S${`CTNO? literal 0 HcmV?d00001 diff --git a/UnitySetup/Examples/Sample_xUnitySetup.ps1 b/UnitySetup/Examples/Sample_xUnitySetup.ps1 new file mode 100644 index 0000000..e374e93 --- /dev/null +++ b/UnitySetup/Examples/Sample_xUnitySetup.ps1 @@ -0,0 +1,28 @@ +<# + Create a custom configuration by passing in necessary values +#> +Configuration Sample_xUnitySetup { + param + ( + [System.String] + $Versions = '2017.3.0f3,2018.1.0b9', + + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [System.String[]] + $Components = @('Setup','Linux','Metro','Mac','iOS') + ) + + Import-DscResource -ModuleName UnitySetup + + Node 'localhost' { + + xUnitySetup Unity { + Versions = $Versions + Components = $Components + Ensure = $Ensure + } + } +} \ No newline at end of file diff --git a/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 b/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 new file mode 100644 index 0000000..d9ebc8e --- /dev/null +++ b/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 @@ -0,0 +1,16 @@ +<# + Install multiple versions of Unity and several components +#> +Configuration Sample_xUnitySetup_Install { + + Import-DscResource -ModuleName UnitySetup + + Node 'localhost' { + + xUnitySetup Unity { + Versions = '2017.3.1f1,2018.1.0b9' + Components = 'Setup', 'Mac', 'Linux', 'Metro', 'iOS' + Ensure = 'Present' + } + } +} \ No newline at end of file diff --git a/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 b/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 new file mode 100644 index 0000000..8e09483 --- /dev/null +++ b/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 @@ -0,0 +1,15 @@ +<# + Uninstall multiple versions of Unity +#> +Configuration Sample_xUnitySetup_Install { + + Import-DscResource -ModuleName UnitySetup + + Node 'localhost' { + + xUnitySetup Unity { + Versions = '2017.3.1f1,2018.1.0b9' + Ensure = 'Absent' + } + } +} \ No newline at end of file From a4c66a831754cfdaadfc6d8a765f5eca0d563866 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Mon, 12 Mar 2018 15:40:33 -0700 Subject: [PATCH 21/28] Fix get Ensure value --- UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 index aa4b4ac..e84b7f8 100644 --- a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 +++ b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 @@ -22,7 +22,7 @@ function Get-TargetResource $setupInstances = Get-UnitySetupInstance | Where-Object { $splitVersions -contains $_.Version } $result = @{ "Versions" = $setupInstances | Select-Object -ExpandProperty Version | Sort-Object -Unique - "Ensure" = ($setupInstances.Count -gt 0) + "Ensure" = if($setupInstances.Count -gt 0) { 'Present'} else { 'Absent' } } Write-Verbose "Found versions: $($result['Versions'])" From f8dbc9d5497855d56a6e271a32a41a7177f20286 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Mon, 19 Mar 2018 15:02:43 -0700 Subject: [PATCH 22/28] Apply VS Code Format Document --- .../DSCResources/xUnitySetup/xUnitySetup.psm1 | 55 +- UnitySetup/Examples/Sample_xUnitySetup.ps1 | 6 +- .../Examples/Sample_xUnitySetup_Install.ps1 | 4 +- .../Examples/Sample_xUnitySetup_Uninstall.ps1 | 2 +- UnitySetup/UnitySetup.psd1 | 188 +++--- UnitySetup/UnitySetup.psm1 | 537 ++++++++---------- build.ps1 | 8 +- 7 files changed, 362 insertions(+), 438 deletions(-) diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 index e84b7f8..693a701 100644 --- a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 +++ b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 @@ -5,8 +5,7 @@ .Parameter Versions The versions of Unity to test for. #> -function Get-TargetResource -{ +function Get-TargetResource { [CmdletBinding()] [OutputType([System.Collections.Hashtable])] param @@ -22,16 +21,14 @@ function Get-TargetResource $setupInstances = Get-UnitySetupInstance | Where-Object { $splitVersions -contains $_.Version } $result = @{ "Versions" = $setupInstances | Select-Object -ExpandProperty Version | Sort-Object -Unique - "Ensure" = if($setupInstances.Count -gt 0) { 'Present'} else { 'Absent' } + "Ensure" = if ($setupInstances.Count -gt 0) { 'Present'} else { 'Absent' } } Write-Verbose "Found versions: $($result['Versions'])" - if( $setupInstances.Count -gt 0 ) - { + if ( $setupInstances.Count -gt 0 ) { $components = $setupInstances[0].Components; - for( $i = 1; $i -lt $setupInstances.Count; $i++) - { + for ( $i = 1; $i -lt $setupInstances.Count; $i++) { $components = $components -band $setupInstances[$i].Components; } @@ -57,8 +54,7 @@ function Get-TargetResource Only uninstalls whole versions of Unity. Ensuring components doesn't mean other components weren't previously installed and aren't still available. #> -function Set-TargetResource -{ +function Set-TargetResource { [CmdletBinding()] param ( @@ -66,44 +62,43 @@ function Set-TargetResource [System.String] $Versions, - [ValidateSet("Present","Absent")] + [ValidateSet("Present", "Absent")] [System.String] $Ensure = 'Present', [System.String[]] - $Components = @('All') + $Components = @('All') ) Write-Verbose "Begin executing Set to Ensure $Versions with $Components are $Ensure" [string[]]$splitVersions = $Versions -split ',' | ForEach-Object { $_.Trim() } - switch($Ensure) { + switch ($Ensure) { 'Present' { - foreach($version in $splitVersions) - { + foreach ($version in $splitVersions) { $findArgs = @{ - 'Version' = $version + 'Version' = $version 'Components' = New-UnitySetupComponent -Components $Components } $installArgs = @{ 'Cache' = "$env:TEMP\.unitysetup" } $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version - if($setupInstances.Count -gt 0) { + if ($setupInstances.Count -gt 0) { $findArgs["Components"] = ($findArgs.Components -band (-bnot ($setupInstances[0].Components -band $findArgs.Components))) $installArgs["Destination"] = $setupInstances[0].Path } # No missing components for this version - if( $findArgs.Components -eq 0 ) { + if ( $findArgs.Components -eq 0 ) { Write-Verbose "All components of $version were installed" continue; } Write-Verbose "Finding $($findArgs["Components"]) installers for $version" $installArgs["Installers"] = Find-UnitySetupInstaller @findArgs -WarningAction Stop - if( $installArgs.Installers.Count -gt 0 ) { + if ( $installArgs.Installers.Count -gt 0 ) { Write-Verbose "Starting install of $($installArgs.Installers.Count) components for $version" Install-UnitySetupInstance @installArgs Write-Verbose "Finished install of $($installArgs.Installers.Count) components for $version" @@ -114,7 +109,7 @@ function Set-TargetResource $setupInstances = Get-UnitySetupInstance | Where-Object { $splitVersions -contains $_.Version } Write-Verbose "Found $($setupInstances.Count) instance(s) of $splitVersions" - if( $setupInstances.Count -gt 0 ) { + if ( $setupInstances.Count -gt 0 ) { Write-Verbose "Starting uninstall of $($setupInstances.Count) versions of Unity" Uninstall-UnitySetupInstance -Instances $setupInstances Write-Verbose "Finished uninstall of $($setupInstances.Count) versions of Unity" @@ -137,8 +132,7 @@ function Set-TargetResource .Notes This test is not strict. Versions and Components not described are not considered. #> -function Test-TargetResource -{ +function Test-TargetResource { [CmdletBinding()] [OutputType([System.Boolean])] param @@ -147,7 +141,7 @@ function Test-TargetResource [System.String] $Versions, - [ValidateSet("Present","Absent")] + [ValidateSet("Present", "Absent")] [System.String] $Ensure = 'Present', @@ -160,24 +154,22 @@ function Test-TargetResource [string[]]$splitVersions = $Versions -split ',' | ForEach-Object { $_.Trim() } $result = $true - switch( $Ensure ) - { + switch ( $Ensure ) { 'Present' { $setupComponents = New-UnitySetupComponent -Components $Components - foreach($version in $splitVersions) - { + foreach ($version in $splitVersions) { Write-Verbose "Starting test for $version" $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version Write-Verbose "Found $($setupInstances.Count) instance(s) of $version" - if($setupInstances.Count -eq 0) { + if ($setupInstances.Count -eq 0) { Write-Verbose "Found $version missing." $result = $false break } $availableComponents = ($setupInstances[0].Components -band $setupComponents) - if($availableComponents -ne $setupComponents){ + if ($availableComponents -ne $setupComponents) { $missingComponents = New-UnitySetupComponent ($setupComponents -bxor $availableComponents) Write-Verbose "Found $version missing $($missingComponents)" $result = $false @@ -185,13 +177,12 @@ function Test-TargetResource } } } - 'Absent' { - foreach($version in $splitVersions) - { + 'Absent' { + foreach ($version in $splitVersions) { $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version Write-Verbose "Found $($setupInstances.Count) instance(s) of $version" - if($setupInstances.Count -gt 0) { + if ($setupInstances.Count -gt 0) { Write-Verbose "Found $version installed." $result = $false break diff --git a/UnitySetup/Examples/Sample_xUnitySetup.ps1 b/UnitySetup/Examples/Sample_xUnitySetup.ps1 index e374e93..cef25f1 100644 --- a/UnitySetup/Examples/Sample_xUnitySetup.ps1 +++ b/UnitySetup/Examples/Sample_xUnitySetup.ps1 @@ -12,7 +12,7 @@ Configuration Sample_xUnitySetup { $Ensure = 'Present', [System.String[]] - $Components = @('Setup','Linux','Metro','Mac','iOS') + $Components = @('Setup', 'Linux', 'Metro', 'Mac', 'iOS') ) Import-DscResource -ModuleName UnitySetup @@ -20,9 +20,9 @@ Configuration Sample_xUnitySetup { Node 'localhost' { xUnitySetup Unity { - Versions = $Versions + Versions = $Versions Components = $Components - Ensure = $Ensure + Ensure = $Ensure } } } \ No newline at end of file diff --git a/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 b/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 index d9ebc8e..c729b99 100644 --- a/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 +++ b/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 @@ -8,9 +8,9 @@ Configuration Sample_xUnitySetup_Install { Node 'localhost' { xUnitySetup Unity { - Versions = '2017.3.1f1,2018.1.0b9' + Versions = '2017.3.1f1,2018.1.0b9' Components = 'Setup', 'Mac', 'Linux', 'Metro', 'iOS' - Ensure = 'Present' + Ensure = 'Present' } } } \ No newline at end of file diff --git a/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 b/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 index 8e09483..73e0f36 100644 --- a/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 +++ b/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 @@ -9,7 +9,7 @@ Configuration Sample_xUnitySetup_Install { xUnitySetup Unity { Versions = '2017.3.1f1,2018.1.0b9' - Ensure = 'Absent' + Ensure = 'Absent' } } } \ No newline at end of file diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index 85b4a98..a0c2102 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -10,142 +10,142 @@ @{ -# Script module or binary module file associated with this manifest. -RootModule = 'UnitySetup' + # Script module or binary module file associated with this manifest. + RootModule = 'UnitySetup' -# Version number of this module. -ModuleVersion = '3.0' + # Version number of this module. + ModuleVersion = '3.0' -# Supported PSEditions -# CompatiblePSEditions = @() + # Supported PSEditions + # CompatiblePSEditions = @() -# ID used to uniquely identify this module -GUID = '6dc524ef-5f56-4bc3-b04d-3c2906898f40' + # ID used to uniquely identify this module + GUID = '6dc524ef-5f56-4bc3-b04d-3c2906898f40' -# Author of this module -Author = 'Josh Wittner' + # Author of this module + Author = 'Josh Wittner' -# Company or vendor of this module -CompanyName = 'Microsoft' + # Company or vendor of this module + CompanyName = 'Microsoft' -# Copyright statement for this module -Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' + # Copyright statement for this module + Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' -# Description of the functionality provided by this module -Description = 'Tools for managing and automating your Unity installs and projects.' + # Description of the functionality provided by this module + Description = 'Tools for managing and automating your Unity installs and projects.' -# Minimum version of the Windows PowerShell engine required by this module -# PowerShellVersion = '' + # Minimum version of the Windows PowerShell engine required by this module + # PowerShellVersion = '' -# Name of the Windows PowerShell host required by this module -# PowerShellHostName = '' + # Name of the Windows PowerShell host required by this module + # PowerShellHostName = '' -# Minimum version of the Windows PowerShell host required by this module -# PowerShellHostVersion = '' + # Minimum version of the Windows PowerShell host required by this module + # PowerShellHostVersion = '' -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# CLRVersion = '' + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # CLRVersion = '' -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' -# Modules that must be imported into the global environment prior to importing this module -RequiredModules = @( - @{ModuleName="powershell-yaml"; ModuleVersion="0.3"; Guid = "6a75a662-7f53-425a-9777-ee61284407da"} + # Modules that must be imported into the global environment prior to importing this module + RequiredModules = @( + @{ModuleName = "powershell-yaml"; ModuleVersion = "0.3"; Guid = "6a75a662-7f53-425a-9777-ee61284407da"} ) -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -ScriptsToProcess = @() + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + ScriptsToProcess = @() -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() + # Format files (.ps1xml) to be loaded when importing this module + # FormatsToProcess = @() -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -FunctionsToExport = @( - 'Find-UnitySetupInstaller', - 'Get-UnityProjectInstance', - 'Get-UnitySetupInstance', - 'Install-UnitySetupInstance', - 'Select-UnitySetupInstance', - 'Uninstall-UnitySetupInstance', - 'Start-UnityEditor', - 'New-UnitySetupComponent' -) + FunctionsToExport = @( + 'Find-UnitySetupInstaller', + 'Get-UnityProjectInstance', + 'Get-UnitySetupInstance', + 'Install-UnitySetupInstance', + 'Select-UnitySetupInstance', + 'Uninstall-UnitySetupInstance', + 'Start-UnityEditor', + 'New-UnitySetupComponent' + ) -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -CmdletsToExport = @() + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() -# Variables to export from this module -VariablesToExport = @() + # Variables to export from this module + VariablesToExport = @() -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -AliasesToExport = @( - 'gusi', - 'gupi', - 'susi', - 'sue' -) + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @( + 'gusi', + 'gupi', + 'susi', + 'sue' + ) -# DSC resources to export from this module -# DscResourcesToExport = @() + # DSC resources to export from this module + # DscResourcesToExport = @() -# List of all modules packaged with this module -# ModuleList = @() + # List of all modules packaged with this module + # ModuleList = @() -# List of all files packaged with this module -# FileList = @() + # List of all files packaged with this module + # FileList = @() -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ - PSData = @{ + PSData = @{ - # Tags applied to this module. These help with module discovery in online galleries. - Tags = 'Unity' + # Tags applied to this module. These help with module discovery in online galleries. + Tags = 'Unity' - # A URL to the license for this module. - LicenseUri = 'https://github.com/Microsoft/unitysetup.powershell/blob/master/LICENSE' + # A URL to the license for this module. + LicenseUri = 'https://github.com/Microsoft/unitysetup.powershell/blob/master/LICENSE' - # A URL to the main website for this project. - ProjectUri = 'https://github.com/Microsoft/unitysetup.powershell' + # A URL to the main website for this project. + ProjectUri = 'https://github.com/Microsoft/unitysetup.powershell' - # A URL to an icon representing this module. - # IconUri = '' + # A URL to an icon representing this module. + # IconUri = '' - # ReleaseNotes of this module - # ReleaseNotes = '' + # ReleaseNotes of this module + # ReleaseNotes = '' - # Prerelease string of this module - # Prerelease = '' + # Prerelease string of this module + # Prerelease = '' - # Flag to indicate whether the module requires explicit user acceptance for install/update - # RequireLicenseAcceptance = $false + # Flag to indicate whether the module requires explicit user acceptance for install/update + # RequireLicenseAcceptance = $false - # External dependent modules of this module - # ExternalModuleDependencies = @() + # External dependent modules of this module + # ExternalModuleDependencies = @() - } # End of PSData hashtable + } # End of PSData hashtable - } # End of PrivateData hashtable + } # End of PrivateData hashtable -# HelpInfo URI of this module -HelpInfoURI = 'https://github.com/Microsoft/unitysetup.powershell/blob/master/README.md' + # HelpInfo URI of this module + HelpInfoURI = 'https://github.com/Microsoft/unitysetup.powershell/blob/master/README.md' -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' } diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index bdd2832..3a4b659 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -3,8 +3,7 @@ Import-Module powershell-yaml -Force -ErrorAction Stop [Flags()] -enum UnitySetupComponent -{ +enum UnitySetupComponent { Setup = (1 -shl 0) Documentation = (1 -shl 1) StandardAssets = (1 -shl 2) @@ -22,8 +21,7 @@ enum UnitySetupComponent All = (1 -shl 14) - 1 } -class UnitySetupInstaller -{ +class UnitySetupInstaller { [UnitySetupComponent] $ComponentType [UnityVersion] $Version [int64]$Length @@ -31,8 +29,7 @@ class UnitySetupInstaller [string]$DownloadUrl } -class UnitySetupInstance -{ +class UnitySetupInstance { [UnityVersion]$Version [UnitySetupComponent]$Components [string]$Path @@ -40,10 +37,10 @@ class UnitySetupInstance UnitySetupInstance([string]$path) { $ivyPath = [io.path]::Combine("$path", 'Editor\Data\UnityExtensions\Unity\Networking\ivy.xml'); - if(!(Test-Path $ivyPath)) { throw "Path is not a Unity setup: $path"} + if (!(Test-Path $ivyPath)) { throw "Path is not a Unity setup: $path"} [xml]$xmlDoc = Get-Content $ivyPath - if( !($xmlDoc.'ivy-module'.info.unityVersion)) { + if ( !($xmlDoc.'ivy-module'.info.unityVersion)) { throw "Unity setup ivy is missing version: $ivyPath" } @@ -52,13 +49,13 @@ class UnitySetupInstance $this.Components = [UnitySetupComponent]::Setup $componentTests = @{ - [UnitySetupComponent]::Documentation = ,"$Path\Editor\Data\Documentation"; - [UnitySetupComponent]::StandardAssets = ,"$Path\Editor\Standard Assets"; - [UnitySetupComponent]::Windows_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; - [UnitySetupComponent]::Metro = "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", - "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_D3D"; - [UnitySetupComponent]::UWP_IL2CPP = ,"$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; - [UnitySetupComponent]::Android = ,"$Path\Editor\Data\PlaybackEngines\AndroidPlayer"; + [UnitySetupComponent]::Documentation = , "$Path\Editor\Data\Documentation"; + [UnitySetupComponent]::StandardAssets = , "$Path\Editor\Standard Assets"; + [UnitySetupComponent]::Windows_IL2CPP = , "$Path\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win32_development_il2cpp"; + [UnitySetupComponent]::Metro = "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_.NET_D3D", + "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_D3D"; + [UnitySetupComponent]::UWP_IL2CPP = , "$Path\Editor\Data\PlaybackEngines\MetroSupport\Templates\UWP_IL2CPP_D3D"; + [UnitySetupComponent]::Android = , "$Path\Editor\Data\PlaybackEngines\AndroidPlayer"; [UnitySetupComponent]::iOS = , "$Path\Editor\Data\PlaybackEngines\iOSSupport"; [UnitySetupComponent]::AppleTV = , "$Path\Editor\Data\PlaybackEngines\AppleTVSupport"; [UnitySetupComponent]::Facebook = , "$Path\Editor\Data\PlaybackEngines\Facebook"; @@ -69,8 +66,8 @@ class UnitySetupInstance } $componentTests.Keys | ForEach-Object { - foreach( $test in $componentTests[$_] ) { - if( Test-Path -PathType Container -Path $test ) { + foreach ( $test in $componentTests[$_] ) { + if ( Test-Path -PathType Container -Path $test ) { $this.Components += $_ break; } @@ -79,25 +76,23 @@ class UnitySetupInstance } } -class UnityProjectInstance -{ +class UnityProjectInstance { [UnityVersion]$Version [string]$Path UnityProjectInstance([string]$path) { $versionFile = [io.path]::Combine($path, "ProjectSettings\ProjectVersion.txt") - if(!(Test-Path $versionFile)) { throw "Path is not a Unity project: $path"} + if (!(Test-Path $versionFile)) { throw "Path is not a Unity project: $path"} $fileVersion = (Get-Content $versionFile -Raw | ConvertFrom-Yaml)['m_EditorVersion']; - if(!$fileVersion) { throw "Project is missing a version in: $versionFile"} + if (!$fileVersion) { throw "Project is missing a version in: $versionFile"} $this.Path = $path $this.Version = $fileVersion } } -class UnityVersion : System.IComparable -{ +class UnityVersion : System.IComparable { [int] $Major; [int] $Minor; [int] $Revision; @@ -107,53 +102,51 @@ class UnityVersion : System.IComparable [string] ToString() { $result = "$($this.Major).$($this.Minor).$($this.Revision)$($this.Release)$($this.Build)" - if( $this.Suffix ) { $result += "-$($this.Suffix)"} + if ( $this.Suffix ) { $result += "-$($this.Suffix)"} return $result } - UnityVersion([string] $version){ + UnityVersion([string] $version) { $parts = $version.Split('-') $parts[0] -match "(\d+)\.(\d+)\.(\d+)([fpb])(\d+)" | Out-Null - if( $Matches.Count -ne 6 ){ throw "Invalid unity version: $version" } + if ( $Matches.Count -ne 6 ) { throw "Invalid unity version: $version" } $this.Major = [int]($Matches[1]); $this.Minor = [int]($Matches[2]); $this.Revision = [int]($Matches[3]); $this.Release = [char]($Matches[4]); $this.Build = [int]($Matches[5]); - if($parts.Length -gt 1) { + if ($parts.Length -gt 1) { $this.Suffix = $parts[1]; } } - [int] CompareTo([object]$obj) - { - if($null -eq $obj) { return 1 } - if($obj -isnot [UnityVersion]) { throw "Object is not a UnityVersion"} + [int] CompareTo([object]$obj) { + if ($null -eq $obj) { return 1 } + if ($obj -isnot [UnityVersion]) { throw "Object is not a UnityVersion"} return [UnityVersion]::Compare($this, $obj) } - static [int] Compare([UnityVersion]$a, [UnityVersion]$b) - { - if($a.Major -lt $b.Major) { return -1 } - if($a.Major -gt $b.Major) { return 1 } + static [int] Compare([UnityVersion]$a, [UnityVersion]$b) { + if ($a.Major -lt $b.Major) { return -1 } + if ($a.Major -gt $b.Major) { return 1 } - if($a.Minor -lt $b.Minor) { return -1 } - if($a.Minor -gt $b.Minor) { return 1 } + if ($a.Minor -lt $b.Minor) { return -1 } + if ($a.Minor -gt $b.Minor) { return 1 } - if($a.Revision -lt $b.Revision) { return -1 } - if($a.Revision -gt $b.Revision) { return 1 } + if ($a.Revision -lt $b.Revision) { return -1 } + if ($a.Revision -gt $b.Revision) { return 1 } - if($a.Release -lt $b.Release) { return -1 } - if($a.Release -gt $b.Release) { return 1 } + if ($a.Release -lt $b.Release) { return -1 } + if ($a.Release -gt $b.Release) { return 1 } - if($a.Build -lt $b.Build) { return -1 } - if($a.Build -gt $b.Build) { return 1 } + if ($a.Build -lt $b.Build) { return -1 } + if ($a.Build -gt $b.Build) { return 1 } - if($a.Suffix -lt $b.Suffix) { return -1 } - if($a.Suffix -gt $b.Suffix) { return 1 } + if ($a.Suffix -lt $b.Suffix) { return -1 } + if ($a.Suffix -gt $b.Suffix) { return 1 } return 0 } @@ -167,11 +160,10 @@ class UnityVersion : System.IComparable .EXAMPLE New-UnitySetupComponent -Components Setup,Metro #> -function New-UnitySetupComponent -{ +function New-UnitySetupComponent { [CmdletBinding()] param( - [parameter(Mandatory=$true)] + [parameter(Mandatory = $true)] [UnitySetupComponent] $Components ) @@ -192,14 +184,13 @@ function New-UnitySetupComponent .EXAMPLE Find-UnitySetupInstaller -Version 2017.3.0f3 -Components Setup,Documentation #> -function Find-UnitySetupInstaller -{ +function Find-UnitySetupInstaller { [CmdletBinding()] param( - [parameter(Mandatory=$true)] + [parameter(Mandatory = $true)] [UnityVersion] $Version, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [UnitySetupComponent] $Components = [UnitySetupComponent]::All ) @@ -211,110 +202,101 @@ function Find-UnitySetupInstaller ) $installerTemplates = @{ - [UnitySetupComponent]::Setup = ,"Windows64EditorInstaller/UnitySetup64-$Version.exe"; - [UnitySetupComponent]::Documentation = ,"WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; - [UnitySetupComponent]::StandardAssets = ,"WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; - [UnitySetupComponent]::Metro = ,"TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::UWP_IL2CPP = ,"TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::Android = ,"TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::iOS = ,"TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::AppleTV = ,"TargetSupportInstaller/UnitySetup-AppleTV-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::Facebook = ,"TargetSupportInstaller/UnitySetup-Facebook-Games-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::Linux = ,"TargetSupportInstaller/UnitySetup-Linux-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Setup = , "Windows64EditorInstaller/UnitySetup64-$Version.exe"; + [UnitySetupComponent]::Documentation = , "WindowsDocumentationInstaller/UnityDocumentationSetup-$Version.exe"; + [UnitySetupComponent]::StandardAssets = , "WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-$Version.exe"; + [UnitySetupComponent]::Metro = , "TargetSupportInstaller/UnitySetup-Metro-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::UWP_IL2CPP = , "TargetSupportInstaller/UnitySetup-UWP-IL2CPP-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Android = , "TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::iOS = , "TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::AppleTV = , "TargetSupportInstaller/UnitySetup-AppleTV-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Facebook = , "TargetSupportInstaller/UnitySetup-Facebook-Games-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Linux = , "TargetSupportInstaller/UnitySetup-Linux-Support-for-Editor-$Version.exe"; [UnitySetupComponent]::Mac = "TargetSupportInstaller/UnitySetup-Mac-Support-for-Editor-$Version.exe", - "TargetSupportInstaller/UnitySetup-Mac-Mono-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::Vuforia = ,"TargetSupportInstaller/UnitySetup-Vuforia-AR-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::WebGL = ,"TargetSupportInstaller/UnitySetup-WebGL-Support-for-Editor-$Version.exe"; - [UnitySetupComponent]::Windows_IL2CPP = ,"TargetSupportInstaller/UnitySetup-Windows-IL2CPP-Support-for-Editor-$Version.exe"; + "TargetSupportInstaller/UnitySetup-Mac-Mono-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Vuforia = , "TargetSupportInstaller/UnitySetup-Vuforia-AR-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::WebGL = , "TargetSupportInstaller/UnitySetup-WebGL-Support-for-Editor-$Version.exe"; + [UnitySetupComponent]::Windows_IL2CPP = , "TargetSupportInstaller/UnitySetup-Windows-IL2CPP-Support-for-Editor-$Version.exe"; } # By default Tls12 protocol is not enabled, but is what backs Unity's website, so enable it $secProtocol = [System.Net.ServicePointManager]::SecurityProtocol - if( ($secProtocol -band [System.Net.SecurityProtocolType]::Tls12) -eq 0 ) - { + if ( ($secProtocol -band [System.Net.SecurityProtocolType]::Tls12) -eq 0 ) { $secProtocol += [System.Net.SecurityProtocolType]::Tls12; [System.Net.ServicePointManager]::SecurityProtocol = $secProtocol } # Every release type has a different pattern for finding installers $searchPages = @() - switch($Version.Release) - { + switch ($Version.Release) { 'f' { $searchPages += "https://unity3d.com/get-unity/download/archive" } 'b' { $searchPages += "https://unity3d.com/unity/beta/unity$Version" } 'p' { - $patchPage = "https://unity3d.com/unity/qa/patch-releases?version=$($Version.Major).$($Version.Minor)" - $searchPages += $patchPage - - $webResult = Invoke-WebRequest $patchPage -UseBasicParsing - $searchPages += $webResult.Links | Where-Object { - $_.href -match "\/unity\/qa\/patch-releases\?version=$($Version.Major)\.$($Version.Minor)&page=(\d+)" -and $Matches[1] -gt 1 - } | ForEach-Object { - "https://unity3d.com/unity/qa/patch-releases?version=$($Version.Major).$($Version.Minor)&page=$($Matches[1])" - } + $patchPage = "https://unity3d.com/unity/qa/patch-releases?version=$($Version.Major).$($Version.Minor)" + $searchPages += $patchPage + + $webResult = Invoke-WebRequest $patchPage -UseBasicParsing + $searchPages += $webResult.Links | Where-Object { + $_.href -match "\/unity\/qa\/patch-releases\?version=$($Version.Major)\.$($Version.Minor)&page=(\d+)" -and $Matches[1] -gt 1 + } | ForEach-Object { + "https://unity3d.com/unity/qa/patch-releases?version=$($Version.Major).$($Version.Minor)&page=$($Matches[1])" + } } } - foreach($page in $searchPages) - { + foreach ($page in $searchPages) { $webResult = Invoke-WebRequest $page -UseBasicParsing $prototypeLink = $webResult.Links | Select-Object -ExpandProperty href -ErrorAction SilentlyContinue | Where-Object { $_ -match "$($installerTemplates[[UnitySetupComponent]::Setup])$" } - if($null -ne $prototypeLink) { break } + if ($null -ne $prototypeLink) { break } } - if($null -eq $prototypeLink) - { + if ($null -eq $prototypeLink) { throw "Could not find archives for Unity version $Version" } $linkComponents = $prototypeLink -split $unitySetupRegEx -ne "" - if($knownBaseUrls -notcontains $linkComponents[0]) { + if ($knownBaseUrls -notcontains $linkComponents[0]) { $knownBaseUrls = $linkComponents[0], $knownBaseUrls } else { - $knownBaseUrls = $knownBaseUrls | Sort-Object -Property @{ Expression={[math]::Abs(($_.CompareTo($linkComponents[0])))}; Ascending=$true} + $knownBaseUrls = $knownBaseUrls | Sort-Object -Property @{ Expression = {[math]::Abs(($_.CompareTo($linkComponents[0])))}; Ascending = $true} } - $installerTemplates.Keys | - Where-Object { $Components -band $_ } | - ForEach-Object { - $templates = $installerTemplates.Item($_); - $result = $null - foreach ($template in $templates ) { - foreach ( $baseUrl in $knownBaseUrls) { - $endpoint = [uri][System.IO.Path]::Combine($baseUrl, $linkComponents[1], $template); - try { - $testResult = Invoke-WebRequest $endpoint -Method HEAD -UseBasicParsing - $result = New-Object UnitySetupInstaller -Property @{ - 'ComponentType' = $_; - 'Version' = $Version; - 'DownloadUrl' = $endpoint; - 'Length' = [int64]$testResult.Headers['Content-Length']; - 'LastModified' = ([System.DateTime]$testResult.Headers['Last-Modified']); - } - - break + $installerTemplates.Keys | Where-Object { $Components -band $_ } | ForEach-Object { + $templates = $installerTemplates.Item($_); + $result = $null + foreach ($template in $templates ) { + foreach ( $baseUrl in $knownBaseUrls) { + $endpoint = [uri][System.IO.Path]::Combine($baseUrl, $linkComponents[1], $template); + try { + $testResult = Invoke-WebRequest $endpoint -Method HEAD -UseBasicParsing + $result = New-Object UnitySetupInstaller -Property @{ + 'ComponentType' = $_; + 'Version' = $Version; + 'DownloadUrl' = $endpoint; + 'Length' = [int64]$testResult.Headers['Content-Length']; + 'LastModified' = ([System.DateTime]$testResult.Headers['Last-Modified']); } - catch { - Write-Verbose "$endpoint failed: $_" - } - } - - if( $result ) { break } - } - if( -not $result ) - { - Write-Warning "Unable to find installer for the $_ component." + break + } + catch { + Write-Verbose "$endpoint failed: $_" + } } - else { $result } - } | Sort-Object -Property ComponentType + if ( $result ) { break } + } + if ( -not $result ) { + Write-Warning "Unable to find installer for the $_ component." + } + else { $result } + } | Sort-Object -Property ComponentType } <# @@ -333,29 +315,26 @@ function Find-UnitySetupInstaller .EXAMPLE Find-UnitySetupInstaller -Version 2017.3.0f3 | Install-UnitySetupInstance -Destination D:\Unity-2017.3.0f3 #> -function Install-UnitySetupInstance -{ +function Install-UnitySetupInstance { [CmdletBinding()] - [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Scope='Function')] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Scope = 'Function')] param( - [parameter(ValueFromPipeline=$true)] - [UnitySetupInstaller[]] $Installers, + [parameter(ValueFromPipeline = $true)] + [UnitySetupInstaller[]] $Installers, - [parameter(Mandatory=$false)] - [string]$Destination, + [parameter(Mandatory = $false)] + [string]$Destination, - [parameter(Mandatory=$false)] - [string]$Cache = [io.Path]::Combine($env:USERPROFILE, ".unitysetup"), + [parameter(Mandatory = $false)] + [string]$Cache = [io.Path]::Combine($env:USERPROFILE, ".unitysetup"), - [parameter(Mandatory=$false)] - [ValidateSet('Open','RunAs')] - [string]$Verb + [parameter(Mandatory = $false)] + [ValidateSet('Open', 'RunAs')] + [string]$Verb ) - process - { - if(!(Test-Path $Cache -PathType Container)) - { + process { + if (!(Test-Path $Cache -PathType Container)) { New-Item $Cache -ItemType Directory -ErrorAction Stop | Out-Null } @@ -364,24 +343,21 @@ function Install-UnitySetupInstance $downloadSource = @() $downloadDest = @() - foreach( $i in $Installers) - { + foreach ( $i in $Installers) { $fileName = [io.Path]::GetFileName($i.DownloadUrl) $destPath = [io.Path]::Combine($Cache, "Installers\Unity-$($i.Version)\$fileName") - $localInstallers += ,$destPath - if($Destination) { - $localDestinations += ,$Destination + $localInstallers += , $destPath + if ($Destination) { + $localDestinations += , $Destination } else { - $localDestinations += ,"C:\Program Files\Unity-$($i.Version)" + $localDestinations += , "C:\Program Files\Unity-$($i.Version)" } - if( Test-Path $destPath ) - { + if ( Test-Path $destPath ) { $destItem = Get-Item $destPath - if( ($destItem.Length -eq $i.Length ) -and ($destItem.LastWriteTime -eq $i.LastModified) ) - { + if ( ($destItem.Length -eq $i.Length ) -and ($destItem.LastWriteTime -eq $i.LastModified) ) { Write-Verbose "Skipping download because it's already in the cache: $($i.DownloadUrl)" continue } @@ -391,14 +367,11 @@ function Install-UnitySetupInstance $downloadDest += $destPath } - if( $downloadSource.Length -gt 0 ) - { - for($i=0; $i -lt $downloadSource.Length; $i++) - { + if ( $downloadSource.Length -gt 0 ) { + for ($i = 0; $i -lt $downloadSource.Length; $i++) { Write-Verbose "Downloading $($downloadSource[$i]) to $($downloadDest[$i])" $destDirectory = [io.path]::GetDirectoryName($downloadDest[$i]) - if(!(Test-Path $destDirectory -PathType Container)) - { + if (!(Test-Path $destDirectory -PathType Container)) { New-Item "$destDirectory" -ItemType Directory | Out-Null } } @@ -407,8 +380,7 @@ function Install-UnitySetupInstance } $spins = @('|', '/', '-', '\') - for($i = 0; $i -lt $localInstallers.Length; $i++) - { + for ($i = 0; $i -lt $localInstallers.Length; $i++) { $installer = $localInstallers[$i] $destination = $localDestinations[$i] @@ -418,26 +390,22 @@ function Install-UnitySetupInstance 'PassThru' = $true; } - if($Verb) - { + if ($Verb) { $startProcessArgs['Verb'] = $Verb } $spinnerIndex = 0 $process = Start-Process @startProcessArgs - while(!$process.HasExited) - { + while (!$process.HasExited) { Write-Host "`rInstalling $installer to $destination - $($spins[$spinnerIndex++ % $spins.Length])" -NoNewline Start-Sleep -Milliseconds 100 } - if( $process.ExitCode -ne 0) - { + if ( $process.ExitCode -ne 0) { Write-Host "`bFailed." Write-Error "Installing $installer failed with exit code: $($process.ExitCode)" } - else - { + else { Write-Host "`bSucceeded." } } @@ -466,7 +434,7 @@ function Uninstall-UnitySetupInstance { $uninstaller = Get-ChildItem "$($setupInstance.Path)" -Filter 'Uninstall.exe' -Recurse | Select-Object -First 1 -ExpandProperty FullName - if($null -eq $uninstaller) { + if ($null -eq $uninstaller) { Write-Error "Could not find Uninstaller.exe under $($setupInstance.Path)" continue } @@ -479,7 +447,7 @@ function Uninstall-UnitySetupInstance { 'ArgumentList' = @("/S"); } - if( -not $PSCmdlet.ShouldProcess("$uninstaller", "Start-Process")) { continue } + if ( -not $PSCmdlet.ShouldProcess("$uninstaller", "Start-Process")) { continue } $process = Start-Process @startProcessArgs if ( $process.ExitCode -ne 0 ) { @@ -499,19 +467,18 @@ function Uninstall-UnitySetupInstance { .EXAMPLE Get-UnitySetupInstance #> -function Get-UnitySetupInstance -{ - [CmdletBinding()] - param( - [parameter(Mandatory=$false)] - [string[]] $BasePath = @('C:\Program Files*\Unity*','C:\Program Files\Unity\Hub\Editor\*') - ) - - foreach( $folder in $BasePath ) { +function Get-UnitySetupInstance { + [CmdletBinding()] + param( + [parameter(Mandatory = $false)] + [string[]] $BasePath = @('C:\Program Files*\Unity*', 'C:\Program Files\Unity\Hub\Editor\*') + ) + + foreach ( $folder in $BasePath ) { $path = [io.path]::Combine("$folder", 'Editor\Data\UnityExtensions\Unity\Networking\ivy.xml'); Get-ChildItem $path -Recurse -ErrorAction Ignore | - ForEach-Object { + ForEach-Object { [UnitySetupInstance]::new((Join-Path $_.Directory "..\..\..\..\..\" | Convert-Path)) } } @@ -535,42 +502,35 @@ function Get-UnitySetupInstance .EXAMPLE Get-UnitySetupInstance | Select-UnitySetupInstance -Version 2017.1.0f3 #> -function Select-UnitySetupInstance -{ +function Select-UnitySetupInstance { [CmdletBinding()] param( - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [switch] $Latest, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [UnityVersion] $Version, - [parameter(Mandatory=$true, ValueFromPipeline=$true)] + [parameter(Mandatory = $true, ValueFromPipeline = $true)] [UnitySetupInstance[]] $Instances ) - process - { - if( $Version ) - { + process { + if ( $Version ) { $Instances = $Instances | Where-Object { [UnityVersion]::Compare($_.Version, $Version) -eq 0 } } - if( $Latest ) - { - foreach( $i in $Instances ) - { - if( $null -eq $latestInstance -or [UnityVersion]::Compare($i.Version, $latestInstance.Version) -gt 0) - { + if ( $Latest ) { + foreach ( $i in $Instances ) { + if ( $null -eq $latestInstance -or [UnityVersion]::Compare($i.Version, $latestInstance.Version) -gt 0) { $latestInstance = $i } } } - elseif( $Instances.Count -gt 0 ) { $Instances } + elseif ( $Instances.Count -gt 0 ) { $Instances } } - end - { - if($latestInstance) { $latestInstance } + end { + if ($latestInstance) { $latestInstance } } } @@ -586,14 +546,13 @@ function Select-UnitySetupInstance .EXAMPLE Get-UnityProjectInstance -BasePath .\MyUnityProjects -Recurse #> -function Get-UnityProjectInstance -{ +function Get-UnityProjectInstance { [CmdletBinding()] param( - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string] $BasePath = $PWD, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [switch] $Recurse ) @@ -604,16 +563,14 @@ function Get-UnityProjectInstance 'Directory' = $true; } - if( $Recurse ) - { + if ( $Recurse ) { $args['Recurse'] = $true; } Get-ChildItem @args | - ForEach-Object { + ForEach-Object { $path = [io.path]::Combine($_.FullName, "ProjectVersion.txt") - if( Test-Path $path ) - { + if ( Test-Path $path ) { [UnityProjectInstance]::new((Join-Path $_.FullName "..\" | Convert-Path)) } } @@ -663,121 +620,103 @@ function Get-UnityProjectInstance .EXAMPLE Get-UnitySetupInstance | Start-UnityEditor #> -function Start-UnityEditor -{ - [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName="Context")] +function Start-UnityEditor { + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "Context")] param( - [parameter(Mandatory=$false, ValueFromPipeline = $true, ParameterSetName='Projects')] - [parameter(Mandatory=$true, ValueFromPipeline = $true, ParameterSetName='ProjectsLatest')] - [parameter(Mandatory=$true, ValueFromPipeline = $true, ParameterSetName='ProjectsVersion')] + [parameter(Mandatory = $false, ValueFromPipeline = $true, ParameterSetName = 'Projects')] + [parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ProjectsLatest')] + [parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ProjectsVersion')] [ValidateNotNullOrEmpty()] [UnityProjectInstance[]] $Project, - [parameter(Mandatory=$false, ValueFromPipeline = $true, ParameterSetName='Setups')] + [parameter(Mandatory = $false, ValueFromPipeline = $true, ParameterSetName = 'Setups')] [ValidateNotNullOrEmpty()] [UnitySetupInstance[]]$Setup, - [parameter(Mandatory=$true, ParameterSetName='Latest')] - [parameter(Mandatory=$true, ParameterSetName='ProjectsLatest')] + [parameter(Mandatory = $true, ParameterSetName = 'Latest')] + [parameter(Mandatory = $true, ParameterSetName = 'ProjectsLatest')] [switch]$Latest, - [parameter(Mandatory=$true, ParameterSetName='Version')] - [parameter(Mandatory=$true, ParameterSetName='ProjectsVersion')] + [parameter(Mandatory = $true, ParameterSetName = 'Version')] + [parameter(Mandatory = $true, ParameterSetName = 'ProjectsVersion')] [UnityVersion]$Version, - [parameter(Mandatory=$false, ParameterSetName='Latest')] - [parameter(Mandatory=$false, ParameterSetName='Version')] - [parameter(Mandatory=$false, ParameterSetName='Context')] + [parameter(Mandatory = $false, ParameterSetName = 'Latest')] + [parameter(Mandatory = $false, ParameterSetName = 'Version')] + [parameter(Mandatory = $false, ParameterSetName = 'Context')] [switch]$IgnoreProjectContext, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string]$ExecuteMethod, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string[]]$ExportPackage, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string]$ImportPackage, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string]$CreateProject, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string]$OutputPath, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [string]$LogFile, - [parameter(Mandatory=$false)] - [ValidateSet('StandaloneOSX','StandaloneWindows','iOS','Android','StandaloneLinux','StandaloneWindows64','WebGL','WSAPlayer','StandaloneLinux64','StandaloneLinuxUniversal','Tizen','PSP2','PS4','XBoxOne','N3DS','WiiU','tvOS','Switch')] + [parameter(Mandatory = $false)] + [ValidateSet('StandaloneOSX', 'StandaloneWindows', 'iOS', 'Android', 'StandaloneLinux', 'StandaloneWindows64', 'WebGL', 'WSAPlayer', 'StandaloneLinux64', 'StandaloneLinuxUniversal', 'Tizen', 'PSP2', 'PS4', 'XBoxOne', 'N3DS', 'WiiU', 'tvOS', 'Switch')] [string]$BuildTarget, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [switch]$BatchMode, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [switch]$Quit, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [switch]$Wait, - [parameter(Mandatory=$false)] + [parameter(Mandatory = $false)] [switch]$PassThru ) - process - { - switch -wildcard ( $PSCmdlet.ParameterSetName ) - { - 'Context' - { + process { + switch -wildcard ( $PSCmdlet.ParameterSetName ) { + 'Context' { $projectInstances = [UnityProjectInstance[]]@() - $setupInstances = [UnitySetupInstance[]]@() + $setupInstances = [UnitySetupInstance[]]@() - $currentFolderProject = if( !$IgnoreProjectContext ) { Get-UnityProjectInstance $PWD.Path } - if($null -ne $currentFolderProject) - { - $projectInstances += ,$currentFolderProject + $currentFolderProject = if ( !$IgnoreProjectContext ) { Get-UnityProjectInstance $PWD.Path } + if ($null -ne $currentFolderProject) { + $projectInstances += , $currentFolderProject } - else - { + else { $setupInstance = Get-UnitySetupInstance | Select-UnitySetupInstance -Latest - if($setupInstance.Count -gt 0) - { - $setupInstances += ,$setupInstance + if ($setupInstance.Count -gt 0) { + $setupInstances += , $setupInstance } } } - 'Projects*' - { + 'Projects*' { $projectInstances = $Project - $setupInstances = [UnitySetupInstance[]]@() + $setupInstances = [UnitySetupInstance[]]@() } - 'Setups' - { + 'Setups' { $projectInstances = [UnityProjectInstance[]]@() $setupInstances = $Setup } - 'Latest' - { + 'Latest' { $projectInstances = [UnityProjectInstance[]]@() - $currentFolderProject = if(!$IgnoreProjectContext) { Get-UnityProjectInstance $PWD.Path } - if($null -ne $currentFolderProject) - { - $projectInstances += ,$currentFolderProject + $currentFolderProject = if (!$IgnoreProjectContext) { Get-UnityProjectInstance $PWD.Path } + if ($null -ne $currentFolderProject) { + $projectInstances += , $currentFolderProject } - elseif( $Latest ) - { + elseif ( $Latest ) { $setupInstance = Get-UnitySetupInstance | Select-UnitySetupInstance -Latest - if($setupInstance.Count -gt 0) - { - $setupInstances = ,$setupInstance + if ($setupInstance.Count -gt 0) { + $setupInstances = , $setupInstance } } } - 'Version' - { + 'Version' { $projectInstances = [UnityProjectInstance[]]@() - $currentFolderProject = if(!$IgnoreProjectContext) { Get-UnityProjectInstance $PWD.Path } - if($null -ne $currentFolderProject) - { - $projectInstances += ,$currentFolderProject + $currentFolderProject = if (!$IgnoreProjectContext) { Get-UnityProjectInstance $PWD.Path } + if ($null -ne $currentFolderProject) { + $projectInstances += , $currentFolderProject } - elseif($null -ne $Version) - { + elseif ($null -ne $Version) { $setupInstance = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $Version - if($setupInstance.Count -gt 0) - { - $setupInstances = ,$setupInstance + if ($setupInstance.Count -gt 0) { + $setupInstances = , $setupInstance } - else - { + else { Write-Error "Could not find Unity Editor for version $Version" } } @@ -785,27 +724,27 @@ function Start-UnityEditor } $sharedArgs = @() - if( $CreateProject ) { $sharedArgs += "-createProject", $CreateProject } - if( $ExecuteMethod ) { $sharedArgs += "-executeMethod", $ExecuteMethod } - if( $OutputPath ) { $sharedArgs += "-buildOutput", $OutputPath } - if( $LogFile ) { $sharedArgs += "-logFile", $LogFile } - if( $BuildTarget ) { $sharedArgs += "-buildTarget", $BuildTarget } - if( $BatchMode ) { $sharedArgs += "-batchmode" } - if( $Quit ) { $sharedArgs += "-quit" } - if( $ExportPackage ) { $sharedArgs += "-exportPackage","$ExportPackage" } - if( $ImportPackage ) { $sharedArgs += "-importPackage","$ImportPackage" } + if ( $CreateProject ) { $sharedArgs += "-createProject", $CreateProject } + if ( $ExecuteMethod ) { $sharedArgs += "-executeMethod", $ExecuteMethod } + if ( $OutputPath ) { $sharedArgs += "-buildOutput", $OutputPath } + if ( $LogFile ) { $sharedArgs += "-logFile", $LogFile } + if ( $BuildTarget ) { $sharedArgs += "-buildTarget", $BuildTarget } + if ( $BatchMode ) { $sharedArgs += "-batchmode" } + if ( $Quit ) { $sharedArgs += "-quit" } + if ( $ExportPackage ) { $sharedArgs += "-exportPackage", "$ExportPackage" } + if ( $ImportPackage ) { $sharedArgs += "-importPackage", "$ImportPackage" } $instanceArgs = @() - foreach( $p in $projectInstances ) { + foreach ( $p in $projectInstances ) { - if( $Latest ) { + if ( $Latest ) { $setupInstance = Get-UnitySetupInstance | Select-UnitySetupInstance -Latest - if($setupInstance.Count -eq 0) { + if ($setupInstance.Count -eq 0) { Write-Error "Could not find any Unity Editor installed" continue } } - elseif($null -ne $Version) { + elseif ($null -ne $Version) { $setupInstance = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $Version if ($setupInstance.Count -eq 0) { Write-Error "Could not find Unity Editor for version $Version" @@ -814,55 +753,49 @@ function Start-UnityEditor } else { $setupInstance = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $p.Version - if($setupInstance.Count -eq 0) { + if ($setupInstance.Count -eq 0) { Write-Error "Could not find Unity Editor for version $($p.Version)" continue } } $projectPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($($p.Path)) - $instanceArgs += ,("-projectPath", $projectPath) - $setupInstances += ,$setupInstance + $instanceArgs += , ("-projectPath", $projectPath) + $setupInstances += , $setupInstance } - for($i=0; $i -lt $setupInstances.Length; $i++) - { + for ($i = 0; $i -lt $setupInstances.Length; $i++) { $setupInstance = $setupInstances[$i] $editor = Get-ChildItem "$($setupInstance.Path)" -Filter 'Unity.exe' -Recurse | - Select-Object -First 1 -ExpandProperty FullName + Select-Object -First 1 -ExpandProperty FullName - if([string]::IsNullOrEmpty($editor)) - { + if ([string]::IsNullOrEmpty($editor)) { Write-Error "Could not find Unity.exe under setup instance path: $($setupInstance.Path)" continue } # clone the shared args list $unityArgs = $sharedArgs | ForEach-Object { $_ } - if( $instanceArgs[$i] ) { $unityArgs += $instanceArgs[$i] } + if ( $instanceArgs[$i] ) { $unityArgs += $instanceArgs[$i] } $setProcessArgs = @{ 'FilePath' = $editor; 'PassThru' = $true; 'ErrorAction' = 'Stop'; } - if($unityArgs -and $unityArgs.Length -gt 0) { + if ($unityArgs -and $unityArgs.Length -gt 0) { $setProcessArgs['ArgumentList'] = $unityArgs } - if(-not $PSCmdlet.ShouldProcess("$editor $unityArgs", "Start-Process")) - { + if (-not $PSCmdlet.ShouldProcess("$editor $unityArgs", "Start-Process")) { continue } $process = Start-Process @setProcessArgs - if( $Wait ) - { + if ( $Wait ) { $process.WaitForExit(); - if( $process.ExitCode -ne 0 ) - { - if( $LogFile -and (Test-Path $LogFile -Type Leaf) ) - { + if ( $process.ExitCode -ne 0 ) { + if ( $LogFile -and (Test-Path $LogFile -Type Leaf) ) { Get-Content $LogFile | ForEach-Object { Write-Information -MessageData $_ -Tags 'Logs' } } @@ -870,7 +803,7 @@ function Start-UnityEditor } } - if($PassThru) { $process } + if ($PassThru) { $process } } } } diff --git a/build.ps1 b/build.ps1 index a5602ee..bc3f140 100644 --- a/build.ps1 +++ b/build.ps1 @@ -4,8 +4,8 @@ Import-Module 'PowerShellGet' -Force $ErrorActionPreference = 'Stop' $manifest = Test-ModuleManifest .\UnitySetup\UnitySetup.psd1 -$versionString = $manifest.Version.ToString() -if($manifest.PrivateData['PSData']['Prerelease']) { +$versionString = $manifest.Version.ToString() +if ($manifest.PrivateData['PSData']['Prerelease']) { $versionString += "-$($manifest.PrivateData['PSData']['Prerelease'])" } Write-Host "Current Module Version: $versionString" @@ -14,8 +14,8 @@ $newVersion = New-Object System.Version($manifest.Version.Major, $manifest.Versi Update-ModuleManifest -ModuleVersion $newVersion -Prerelease $Suffix -Path .\UnitySetup\UnitySetup.psd1 $manifest = Test-ModuleManifest .\UnitySetup\UnitySetup.psd1 -$versionString = $manifest.Version.ToString() -if($manifest.PrivateData['PSData']['Prerelease']) { +$versionString = $manifest.Version.ToString() +if ($manifest.PrivateData['PSData']['Prerelease']) { $versionString += "-$($manifest.PrivateData['PSData']['Prerelease'])" } Write-Host "New Module Version: $versionString" \ No newline at end of file From e9b16265356b68dd3045d69a6c5ac129e013ee12 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Mon, 19 Mar 2018 15:12:31 -0700 Subject: [PATCH 23/28] Disable warning for this method --- UnitySetup/UnitySetup.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index bdd2832..feb18b4 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -170,6 +170,7 @@ class UnityVersion : System.IComparable function New-UnitySetupComponent { [CmdletBinding()] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function')] param( [parameter(Mandatory=$true)] [UnitySetupComponent] $Components From bcf0a9b0e415c6e5e8953caf5442240240b8707f Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Tue, 20 Mar 2018 11:15:27 -0700 Subject: [PATCH 24/28] Change helper to better name --- UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 | 6 +++--- UnitySetup/UnitySetup.psd1 | 2 +- UnitySetup/UnitySetup.psm1 | 11 +++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 index 693a701..f23990f 100644 --- a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 +++ b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 @@ -79,7 +79,7 @@ function Set-TargetResource { foreach ($version in $splitVersions) { $findArgs = @{ 'Version' = $version - 'Components' = New-UnitySetupComponent -Components $Components + 'Components' = ConvertTo-UnitySetupComponent $Components } $installArgs = @{ 'Cache' = "$env:TEMP\.unitysetup" } @@ -156,7 +156,7 @@ function Test-TargetResource { $result = $true switch ( $Ensure ) { 'Present' { - $setupComponents = New-UnitySetupComponent -Components $Components + $setupComponents = ConvertTo-UnitySetupComponent $Components foreach ($version in $splitVersions) { Write-Verbose "Starting test for $version" $setupInstances = Get-UnitySetupInstance | Select-UnitySetupInstance -Version $version @@ -170,7 +170,7 @@ function Test-TargetResource { $availableComponents = ($setupInstances[0].Components -band $setupComponents) if ($availableComponents -ne $setupComponents) { - $missingComponents = New-UnitySetupComponent ($setupComponents -bxor $availableComponents) + $missingComponents = ConvertTo-UnitySetupComponent ($setupComponents -bxor $availableComponents) Write-Verbose "Found $version missing $($missingComponents)" $result = $false break diff --git a/UnitySetup/UnitySetup.psd1 b/UnitySetup/UnitySetup.psd1 index a0c2102..d5b8271 100644 --- a/UnitySetup/UnitySetup.psd1 +++ b/UnitySetup/UnitySetup.psd1 @@ -82,7 +82,7 @@ 'Select-UnitySetupInstance', 'Uninstall-UnitySetupInstance', 'Start-UnityEditor', - 'New-UnitySetupComponent' + 'ConvertTo-UnitySetupComponent' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index fbbe9d8..df24a22 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -158,17 +158,16 @@ class UnityVersion : System.IComparable { .PARAMETER Components What components would you like included? .EXAMPLE - New-UnitySetupComponent -Components Setup,Metro + ConvertTo-UnitySetupComponent Setup,Metro #> -function New-UnitySetupComponent { +function ConvertTo-UnitySetupComponent { [CmdletBinding()] - [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function')] param( - [parameter(Mandatory = $true)] - [UnitySetupComponent] $Components + [parameter(Mandatory = $true, Position = 0)] + [UnitySetupComponent] $Component ) - $Components + $Component } <# From 4958ef4c8f1f8a4b024b8d657308400d5fdc2ca5 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Wed, 21 Mar 2018 14:40:41 -0700 Subject: [PATCH 25/28] Dont force and specify version --- UnitySetup/UnitySetup.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index df24a22..203dda6 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -1,6 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -Import-Module powershell-yaml -Force -ErrorAction Stop +Import-Module powershell-yaml -MinimumVersion '0.3' -ErrorAction Stop [Flags()] enum UnitySetupComponent { From 17a8ad5cce03cc239a984d2d99ef15542657502d Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Wed, 21 Mar 2018 14:42:31 -0700 Subject: [PATCH 26/28] Improve alias handling --- UnitySetup/UnitySetup.psm1 | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/UnitySetup/UnitySetup.psm1 b/UnitySetup/UnitySetup.psm1 index df24a22..9362033 100644 --- a/UnitySetup/UnitySetup.psm1 +++ b/UnitySetup/UnitySetup.psm1 @@ -808,7 +808,23 @@ function Start-UnityEditor { } } -New-Alias -Name gusi -Value Get-UnitySetupInstance -New-Alias -Name gupi -Value Get-UnityProjectInstance -New-Alias -Name susi -Value Select-UnitySetupInstance -New-Alias -Name sue -Value Start-UnityEditor \ No newline at end of file +@( + @{ 'Name' = 'gusi'; 'Value' = 'Get-UnitySetupInstance' }, + @{ 'Name' = 'gupi'; 'Value' = 'Get-UnityProjectInstance' }, + @{ 'Name' = 'susi'; 'Value' = 'Select-UnitySetupInstance' }, + @{ 'Name' = 'sue'; 'Value' = 'Start-UnityEditor' } +) | ForEach-Object { + + $alias = Get-Alias -Name $_.Name -ErrorAction 'SilentlyContinue' + if( -not $alias ) { + Write-Verbose "Creating new alias $($_.Name) for $($_.Value)" + New-Alias @_ + } + elseif( $alias.ModuleName -eq 'UnitySetup' ) { + Write-Verbose "Setting alias $($_.Name) to $($_.Value)" + Set-Alias @_ + } + else { + Write-Warning "Alias $($_.Name) already configured by $($alias.Source)" + } +} \ No newline at end of file From 4987d0594ecfc9de75605f6c6a4e372d5b42bade Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Wed, 21 Mar 2018 16:25:55 -0700 Subject: [PATCH 27/28] Convert to utf-8 --- .../xUnitySetup/xUnitySetup.schema.mof | Bin 816 -> 398 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof b/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof index 8d0d4be07780462d2f1c9a1cb7afb386bfbcef3f..e05f88aa68d6a324e25324c498c3731bb62d3079 100644 GIT binary patch literal 398 zcmaKo!Ab)$5Qgu0iXo>KmZI10LA13Xr7DW;VJR}*PBpNbgqf_kl)k&!%~D0g5tZ53V4jqw+Tv&A-7r(CHo1Vo4y literal 816 zcmbV~TT8=05QWdP;D1>1WI;q<^+B{MhrziT4cZdjlgp!PO6>uA%QX+P18t+H zE8?@D@GPJQL1&JJx}!EZ#*7$-2bHs%@D=Qb#8R-HlLPm{TzBL20jBoH&%8c0n;xuc|8M_Yy@k7R+_~Lb&YV^Kdny*3T{zb+*?q3N XRXVe-vV0HCyglA(sd!PX_S${`CTNO? From 2daf16a273927e68f139b8309755bd18dab9fc62 Mon Sep 17 00:00:00 2001 From: Josh Wittner Date: Wed, 21 Mar 2018 16:28:09 -0700 Subject: [PATCH 28/28] Rename to xUnitySetupInstance --- README.md | 6 +++--- .../xUnitySetupInstance.psm1} | 0 .../xUnitySetupInstance.schema.mof} | 4 ++-- ...ample_xUnitySetup.ps1 => Sample_xUnitySetupInstance.ps1} | 4 ++-- ...p_Install.ps1 => Sample_xUnitySetupInstance_Install.ps1} | 4 ++-- ...install.ps1 => Sample_xUnitySetupInstance_Uninstall.ps1} | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) rename UnitySetup/DSCResources/{xUnitySetup/xUnitySetup.psm1 => xUnitySetupInstance/xUnitySetupInstance.psm1} (100%) rename UnitySetup/DSCResources/{xUnitySetup/xUnitySetup.schema.mof => xUnitySetupInstance/xUnitySetupInstance.schema.mof} (73%) rename UnitySetup/Examples/{Sample_xUnitySetup.ps1 => Sample_xUnitySetupInstance.ps1} (87%) rename UnitySetup/Examples/{Sample_xUnitySetup_Install.ps1 => Sample_xUnitySetupInstance_Install.ps1} (77%) rename UnitySetup/Examples/{Sample_xUnitySetup_Uninstall.ps1 => Sample_xUnitySetupInstance_Uninstall.ps1} (71%) diff --git a/README.md b/README.md index b2cd966..a8a7eb6 100644 --- a/README.md +++ b/README.md @@ -115,19 +115,19 @@ Install-UnitySetupInstance -Installers (Find-UnitySetupInstaller -Version '2017. ``` ### DSC -UnitySetup includes the xUnitySetup DSC Resource. An example configuration might look like: +UnitySetup includes the xUnitySetupInstance DSC Resource. An example configuration might look like: ```powershell <# Install multiple versions of Unity and several components #> -Configuration Sample_xUnitySetup_Install { +Configuration Sample_xUnitySetupInstance_Install { Import-DscResource -ModuleName UnitySetup Node 'localhost' { - xUnitySetup Unity { + xUnitySetupInstance Unity { Versions = '2017.3.1f1,2018.1.0b9' Components = 'Setup', 'Mac', 'Linux', 'Metro', 'iOS' Ensure = 'Present' diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 b/UnitySetup/DSCResources/xUnitySetupInstance/xUnitySetupInstance.psm1 similarity index 100% rename from UnitySetup/DSCResources/xUnitySetup/xUnitySetup.psm1 rename to UnitySetup/DSCResources/xUnitySetupInstance/xUnitySetupInstance.psm1 diff --git a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof b/UnitySetup/DSCResources/xUnitySetupInstance/xUnitySetupInstance.schema.mof similarity index 73% rename from UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof rename to UnitySetup/DSCResources/xUnitySetupInstance/xUnitySetupInstance.schema.mof index e05f88a..62b4fdd 100644 --- a/UnitySetup/DSCResources/xUnitySetup/xUnitySetup.schema.mof +++ b/UnitySetup/DSCResources/xUnitySetupInstance/xUnitySetupInstance.schema.mof @@ -1,6 +1,6 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xUnitySetup")] -class xUnitySetup : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("xUnitySetupInstance")] +class xUnitySetupInstance : OMI_BaseResource { [Key, Description("Comma separated list of Unity versions. ")] string Versions; [Write, Description("Ensure present or absent?"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] string Ensure; diff --git a/UnitySetup/Examples/Sample_xUnitySetup.ps1 b/UnitySetup/Examples/Sample_xUnitySetupInstance.ps1 similarity index 87% rename from UnitySetup/Examples/Sample_xUnitySetup.ps1 rename to UnitySetup/Examples/Sample_xUnitySetupInstance.ps1 index cef25f1..7280942 100644 --- a/UnitySetup/Examples/Sample_xUnitySetup.ps1 +++ b/UnitySetup/Examples/Sample_xUnitySetupInstance.ps1 @@ -1,7 +1,7 @@ <# Create a custom configuration by passing in necessary values #> -Configuration Sample_xUnitySetup { +Configuration Sample_xUnitySetupInstance { param ( [System.String] @@ -19,7 +19,7 @@ Configuration Sample_xUnitySetup { Node 'localhost' { - xUnitySetup Unity { + xUnitySetupInstance Unity { Versions = $Versions Components = $Components Ensure = $Ensure diff --git a/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 b/UnitySetup/Examples/Sample_xUnitySetupInstance_Install.ps1 similarity index 77% rename from UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 rename to UnitySetup/Examples/Sample_xUnitySetupInstance_Install.ps1 index c729b99..7763dc3 100644 --- a/UnitySetup/Examples/Sample_xUnitySetup_Install.ps1 +++ b/UnitySetup/Examples/Sample_xUnitySetupInstance_Install.ps1 @@ -1,13 +1,13 @@ <# Install multiple versions of Unity and several components #> -Configuration Sample_xUnitySetup_Install { +Configuration Sample_xUnitySetupInstance_Install { Import-DscResource -ModuleName UnitySetup Node 'localhost' { - xUnitySetup Unity { + xUnitySetupInstance Unity { Versions = '2017.3.1f1,2018.1.0b9' Components = 'Setup', 'Mac', 'Linux', 'Metro', 'iOS' Ensure = 'Present' diff --git a/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 b/UnitySetup/Examples/Sample_xUnitySetupInstance_Uninstall.ps1 similarity index 71% rename from UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 rename to UnitySetup/Examples/Sample_xUnitySetupInstance_Uninstall.ps1 index 73e0f36..c5f0764 100644 --- a/UnitySetup/Examples/Sample_xUnitySetup_Uninstall.ps1 +++ b/UnitySetup/Examples/Sample_xUnitySetupInstance_Uninstall.ps1 @@ -1,13 +1,13 @@ <# Uninstall multiple versions of Unity #> -Configuration Sample_xUnitySetup_Install { +Configuration Sample_xUnitySetupInstance_Install { Import-DscResource -ModuleName UnitySetup Node 'localhost' { - xUnitySetup Unity { + xUnitySetupInstance Unity { Versions = '2017.3.1f1,2018.1.0b9' Ensure = 'Absent' }