diff --git a/build.cake b/build.cake index 81352cb..5127451 100644 --- a/build.cake +++ b/build.cake @@ -1,6 +1,5 @@ -#tool nuget:?package=NUnit.ConsoleRunner&version=3.6.1 +#tool nuget:?package=NUnit.ConsoleRunner&version=3.7.0 #tool nuget:?package=GitVersion.CommandLine -#addin "Cake.Incubator" using System.Text.RegularExpressions; diff --git a/build.ps1 b/build.ps1 index 519ad09..d24357a 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,55 +1,222 @@ +########################################################################## +# 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 ShowDescription +Shows description about tasks. +.PARAMETER DryRun +Performs a dry run. +.PARAMETER Experimental +Uses the nightly builds of the Roslyn script engine. +.PARAMETER Mono +Uses the Mono Compiler rather than the Roslyn script engine. +.PARAMETER SkipToolPackageRestore +Skips restoring of packages. +.PARAMETER ScriptArgs +Remaining arguments are added here. + +.LINK +https://cakebuild.net + +#> + +[CmdletBinding()] Param( [string]$Script = "build.cake", - [string]$Target = "Default", - [ValidateSet("Release", "Debug")] - [string]$Configuration = "Release", + [string]$Target, + [string]$Configuration, [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")] - [string]$Verbosity = "Verbose", + [string]$Verbosity, + [switch]$ShowDescription, + [Alias("WhatIf", "Noop")] + [switch]$DryRun, [switch]$Experimental, - [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" +$ADDINS_DIR = Join-Path $TOOLS_DIR "Addins" +$MODULES_DIR = Join-Path $TOOLS_DIR "Modules" $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" +$ADDINS_PACKAGES_CONFIG = Join-Path $ADDINS_DIR "packages.config" +$MODULES_PACKAGES_CONFIG = Join-Path $MODULES_DIR "packages.config" -# Should we use experimental build of Roslyn? -$UseExperimental = ""; -if($Experimental.IsPresent) { - $UseExperimental = "-experimental" +# 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 } -# Is this a dry run? -$UseDryRun = ""; -if($WhatIf.IsPresent) { - $UseDryRun = "-dryrun" +# Make sure that packages.config exist. +if (!(Test-Path $PACKAGES_CONFIG)) { + Write-Verbose -Message "Downloading packages.config..." + try { (New-Object System.Net.WebClient).DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch { + Throw "Could not download packages.config." + } } -# Try download NuGet.exe if do not exist. +# Try find NuGet.exe in path if not exists if (!(Test-Path $NUGET_EXE)) { - Invoke-WebRequest -Uri http://nuget.org/nuget.exe -OutFile $NUGET_EXE + Write-Verbose -Message "Trying to find nuget.exe in PATH..." + $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) } + $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 + } } -# Make sure NuGet exists where we expect it. +# Try download NuGet.exe if not exists if (!(Test-Path $NUGET_EXE)) { - Throw "Could not find 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." + } } -# Restore tools from NuGet. -Push-Location -Set-Location $TOOLS_DIR -Invoke-Expression "$NUGET_EXE install -ExcludeVersion" -Pop-Location -if ($LASTEXITCODE -ne 0) { - exit $LASTEXITCODE +# 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 + { + $md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII" + } + Write-Verbose -Message ($NuGetOutput | out-string) + + Pop-Location +} + +# Restore addins from NuGet +if (Test-Path $ADDINS_PACKAGES_CONFIG) { + Push-Location + Set-Location $ADDINS_DIR + + Write-Verbose -Message "Restoring addins from NuGet..." + $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$ADDINS_DIR`"" + + if ($LASTEXITCODE -ne 0) { + Throw "An error occured while restoring NuGet addins." + } + + Write-Verbose -Message ($NuGetOutput | out-string) + + Pop-Location +} + +# Restore modules from NuGet +if (Test-Path $MODULES_PACKAGES_CONFIG) { + Push-Location + Set-Location $MODULES_DIR + + Write-Verbose -Message "Restoring modules from NuGet..." + $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$MODULES_DIR`"" + + if ($LASTEXITCODE -ne 0) { + Throw "An error occured while restoring NuGet modules." + } + + 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" + Throw "Could not find Cake.exe at $CAKE_EXE" } + + +# Build Cake arguments +$cakeArguments = @("$Script"); +if ($Target) { $cakeArguments += "-target=$Target" } +if ($Configuration) { $cakeArguments += "-configuration=$Configuration" } +if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" } +if ($ShowDescription) { $cakeArguments += "-showdescription" } +if ($DryRun) { $cakeArguments += "-dryrun" } +if ($Experimental) { $cakeArguments += "-experimental" } +if ($Mono) { $cakeArguments += "-mono" } +$cakeArguments += $ScriptArgs + # Start Cake -Invoke-Expression "$CAKE_EXE `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseDryRun $UseExperimental" -Write-Host -exit $LASTEXITCODE \ No newline at end of file +Write-Host "Running build script..." +&$CAKE_EXE $cakeArguments +exit $LASTEXITCODE diff --git a/build.sh b/build.sh index b9f997f..e5a95bc 100755 --- a/build.sh +++ b/build.sh @@ -1,40 +1,64 @@ -#!/bin/bash -############################################################### -# This is the Cake bootstrapper script that is responsible for -# downloading Cake and all specified tools from NuGet. -############################################################### +#!/usr/bin/env bash + +########################################################################## +# This is the Cake bootstrapper script for Linux and OS X. +# This file was downloaded from https://github.com/cake-build/resources +# Feel free to change this file to fit your needs. +########################################################################## # Define directories. SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) TOOLS_DIR=$SCRIPT_DIR/tools +ADDINS_DIR=$TOOLS_DIR/Addins +MODULES_DIR=$TOOLS_DIR/Modules NUGET_EXE=$TOOLS_DIR/nuget.exe CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe +PACKAGES_CONFIG=$TOOLS_DIR/packages.config +PACKAGES_CONFIG_MD5=$TOOLS_DIR/packages.config.md5sum +ADDINS_PACKAGES_CONFIG=$ADDINS_DIR/packages.config +MODULES_PACKAGES_CONFIG=$MODULES_DIR/packages.config + +# Define md5sum or md5 depending on Linux/OSX +MD5_EXE= +if [[ "$(uname -s)" == "Darwin" ]]; then + MD5_EXE="md5 -r" +else + MD5_EXE="md5sum" +fi # Define default arguments. SCRIPT="build.cake" -TARGET="Default" -CONFIGURATION="Release" -VERBOSITY="verbose" -DRYRUN=false -SHOW_VERSION=false +CAKE_ARGUMENTS=() # Parse arguments. for i in "$@"; do case $1 in -s|--script) SCRIPT="$2"; shift ;; - -t|--target) TARGET="$2"; shift ;; - -c|--configuration) CONFIGURATION="$2"; shift ;; - -v|--verbosity) VERBOSITY="$2"; shift ;; - -d|--dryrun) DRYRUN=true ;; - --version) SHOW_VERSION=true ;; + --) shift; CAKE_ARGUMENTS+=("$@"); break ;; + *) CAKE_ARGUMENTS+=("$1") ;; esac shift done +# Make sure the tools folder exist. +if [ ! -d "$TOOLS_DIR" ]; then + mkdir "$TOOLS_DIR" +fi + +# Make sure that packages.config exist. +if [ ! -f "$TOOLS_DIR/packages.config" ]; then + echo "Downloading packages.config..." + curl -Lsfo "$TOOLS_DIR/packages.config" https://cakebuild.net/download/bootstrapper/packages + if [ $? -ne 0 ]; then + echo "An error occured while downloading packages.config." + exit 1 + fi +fi + # Download NuGet if it does not exist. -if [ ! -f $NUGET_EXE ]; then +if [ ! -f "$NUGET_EXE" ]; then echo "Downloading NuGet..." - curl -Lsfo $NUGET_EXE https://www.nuget.org/nuget.exe + curl -Lsfo "$NUGET_EXE" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe if [ $? -ne 0 ]; then echo "An error occured while downloading nuget.exe." exit 1 @@ -42,24 +66,52 @@ if [ ! -f $NUGET_EXE ]; then fi # Restore tools from NuGet. -pushd $TOOLS_DIR >/dev/null -mono $NUGET_EXE install -ExcludeVersion -popd >/dev/null +pushd "$TOOLS_DIR" >/dev/null +if [ ! -f "$PACKAGES_CONFIG_MD5" ] || [ "$( cat "$PACKAGES_CONFIG_MD5" | sed 's/\r$//' )" != "$( $MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' )" ]; then + find . -type d ! -name . | xargs rm -rf +fi -# Make sure that Cake has been installed. -if [ ! -f $CAKE_EXE ]; then - echo "Could not find Cake.exe." +mono "$NUGET_EXE" install -ExcludeVersion +if [ $? -ne 0 ]; then + echo "Could not restore NuGet tools." exit 1 fi -# Start Cake -if $SHOW_VERSION; then - mono $CAKE_EXE -version -elif $DRYRUN; then - mono $CAKE_EXE $SCRIPT -verbosity=$VERBOSITY -configuration=$CONFIGURATION -target=$TARGET -dryrun -else - mono $CAKE_EXE $SCRIPT -verbosity=$VERBOSITY -configuration=$CONFIGURATION -target=$TARGET +$MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' >| "$PACKAGES_CONFIG_MD5" + +popd >/dev/null + +# Restore addins from NuGet. +if [ -f "$ADDINS_PACKAGES_CONFIG" ]; then + pushd "$ADDINS_DIR" >/dev/null + + mono "$NUGET_EXE" install -ExcludeVersion + if [ $? -ne 0 ]; then + echo "Could not restore NuGet addins." + exit 1 + fi + + popd >/dev/null fi -exit $? +# Restore modules from NuGet. +if [ -f "$MODULES_PACKAGES_CONFIG" ]; then + pushd "$MODULES_DIR" >/dev/null + mono "$NUGET_EXE" install -ExcludeVersion + if [ $? -ne 0 ]; then + echo "Could not restore NuGet modules." + exit 1 + fi + + popd >/dev/null +fi + +# Make sure that Cake has been installed. +if [ ! -f "$CAKE_EXE" ]; then + echo "Could not find Cake.exe at '$CAKE_EXE'." + exit 1 +fi + +# Start Cake +exec mono "$CAKE_EXE" $SCRIPT "${CAKE_ARGUMENTS[@]}" diff --git a/src/demo-assembly/demo-assembly.csproj b/src/demo-assembly/demo-assembly.csproj index c68f750..1c88716 100644 --- a/src/demo-assembly/demo-assembly.csproj +++ b/src/demo-assembly/demo-assembly.csproj @@ -38,9 +38,8 @@ false - - ..\..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll - True + + ..\..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll diff --git a/src/demo-assembly/packages.config b/src/demo-assembly/packages.config index 8e3be78..48fcf5d 100644 --- a/src/demo-assembly/packages.config +++ b/src/demo-assembly/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/mock-assembly/mock-assembly.csproj b/src/mock-assembly/mock-assembly.csproj index a651019..31d8aff 100644 --- a/src/mock-assembly/mock-assembly.csproj +++ b/src/mock-assembly/mock-assembly.csproj @@ -63,13 +63,11 @@ - - ..\..\packages\NUnit.3.6.1\lib\net20\nunit.framework.dll - True + + ..\..\packages\NUnit.3.7.1\lib\net20\nunit.framework.dll - ..\..\packages\NUnit.3.6.1\lib\net20\NUnit.System.Linq.dll - True + ..\..\packages\NUnit.3.7.1\lib\net20\NUnit.System.Linq.dll System diff --git a/src/mock-assembly/packages.config b/src/mock-assembly/packages.config index 44dfe16..27e4160 100644 --- a/src/mock-assembly/packages.config +++ b/src/mock-assembly/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/nunit-gui/nunit-gui.csproj b/src/nunit-gui/nunit-gui.csproj index 87bef2f..2ed9088 100644 --- a/src/nunit-gui/nunit-gui.csproj +++ b/src/nunit-gui/nunit-gui.csproj @@ -37,7 +37,7 @@ - ..\..\packages\NUnit.Engine.Api.3.6.1\lib\nunit.engine.api.dll + ..\..\packages\NUnit.Engine.Api.3.7.0\lib\nunit.engine.api.dll True @@ -226,19 +226,19 @@ PreserveNewest - + nunit-agent-x86.exe PreserveNewest - + nunit-agent-x86.exe.config PreserveNewest - + nunit-agent.exe PreserveNewest - + nunit-agent.exe.config PreserveNewest diff --git a/src/nunit-gui/packages.config b/src/nunit-gui/packages.config index b4636e0..2db5070 100644 --- a/src/nunit-gui/packages.config +++ b/src/nunit-gui/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/nunit.gui.core/Model/ResultSummaryReporter.cs b/src/nunit.gui.core/Model/ResultSummaryReporter.cs index 484b410..dbbbc66 100644 --- a/src/nunit.gui.core/Model/ResultSummaryReporter.cs +++ b/src/nunit.gui.core/Model/ResultSummaryReporter.cs @@ -58,7 +58,7 @@ public static string WriteSummaryReport(ResultSummary summary) writer.AppendLine($" Start time: {summary.StartTime:u}"); writer.AppendLine($" End time: {summary.EndTime:u}"); - writer.AppendLine($" Duration: {summary.Duration:0.000}"); + writer.AppendUICultureFormattedNumber(" Duration: ", summary.Duration); return writer.ToString(); } @@ -68,5 +68,11 @@ private static void AppendUICultureFormattedNumber(this StringBuilder sb, string sb.Append(label); sb.Append(number.ToString("n0", CultureInfo.CurrentUICulture)); } + + private static void AppendUICultureFormattedNumber(this StringBuilder sb, string label, double number) + { + sb.Append(label); + sb.Append(number.ToString("n3", CultureInfo.CurrentUICulture)); + } } } \ No newline at end of file diff --git a/src/nunit.gui.core/nunit.gui.core.csproj b/src/nunit.gui.core/nunit.gui.core.csproj index 63f8317..97d0561 100644 --- a/src/nunit.gui.core/nunit.gui.core.csproj +++ b/src/nunit.gui.core/nunit.gui.core.csproj @@ -32,7 +32,7 @@ - ..\..\packages\NUnit.Engine.Api.3.6.1\lib\nunit.engine.api.dll + ..\..\packages\NUnit.Engine.Api.3.7.0\lib\nunit.engine.api.dll True diff --git a/src/nunit.gui.core/packages.config b/src/nunit.gui.core/packages.config index b4636e0..2db5070 100644 --- a/src/nunit.gui.core/packages.config +++ b/src/nunit.gui.core/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/tests/Model/ResultStateTests.cs b/src/tests/Model/ResultStateTests.cs index 4ff008f..f83979f 100644 --- a/src/tests/Model/ResultStateTests.cs +++ b/src/tests/Model/ResultStateTests.cs @@ -101,7 +101,7 @@ public void Site_ConstructorWithThreeArguments_ReturnsSite(string label, Failure Assert.AreEqual(site, resultState.Site); } - [TestCase(TestStatus.Skipped, SpecialValue.Null, "Skipped")] + [TestCase(TestStatus.Skipped, null, "Skipped")] [TestCase(TestStatus.Passed, "", "Passed")] [TestCase(TestStatus.Passed, "testLabel", "Passed:testLabel")] public void ToString_Constructor_ReturnsExpectedString(TestStatus status, string label, string expected) diff --git a/src/tests/Model/ResultSummaryReporterTests.cs b/src/tests/Model/ResultSummaryReporterTests.cs index 2a58d94..bd8d0a3 100644 --- a/src/tests/Model/ResultSummaryReporterTests.cs +++ b/src/tests/Model/ResultSummaryReporterTests.cs @@ -139,13 +139,12 @@ public void ReportContainsExtendedSkipInformationWhenItHasSkips(int ignoreCount, } [Test] - public void ReportContainsStartAndEndDateAndDuration() + public void ReportContainsStartAndEndDate() { var summary = new ResultSummary { StartTime = new DateTime(2015, 10, 21, 7, 28, 30), EndTime = new DateTime(2015, 10, 21, 16, 20, 45), - Duration = 123.456789, OverallResult = String.Empty }; @@ -153,7 +152,6 @@ public void ReportContainsStartAndEndDateAndDuration() Assert.That(report, Does.Contain("Start time: 2015-10-21 07:28:30Z")); Assert.That(report, Does.Contain("End time: 2015-10-21 16:20:45Z")); - Assert.That(report, Does.Contain("Duration: 123.457")); } [Test, SetUICulture("de-DE")] @@ -171,6 +169,7 @@ public void ReportWithDifferentUICultureFormatsNumbersAccordingToUICulture() InvalidCount = 10000, IgnoreCount = 10000, ExplicitCount = 10000, + Duration = 123.456789, OverallResult = String.Empty }; @@ -188,6 +187,7 @@ public void ReportWithDifferentUICultureFormatsNumbersAccordingToUICulture() Assert.That(report, Does.Contain("Skipped Tests - Ignored: 10.000")); Assert.That(report, Does.Contain("Explicit: 10.000")); Assert.That(report, Does.Contain("Other: 10.000")); + Assert.That(report, Does.Contain("Duration: 123,457")); } } } diff --git a/src/tests/nunit-gui.tests.csproj b/src/tests/nunit-gui.tests.csproj index 3f42467..0d068fc 100644 --- a/src/tests/nunit-gui.tests.csproj +++ b/src/tests/nunit-gui.tests.csproj @@ -32,24 +32,20 @@ - ..\..\packages\NUnit.Engine.3.6.1\lib\Mono.Cecil.dll - True + ..\..\packages\NUnit.Engine.3.7.0\lib\Mono.Cecil.dll ..\..\packages\NSubstitute.2.0.3\lib\net35\NSubstitute.dll True - - ..\..\packages\NUnit.Engine.3.6.1\lib\nunit.engine.dll - True + + ..\..\packages\NUnit.Engine.3.7.0\lib\nunit.engine.dll - ..\..\packages\NUnit.Engine.3.6.1\lib\nunit.engine.api.dll - True + ..\..\packages\NUnit.Engine.3.7.0\lib\nunit.engine.api.dll - - ..\..\packages\NUnit.3.6.1\lib\net35\nunit.framework.dll - True + + ..\..\packages\NUnit.3.7.1\lib\net35\nunit.framework.dll diff --git a/src/tests/packages.config b/src/tests/packages.config index a60a598..fed7e59 100644 --- a/src/tests/packages.config +++ b/src/tests/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/tools/nuget.exe b/tools/nuget.exe deleted file mode 100644 index 324daa8..0000000 Binary files a/tools/nuget.exe and /dev/null differ diff --git a/tools/packages.config b/tools/packages.config index b9d1383..7ab34be 100644 --- a/tools/packages.config +++ b/tools/packages.config @@ -1,5 +1,5 @@ - +