1+ # #########################################################################
2+ # This is the Cake bootstrapper script for PowerShell.
3+ # This file was downloaded from https://github.com/cake-build/resources
4+ # Feel free to change this file to fit your needs.
5+ # #########################################################################
6+
7+ <#
8+
9+ . SYNOPSIS
10+ This is a Powershell script to bootstrap a Cake build.
11+
12+ . DESCRIPTION
13+ This Powershell script will download NuGet if missing, restore NuGet tools (including Cake)
14+ and execute your Cake build script with the parameters you provide.
15+
16+ . PARAMETER Script
17+ The build script to execute.
18+ . PARAMETER Target
19+ The build script target to run.
20+ . PARAMETER Configuration
21+ The build configuration to use.
22+ . PARAMETER Verbosity
23+ Specifies the amount of information to be displayed.
24+ . PARAMETER Experimental
25+ Tells Cake to use the latest Roslyn release.
26+ . PARAMETER WhatIf
27+ Performs a dry run of the build script.
28+ No tasks will be executed.
29+ . PARAMETER Mono
30+ Tells Cake to use the Mono scripting engine.
31+ . PARAMETER SkipToolPackageRestore
32+ Skips restoring of packages.
33+ . PARAMETER ScriptArgs
34+ Remaining arguments are added here.
35+
36+ . LINK
37+ http://cakebuild.net
38+
39+ #>
40+
41+ [CmdletBinding ()]
42+ Param (
43+ [string ]$Script = " build.cake" ,
44+ [string ]$Target = " Default" ,
45+ [ValidateSet (" Release" , " Debug" )]
46+ [string ]$Configuration = " Release" ,
47+ [ValidateSet (" Quiet" , " Minimal" , " Normal" , " Verbose" , " Diagnostic" )]
48+ [string ]$Verbosity = " Verbose" ,
49+ [switch ]$Experimental ,
50+ [Alias (" DryRun" , " Noop" )]
51+ [switch ]$WhatIf ,
52+ [switch ]$Mono ,
53+ [switch ]$SkipToolPackageRestore ,
54+ [Parameter (Position = 0 , Mandatory = $false , ValueFromRemainingArguments = $true )]
55+ [string []]$ScriptArgs
56+ )
57+
58+ [Reflection.Assembly ]::LoadWithPartialName(" System.Security" ) | Out-Null
59+ function MD5HashFile ([string ] $filePath )
60+ {
61+ if ([string ]::IsNullOrEmpty($filePath ) -or ! (Test-Path $filePath - PathType Leaf))
62+ {
63+ return $null
64+ }
65+
66+ [System.IO.Stream ] $file = $null ;
67+ [System.Security.Cryptography.MD5 ] $md5 = $null ;
68+ try
69+ {
70+ $md5 = [System.Security.Cryptography.MD5 ]::Create()
71+ $file = [System.IO.File ]::OpenRead($filePath )
72+ return [System.BitConverter ]::ToString($md5.ComputeHash ($file ))
73+ }
74+ finally
75+ {
76+ if ($file -ne $null )
77+ {
78+ $file.Dispose ()
79+ }
80+ }
81+ }
82+
83+ Write-Host " Preparing to run build script..."
84+
85+ if (! $PSScriptRoot ){
86+ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path - Parent
87+ }
88+
89+ $TOOLS_DIR = Join-Path $PSScriptRoot " tools"
90+ $NUGET_EXE = Join-Path $TOOLS_DIR " nuget.exe"
91+ $CAKE_EXE = Join-Path $TOOLS_DIR " Cake/Cake.exe"
92+ $NUGET_URL = " https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
93+ $PACKAGES_CONFIG = Join-Path $TOOLS_DIR " packages.config"
94+ $PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR " packages.config.md5sum"
95+
96+ # Should we use mono?
97+ $UseMono = " " ;
98+ if ($Mono.IsPresent ) {
99+ Write-Verbose - Message " Using the Mono based scripting engine."
100+ $UseMono = " -mono"
101+ }
102+
103+ # Should we use the new Roslyn?
104+ $UseExperimental = " " ;
105+ if ($Experimental.IsPresent -and ! ($Mono.IsPresent )) {
106+ Write-Verbose - Message " Using experimental version of Roslyn."
107+ $UseExperimental = " -experimental"
108+ }
109+
110+ # Is this a dry run?
111+ $UseDryRun = " " ;
112+ if ($WhatIf.IsPresent ) {
113+ $UseDryRun = " -dryrun"
114+ }
115+
116+ # Make sure tools folder exists
117+ if ((Test-Path $PSScriptRoot ) -and ! (Test-Path $TOOLS_DIR )) {
118+ Write-Verbose - Message " Creating tools directory..."
119+ New-Item - Path $TOOLS_DIR - Type directory | out-null
120+ }
121+
122+ # Make sure that packages.config exist.
123+ if (! (Test-Path $PACKAGES_CONFIG )) {
124+ Write-Verbose - Message " Downloading packages.config..."
125+ try { (New-Object System.Net.WebClient).DownloadFile(" http://cakebuild.net/download/bootstrapper/packages" , $PACKAGES_CONFIG ) } catch {
126+ Throw " Could not download packages.config."
127+ }
128+ }
129+
130+ # Try find NuGet.exe in path if not exists
131+ if (! (Test-Path $NUGET_EXE )) {
132+ Write-Verbose - Message " Trying to find nuget.exe in PATH..."
133+ $existingPaths = $Env: Path -Split ' ;' | Where-Object { (! [string ]::IsNullOrEmpty($_ )) -and (Test-Path $_ - PathType Container) }
134+ $NUGET_EXE_IN_PATH = Get-ChildItem - Path $existingPaths - Filter " nuget.exe" | Select - First 1
135+ if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName )) {
136+ Write-Verbose - Message " Found in PATH at $ ( $NUGET_EXE_IN_PATH.FullName ) ."
137+ $NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
138+ }
139+ }
140+
141+ # Try download NuGet.exe if not exists
142+ if (! (Test-Path $NUGET_EXE )) {
143+ Write-Verbose - Message " Downloading NuGet.exe..."
144+ try {
145+ (New-Object System.Net.WebClient).DownloadFile($NUGET_URL , $NUGET_EXE )
146+ } catch {
147+ Throw " Could not download NuGet.exe."
148+ }
149+ }
150+
151+ # Save nuget.exe path to environment to be available to child processed
152+ $ENV: NUGET_EXE = $NUGET_EXE
153+
154+ # Restore tools from NuGet?
155+ if (-Not $SkipToolPackageRestore.IsPresent ) {
156+ Push-Location
157+ Set-Location $TOOLS_DIR
158+
159+ # Check for changes in packages.config and remove installed tools if true.
160+ [string ] $md5Hash = MD5HashFile($PACKAGES_CONFIG )
161+ if ((! (Test-Path $PACKAGES_CONFIG_MD5 )) -Or
162+ ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
163+ Write-Verbose - Message " Missing or changed package.config hash..."
164+ Remove-Item * - Recurse - Exclude packages.config, nuget.exe
165+ }
166+
167+ Write-Verbose - Message " Restoring tools from NuGet..."
168+ $NuGetOutput = Invoke-Expression " &`" $NUGET_EXE `" install -ExcludeVersion -OutputDirectory `" $TOOLS_DIR `" "
169+
170+ if ($LASTEXITCODE -ne 0 ) {
171+ Throw " An error occured while restoring NuGet tools."
172+ }
173+ else
174+ {
175+ $md5Hash | Out-File $PACKAGES_CONFIG_MD5 - Encoding " ASCII"
176+ }
177+ Write-Verbose - Message ($NuGetOutput | out-string )
178+ Pop-Location
179+ }
180+
181+ # Make sure that Cake has been installed.
182+ if (! (Test-Path $CAKE_EXE )) {
183+ Throw " Could not find Cake.exe at $CAKE_EXE "
184+ }
185+
186+ # Start Cake
187+ Write-Host " Running build script..."
188+ Invoke-Expression " & `" $CAKE_EXE `" `" $Script `" -target=`" $Target `" -configuration=`" $Configuration `" -verbosity=`" $Verbosity `" $UseMono $UseDryRun $UseExperimental $ScriptArgs "
189+ exit $LASTEXITCODE
0 commit comments