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 ()]
1
42
Param (
2
43
[string ]$Script = " build.cake" ,
3
44
[string ]$Target = " Default" ,
@@ -6,22 +47,63 @@ Param(
6
47
[ValidateSet (" Quiet" , " Minimal" , " Normal" , " Verbose" , " Diagnostic" )]
7
48
[string ]$Verbosity = " Verbose" ,
8
49
[switch ]$Experimental ,
50
+ [Alias (" DryRun" , " Noop" )]
9
51
[switch ]$WhatIf ,
10
52
[switch ]$Mono ,
11
53
[switch ]$SkipToolPackageRestore ,
12
54
[Parameter (Position = 0 , Mandatory = $false , ValueFromRemainingArguments = $true )]
13
55
[string []]$ScriptArgs
14
56
)
15
57
16
- $PSScriptRoot = split-path - parent $MyInvocation.MyCommand.Definition ;
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
+
17
89
$TOOLS_DIR = Join-Path $PSScriptRoot " tools"
18
90
$NUGET_EXE = Join-Path $TOOLS_DIR " nuget.exe"
19
91
$CAKE_EXE = Join-Path $TOOLS_DIR " Cake/Cake.exe"
20
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"
21
95
22
- # Should we use experimental build of Roslyn?
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?
23
104
$UseExperimental = " " ;
24
- if ($Experimental.IsPresent ) {
105
+ if ($Experimental.IsPresent -and ! ($Mono.IsPresent )) {
106
+ Write-Verbose - Message " Using experimental version of Roslyn."
25
107
$UseExperimental = " -experimental"
26
108
}
27
109
@@ -31,44 +113,77 @@ if($WhatIf.IsPresent) {
31
113
$UseDryRun = " -dryrun"
32
114
}
33
115
34
- # Should we use mono?
35
- $UseMono = " " ;
36
- if ( $Mono .IsPresent ) {
37
- $UseMono = " -mono "
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
38
120
}
39
121
40
- # Create tools dir
41
- if (! (Test-Path $TOOLS_DIR )) {
42
- mkdir $TOOLS_DIR
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
+ }
43
128
}
44
129
45
- # Try download NuGet.exe if do not exist.
130
+ # Try find NuGet.exe in path if not exists
46
131
if (! (Test-Path $NUGET_EXE )) {
47
- (New-Object System.Net.WebClient).DownloadFile($NUGET_URL , $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 $_ ) }
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
+ }
48
139
}
49
140
50
- # Make sure NuGet exists where we expect it.
141
+ # Try download NuGet.exe if not exists
51
142
if (! (Test-Path $NUGET_EXE )) {
52
- Throw " Could not find 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
+ }
53
149
}
54
150
151
+ # Save nuget.exe path to environment to be available to child processed
152
+ $ENV: NUGET_EXE = $NUGET_EXE
153
+
55
154
# Restore tools from NuGet?
56
- if (-Not $SkipToolPackageRestore.IsPresent )
57
- {
155
+ if (-Not $SkipToolPackageRestore.IsPresent ) {
58
156
Push-Location
59
157
Set-Location $TOOLS_DIR
60
- Invoke-Expression " $NUGET_EXE install -ExcludeVersion"
61
- Pop-Location
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
+
62
170
if ($LASTEXITCODE -ne 0 ) {
63
- exit $LASTEXITCODE
171
+ Throw " An error occured while restoring NuGet tools. "
64
172
}
173
+ else
174
+ {
175
+ $md5Hash | Out-File $PACKAGES_CONFIG_MD5 - Encoding " ASCII"
176
+ }
177
+ Write-Verbose - Message ($NuGetOutput | out-string )
178
+ Pop-Location
65
179
}
66
180
67
181
# Make sure that Cake has been installed.
68
182
if (! (Test-Path $CAKE_EXE )) {
69
- Throw " Could not find Cake.exe"
183
+ Throw " Could not find Cake.exe at $CAKE_EXE "
70
184
}
71
185
72
186
# Start Cake
73
- Invoke-Expression " $CAKE_EXE `" $Script `" -target=`" $Target `" -configuration=`" $Configuration `" -verbosity=`" $Verbosity `" $UseMono $UseDryRun $UseExperimental $ScriptArgs "
187
+ Write-Host " Running build script..."
188
+ Invoke-Expression " & `" $CAKE_EXE `" `" $Script `" -target=`" $Target `" -configuration=`" $Configuration `" -verbosity=`" $Verbosity `" $UseMono $UseDryRun $UseExperimental $ScriptArgs "
74
189
exit $LASTEXITCODE
0 commit comments