diff --git a/.gitignore b/.gitignore index 37996df..52a4567 100644 --- a/.gitignore +++ b/.gitignore @@ -191,6 +191,7 @@ _Pvt_Extensions/ ModelManifest.xml # Cake tools +.dotnet tools/* # NuGet restore diff --git a/build.cake b/build.cake index aeb84a7..18f04dd 100644 --- a/build.cake +++ b/build.cake @@ -12,14 +12,12 @@ var configuration = Argument("configuration", "Release"); var isLocal = BuildSystem.IsLocalBuild; var isRunningOnAppVeyor = AppVeyor.IsRunningOnAppVeyor; -var version = "3.7.0"; +var version = "3.10.1"; var packageModifier = configuration == "Debug" ? "-dbg" : ""; // Directories var basePath = Context.Environment.WorkingDirectory.FullPath; -var outputDirectory = basePath + "/bin/" + configuration; -var androidDirectory = basePath + "/src/runner/nunit.runner.Droid/bin/" + configuration; -var iosDirectory = basePath + "/src/runner/nunit.runner.iOS/bin/AnyCPU/" + configuration; +var outputDirectory = basePath + "/src/nunit.xamarin/bin/" + configuration; ////////////////////////////////////////////////////////////////////// // SET VERSION @@ -74,26 +72,26 @@ Task("Set-Appveyor-Tag") Task("Clean") .Does(() => { - CleanDirectories(new DirectoryPath[] {outputDirectory, androidDirectory, iosDirectory}); + CleanDirectory(outputDirectory); }); -Task("Restore-NuGet-Packages") +Task("Restore") .Does(() => { - NuGetRestore("./nunit.runner.sln", new NuGetRestoreSettings { + NuGetRestore("./nunit.xamarin.sln", new NuGetRestoreSettings { Source = new List { "https://www.nuget.org/api/v2/", "https://www.myget.org/F/nunit/api/v2" }, - Verbosity = NuGetVerbosity.Quiet + Verbosity = NuGetVerbosity.Quiet }); }); Task("Build") - .IsDependentOn("Restore-NuGet-Packages") + .IsDependentOn("Restore") .Does(() => { - MSBuild("./nunit.runner.sln", new MSBuildSettings() + MSBuild("./nunit.xamarin.sln", new MSBuildSettings() .SetConfiguration(configuration) .SetPlatformTarget(PlatformTarget.MSIL) .WithProperty("TreatWarningsAsErrors", "true") @@ -101,7 +99,7 @@ Task("Build") .SetNodeReuse(false) ); - MSBuild("./src/tests/nunit.runner.tests.uwp/nunit.runner.tests.uwp.csproj", new MSBuildSettings() + MSBuild("./tests/nunit.runner.tests.uwp/nunit.runner.tests.uwp.csproj", new MSBuildSettings() .SetConfiguration(configuration) .SetPlatformTarget(PlatformTarget.x86) .WithProperty("TreatWarningsAsErrors", "true") @@ -115,18 +113,18 @@ Task("Build") // PACKAGE/PUBLISH ////////////////////////////////////////////////////////////////////// -Task("Create-NuGet-Packages") +Task("Package") .IsDependentOn("Build") .Does(() => { - CreateDirectory(outputDirectory); - - NuGetPack("nuget/nunit.runners.xamarin.nuspec", new NuGetPackSettings - { - Version = version, - BasePath = basePath, - OutputDirectory = outputDirectory, - }); + MSBuild("./src/nunit.xamarin/nunit.xamarin.csproj", new MSBuildSettings() + .SetConfiguration(configuration) + .SetPlatformTarget(PlatformTarget.MSIL) + .WithProperty("TreatWarningsAsErrors", "true") + .WithTarget("Pack") + .SetVerbosity(Verbosity.Minimal) + .SetNodeReuse(false) + ); }); Task("UploadArtifacts") @@ -138,34 +136,8 @@ Task("UploadArtifacts") AppVeyor.UploadArtifact(package); }); -Task("Publish-NuGet") - .IsDependentOn("Create-NuGet-Packages") - .WithCriteria(() => isLocal) - .Does(() => -{ - // Resolve the API key. - var apiKey = EnvironmentVariable("NUGET_API_KEY"); - if(string.IsNullOrEmpty(apiKey)) { - throw new InvalidOperationException("Could not resolve NuGet API key."); - } - - // Get the path to the package. - var packagePath = outputDirectory + File(string.Concat("nunit.runner.xamarin.", version, ".nupkg")); - - // Push the package. - NuGetPush(packagePath, new NuGetPushSettings { - ApiKey = apiKey - }); -}); - Task("Default") - .IsDependentOn("Build"); - -Task("Package") - .IsDependentOn("Create-NuGet-Packages"); - -Task("Publish") - .IsDependentOn("Publish-NuGet"); + .IsDependentOn("Build"); Task("Appveyor") .IsDependentOn("Set-Appveyor-Tag") diff --git a/build.ps1 b/build.ps1 index 44de579..a30ce00 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,189 +1,130 @@ -########################################################################## -# This is the Cake bootstrapper script for PowerShell. -# This file was downloaded from https://github.com/cake-build/resources -# Feel free to change this file to fit your needs. -########################################################################## - <# - .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 Script -The build script to execute. .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 Experimental -Tells Cake to use the latest Roslyn release. .PARAMETER WhatIf Performs a dry run of the build script. No tasks will be executed. -.PARAMETER Mono -Tells Cake to use the Mono scripting engine. -.PARAMETER SkipToolPackageRestore -Skips restoring of packages. .PARAMETER ScriptArgs Remaining arguments are added here. - .LINK -http://cakebuild.net - +https://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, - [Alias("DryRun","Noop")] [switch]$WhatIf, - [switch]$Mono, - [switch]$SkipToolPackageRestore, [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] [string[]]$ScriptArgs ) -[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null -function MD5HashFile([string] $filePath) -{ - if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf)) - { - return $null - } - - [System.IO.Stream] $file = $null; - [System.Security.Cryptography.MD5] $md5 = $null; - try - { - $md5 = [System.Security.Cryptography.MD5]::Create() - $file = [System.IO.File]::OpenRead($filePath) - return [System.BitConverter]::ToString($md5.ComputeHash($file)) - } - finally - { - if ($file -ne $null) - { - $file.Dispose() - } - } -} - -Write-Host "Preparing to run build script..." - -if(!$PSScriptRoot){ - $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent -} - -$TOOLS_DIR = Join-Path $PSScriptRoot "tools" -$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe" -$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe" -$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config" -$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum" - -# Should we use mono? -$UseMono = ""; -if($Mono.IsPresent) { - Write-Verbose -Message "Using the Mono based scripting engine." - $UseMono = "-mono" -} - -# Should we use the new Roslyn? -$UseExperimental = ""; -if($Experimental.IsPresent -and !($Mono.IsPresent)) { - Write-Verbose -Message "Using experimental version of Roslyn." - $UseExperimental = "-experimental" -} - -# Is this a dry run? -$UseDryRun = ""; -if($WhatIf.IsPresent) { - $UseDryRun = "-dryrun" -} +$CakeVersion = "0.25.0" +$DotNetChannel = "Current"; +$DotNetVersion = "2.1.4"; +$DotNetInstallerUri = "https://dot.net/v1/dotnet-install.ps1"; +$NugetUrl = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" # Make sure tools folder exists -if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) { - Write-Verbose -Message "Creating tools directory..." - New-Item -Path $TOOLS_DIR -Type directory | out-null +$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 } -# Make sure that packages.config exist. -if (!(Test-Path $PACKAGES_CONFIG)) { - Write-Verbose -Message "Downloading packages.config..." - try { (New-Object System.Net.WebClient).DownloadFile("http://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch { - Throw "Could not download packages.config." - } -} +########################################################################### +# INSTALL .NET CORE CLI +########################################################################### -# Try find NuGet.exe in path if not exists -if (!(Test-Path $NUGET_EXE)) { - Write-Verbose -Message "Trying to find nuget.exe in PATH..." - $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_) } - $NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1 - if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) { - Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)." - $NUGET_EXE = $NUGET_EXE_IN_PATH.FullName - } -} - -# Try download NuGet.exe if not exists -if (!(Test-Path $NUGET_EXE)) { - Write-Verbose -Message "Downloading NuGet.exe..." - try { - (New-Object System.Net.WebClient).DownloadFile($NUGET_URL, $NUGET_EXE) - } catch { - Throw "Could not download NuGet.exe." - } -} - -# Save nuget.exe path to environment to be available to child processed -$ENV:NUGET_EXE = $NUGET_EXE - -# Restore tools from NuGet? -if(-Not $SkipToolPackageRestore.IsPresent) { - Push-Location - Set-Location $TOOLS_DIR - - # Check for changes in packages.config and remove installed tools if true. - [string] $md5Hash = MD5HashFile($PACKAGES_CONFIG) - if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or - ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) { - Write-Verbose -Message "Missing or changed package.config hash..." - Remove-Item * -Recurse -Exclude packages.config,nuget.exe - } - - Write-Verbose -Message "Restoring tools from NuGet..." - $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`"" - - if ($LASTEXITCODE -ne 0) { - Throw "An error occured while restoring NuGet tools." - } - else +Function Remove-PathVariable([string]$VariableToRemove) +{ + $path = [Environment]::GetEnvironmentVariable("PATH", "User") + if ($path -ne $null) { - $md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII" + $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") } - Write-Verbose -Message ($NuGetOutput | out-string) - Pop-Location } -# Make sure that Cake has been installed. -if (!(Test-Path $CAKE_EXE)) { - Throw "Could not find Cake.exe at $CAKE_EXE" +# Get .NET Core CLI path if installed. +$FoundDotNetCliVersion = $null; +if (Get-Command dotnet -ErrorAction SilentlyContinue) { + $FoundDotNetCliVersion = dotnet --version; } +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 + +########################################################################### +# 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 occurred 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 Write-Host "Running build script..." -Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs" -exit $LASTEXITCODE \ No newline at end of file +Invoke-Expression "& `"$CakePath`" `"build.cake`" $Arguments $ScriptArgs" +exit $LASTEXITCODE diff --git a/tools/packages.config b/tools/packages.config index 89d4cd1..2cb55e5 100644 --- a/tools/packages.config +++ b/tools/packages.config @@ -1,4 +1,4 @@ - +