diff --git a/.gitignore b/.gitignore index b41c323..700913b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ build/ [Oo]bj/ .vs/ tools/Cake +.dotnet # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets !packages/*/build/ diff --git a/build.cake b/build.cake index cd9bab8..0a29faf 100644 --- a/build.cake +++ b/build.cake @@ -1,7 +1,8 @@ -#addin "Cake.ExtendedNuGet" -#addin "nuget:?package=NuGet.Core&version=2.8.6" +#addin "nuget:?package=Cake.ExtendedNuGet&version=1.0.0.22" +#addin "nuget:?package=NuGet.Core&version=2.12.0" #addin "Cake.FileHelpers" + ////////////////////////////////////////////////////////////////////// // ARGUMENTS ////////////////////////////////////////////////////////////////////// @@ -13,8 +14,8 @@ var configuration = Argument("configuration", "Release"); // VERSION ////////////////////////////////////////////////////////////////////// -var version = "3.6.0"; -var displayVersion = "3.6.0"; +var version = "3.6.1"; +var displayVersion = "3.6.1"; ////////////////////////////////////////////////////////////////////// // NUGET PACKAGES @@ -101,9 +102,9 @@ Task("WriteComponentsFile") .Does(context => { List lines = new List { "This package contains the following components:", "" }; - + var packageDirs = new [] { RUNNER_PACKAGES_DIR, EXTENSION_PACKAGES_DIR }; - + foreach (var packageDir in packageDirs) { foreach(var nupkgPath in GetFiles(packageDir + "*/*.nupkg")) diff --git a/build.ps1 b/build.ps1 index e731825..bcb4141 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,58 +1,129 @@ +<# +.SYNOPSIS +This is a Powershell script to bootstrap a Cake build. +.DESCRIPTION +This Powershell script will download NuGet if missing, restore NuGet tools (including Cake) +and execute your Cake build script with the parameters you provide. +.PARAMETER Target +The build script target to run. +.PARAMETER Configuration +The build configuration to use. +.PARAMETER Verbosity +Specifies the amount of information to be displayed. +.PARAMETER WhatIf +Performs a dry run of the build script. +No tasks will be executed. +.PARAMETER ScriptArgs +Remaining arguments are added here. +.LINK +http://cakebuild.net +#> + +[CmdletBinding()] Param( - [string]$Script = "build.cake", [string]$Target = "Default", [ValidateSet("Release", "Debug")] [string]$Configuration = "Release", [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")] [string]$Verbosity = "Verbose", - [switch]$Experimental, - [switch]$WhatIf + [switch]$WhatIf, + [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] + [string[]]$ScriptArgs ) -$TOOLS_DIR = Join-Path $PSScriptRoot "tools" -$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe" -$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe" +$CakeVersion = "0.17.0" +$DotNetChannel = "preview"; +$DotNetVersion = "1.0.0-preview2-003121"; +$DotNetInstallerUri = "https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview2/scripts/obtain/dotnet-install.ps1"; +$NugetUrl = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -# Experimental currently required due to https://github.com/Redth/Cake.ExtendedNuGet/issues/7 -$UseExperimental = "-experimental" - -# Should we use experimental build of Roslyn? -#$UseExperimental = ""; -#if($Experimental.IsPresent) { -# $UseExperimental = "-experimental" -#} - -# Is this a dry run? -$UseDryRun = ""; -if($WhatIf.IsPresent) { - $UseDryRun = "-dryrun" +# Make sure tools folder exists +$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent +$ToolPath = Join-Path $PSScriptRoot "tools" +if (!(Test-Path $ToolPath)) { + Write-Verbose "Creating tools directory..." + New-Item -Path $ToolPath -Type directory | out-null } -# Try download NuGet.exe if do not exist. -if (!(Test-Path $NUGET_EXE)) { - Invoke-WebRequest -Uri http://nuget.org/nuget.exe -OutFile $NUGET_EXE +########################################################################### +# INSTALL .NET CORE CLI +########################################################################### + +Function Remove-PathVariable([string]$VariableToRemove) +{ + $path = [Environment]::GetEnvironmentVariable("PATH", "User") + if ($path -ne $null) + { + $newItems = $path.Split(';', [StringSplitOptions]::RemoveEmptyEntries) | Where-Object { "$($_)" -inotlike $VariableToRemove } + [Environment]::SetEnvironmentVariable("PATH", [System.String]::Join(';', $newItems), "User") + } + + $path = [Environment]::GetEnvironmentVariable("PATH", "Process") + if ($path -ne $null) + { + $newItems = $path.Split(';', [StringSplitOptions]::RemoveEmptyEntries) | Where-Object { "$($_)" -inotlike $VariableToRemove } + [Environment]::SetEnvironmentVariable("PATH", [System.String]::Join(';', $newItems), "Process") + } } -# Make sure NuGet exists where we expect it. -if (!(Test-Path $NUGET_EXE)) { - Throw "Could not find NuGet.exe" +# Get .NET Core CLI path if installed. +$FoundDotNetCliVersion = $null; +if (Get-Command dotnet -ErrorAction SilentlyContinue) { + $FoundDotNetCliVersion = dotnet --version; } -# Restore tools from NuGet. -Push-Location -Set-Location $TOOLS_DIR -Invoke-Expression "$NUGET_EXE install -ExcludeVersion" -Pop-Location -if ($LASTEXITCODE -ne 0) { - exit $LASTEXITCODE +if($FoundDotNetCliVersion -ne $DotNetVersion) { + $InstallPath = Join-Path $PSScriptRoot ".dotnet" + if (!(Test-Path $InstallPath)) { + mkdir -Force $InstallPath | Out-Null; + } + (New-Object System.Net.WebClient).DownloadFile($DotNetInstallerUri, "$InstallPath\dotnet-install.ps1"); + & $InstallPath\dotnet-install.ps1 -Channel $DotNetChannel -Version $DotNetVersion -InstallDir $InstallPath; + + Remove-PathVariable "$InstallPath" + $env:PATH = "$InstallPath;$env:PATH" + $env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + $env:DOTNET_CLI_TELEMETRY_OPTOUT=1 } -# Make sure that Cake has been installed. -if (!(Test-Path $CAKE_EXE)) { - Throw "Could not find Cake.exe" +########################################################################### +# INSTALL NUGET +########################################################################### + +# Make sure nuget.exe exists. +$NugetPath = Join-Path $ToolPath "nuget.exe" +if (!(Test-Path $NugetPath)) { + Write-Host "Downloading NuGet.exe..." + (New-Object System.Net.WebClient).DownloadFile($NugetUrl, $NugetPath); } +########################################################################### +# INSTALL CAKE +########################################################################### + +# Make sure Cake has been installed. +$CakePath = Join-Path $ToolPath "Cake.$CakeVersion/Cake.exe" +if (!(Test-Path $CakePath)) { + Write-Host "Installing Cake..." + Invoke-Expression "&`"$NugetPath`" install Cake -Version $CakeVersion -OutputDirectory `"$ToolPath`"" | Out-Null; + if ($LASTEXITCODE -ne 0) { + Throw "An error occured while restoring Cake from NuGet." + } +} + +########################################################################### +# RUN BUILD SCRIPT +########################################################################### + +# Build the argument list. +$Arguments = @{ + target=$Target; + configuration=$Configuration; + verbosity=$Verbosity; + dryrun=$WhatIf; +}.GetEnumerator() | %{"--{0}=`"{1}`"" -f $_.key, $_.value }; + # Start Cake -Invoke-Expression "$CAKE_EXE `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseDryRun $UseExperimental" -Write-Host +Write-Host "Running build script..." +Invoke-Expression "& `"$CakePath`" `"build.cake`" $Arguments $ScriptArgs" exit $LASTEXITCODE \ No newline at end of file