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 = " Debug" ,
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+ cd $PSScriptRoot
90+
91+ $TOOLS_DIR = Join-Path $PSScriptRoot " tools"
92+ $NUGET_EXE = Join-Path $TOOLS_DIR " nuget.exe"
93+ $CAKE_EXE = Join-Path $TOOLS_DIR " Cake/Cake.exe"
94+ $NUGET_URL = " https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
95+ $PACKAGES_CONFIG = Join-Path $TOOLS_DIR " packages.config"
96+ $PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR " packages.config.md5sum"
97+
98+ # Should we use mono?
99+ $UseMono = " " ;
100+ if ($Mono.IsPresent ) {
101+ Write-Verbose - Message " Using the Mono based scripting engine."
102+ $UseMono = " -mono"
103+ }
104+
105+ # Should we use the new Roslyn?
106+ $UseExperimental = " " ;
107+ if ($Experimental.IsPresent -and ! ($Mono.IsPresent )) {
108+ Write-Verbose - Message " Using experimental version of Roslyn."
109+ $UseExperimental = " -experimental"
110+ }
111+
112+ # Is this a dry run?
113+ $UseDryRun = " " ;
114+ if ($WhatIf.IsPresent ) {
115+ $UseDryRun = " -dryrun"
116+ }
117+
118+ # Make sure tools folder exists
119+ if ((Test-Path $PSScriptRoot ) -and ! (Test-Path $TOOLS_DIR )) {
120+ Write-Verbose - Message " Creating tools directory..."
121+ New-Item - Path $TOOLS_DIR - Type directory | out-null
122+ }
123+
124+ # Make sure that packages.config exist.
125+ if (! (Test-Path $PACKAGES_CONFIG )) {
126+ Write-Verbose - Message " Downloading packages.config..."
127+ try { (New-Object System.Net.WebClient).DownloadFile(" http://cakebuild.net/download/bootstrapper/packages" , $PACKAGES_CONFIG ) } catch {
128+ Throw " Could not download packages.config."
129+ }
130+ }
131+
132+ # Try find NuGet.exe in path if not exists
133+ if (! (Test-Path $NUGET_EXE )) {
134+ Write-Verbose - Message " Trying to find nuget.exe in PATH..."
135+ $existingPaths = $Env: Path -Split ' ;' | Where-Object { (! [string ]::IsNullOrEmpty($_ )) -and (Test-Path $_ ) }
136+ $NUGET_EXE_IN_PATH = Get-ChildItem - Path $existingPaths - Filter " nuget.exe" | Select - First 1
137+ if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName )) {
138+ Write-Verbose - Message " Found in PATH at $ ( $NUGET_EXE_IN_PATH.FullName ) ."
139+ $NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
140+ }
141+ }
142+
143+ # Try download NuGet.exe if not exists
144+ if (! (Test-Path $NUGET_EXE )) {
145+ Write-Verbose - Message " Downloading NuGet.exe..."
146+ try {
147+ (New-Object System.Net.WebClient).DownloadFile($NUGET_URL , $NUGET_EXE )
148+ } catch {
149+ Throw " Could not download NuGet.exe."
150+ }
151+ }
152+
153+ # Save nuget.exe path to environment to be available to child processed
154+ $ENV: NUGET_EXE = $NUGET_EXE
155+
156+ # Restore tools from NuGet?
157+ if (-Not $SkipToolPackageRestore.IsPresent ) {
158+ Push-Location
159+ Set-Location $TOOLS_DIR
160+
161+ # Check for changes in packages.config and remove installed tools if true.
162+ [string ] $md5Hash = MD5HashFile($PACKAGES_CONFIG )
163+ if ((! (Test-Path $PACKAGES_CONFIG_MD5 )) -Or
164+ ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
165+ Write-Verbose - Message " Missing or changed package.config hash..."
166+ Remove-Item * - Recurse - Exclude packages.config, nuget.exe
167+ }
168+
169+ Write-Verbose - Message " Restoring tools from NuGet..."
170+ $NuGetOutput = Invoke-Expression " &`" $NUGET_EXE `" install -ExcludeVersion -OutputDirectory `" $TOOLS_DIR `" "
171+
172+ if ($LASTEXITCODE -ne 0 ) {
173+ Throw " An error occured while restoring NuGet tools."
174+ }
175+ else
176+ {
177+ $md5Hash | Out-File $PACKAGES_CONFIG_MD5 - Encoding " ASCII"
178+ }
179+ Write-Verbose - Message ($NuGetOutput | out-string )
180+ Pop-Location
181+ }
182+
183+ # Make sure that Cake has been installed.
184+ if (! (Test-Path $CAKE_EXE )) {
185+ Throw " Could not find Cake.exe at $CAKE_EXE "
186+ }
187+
188+ # Start Cake
189+ Write-Host " Running build script..."
190+ Invoke-Expression " & `" $CAKE_EXE `" `" $Script `" -target=`" $Target `" -configuration=`" $Configuration `" -verbosity=`" $Verbosity `" $UseMono $UseDryRun $UseExperimental $ScriptArgs "
191+ exit $LASTEXITCODE
0 commit comments