diff --git a/.gitignore b/.gitignore index e61f8c8..48621c2 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,7 @@ lcov.info *.min.js #nodejs -node_modules \ No newline at end of file +node_modules + +output +.tmp \ No newline at end of file diff --git a/.nuke b/.nuke new file mode 100644 index 0000000..ad357e2 --- /dev/null +++ b/.nuke @@ -0,0 +1 @@ +Website.sln \ No newline at end of file diff --git a/Website.sln b/Website.sln index 4cc0ab5..4030b2f 100644 --- a/Website.sln +++ b/Website.sln @@ -1,48 +1,52 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Website", "Website\Website.csproj", "{3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Website.Tests", "Website.Tests\Website.Tests.csproj", "{FAF08828-0677-403F-A627-2793749DB7F1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x64.ActiveCfg = Debug|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x64.Build.0 = Debug|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x86.ActiveCfg = Debug|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x86.Build.0 = Debug|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|Any CPU.Build.0 = Release|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x64.ActiveCfg = Release|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x64.Build.0 = Release|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x86.ActiveCfg = Release|Any CPU - {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x86.Build.0 = Release|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x64.ActiveCfg = Debug|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x64.Build.0 = Debug|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x86.ActiveCfg = Debug|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x86.Build.0 = Debug|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Release|Any CPU.Build.0 = Release|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x64.ActiveCfg = Release|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x64.Build.0 = Release|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x86.ActiveCfg = Release|Any CPU - {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Website", "Website\Website.csproj", "{3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Website.Tests", "Website.Tests\Website.Tests.csproj", "{FAF08828-0677-403F-A627-2793749DB7F1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "build\_build.csproj", "{0752E29F-71E3-4CCD-BEA6-8F171322380F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0752E29F-71E3-4CCD-BEA6-8F171322380F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0752E29F-71E3-4CCD-BEA6-8F171322380F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x64.ActiveCfg = Debug|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x64.Build.0 = Debug|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x86.ActiveCfg = Debug|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Debug|x86.Build.0 = Debug|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|Any CPU.Build.0 = Release|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x64.ActiveCfg = Release|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x64.Build.0 = Release|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x86.ActiveCfg = Release|Any CPU + {3520D9B0-3DA3-4509-9B8E-FDFBEE33E722}.Release|x86.Build.0 = Release|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x64.Build.0 = Debug|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x86.ActiveCfg = Debug|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Debug|x86.Build.0 = Debug|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Release|Any CPU.Build.0 = Release|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x64.ActiveCfg = Release|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x64.Build.0 = Release|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x86.ActiveCfg = Release|Any CPU + {FAF08828-0677-403F-A627-2793749DB7F1}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..cb7fbdb --- /dev/null +++ b/build.ps1 @@ -0,0 +1,68 @@ +[CmdletBinding()] +Param( + [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] + [string[]]$BuildArguments +) + +Write-Output "Windows PowerShell $($Host.Version)" + +Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { exit 1 } +$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent + +########################################################################### +# CONFIGURATION +########################################################################### + +$BuildProjectFile = "$PSScriptRoot\build\_build.csproj" +$TempDirectory = "$PSScriptRoot\\.tmp" + +$DotNetGlobalFile = "$PSScriptRoot\\global.json" +$DotNetInstallUrl = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1" +$DotNetChannel = "Current" + +$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1 +$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1 + +########################################################################### +# EXECUTION +########################################################################### + +function ExecSafe([scriptblock] $cmd) { + & $cmd + if ($LASTEXITCODE) { exit $LASTEXITCODE } +} + +# If global.json exists, load expected version +if (Test-Path $DotNetGlobalFile) { + $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json) + if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) { + $DotNetVersion = $DotNetGlobal.sdk.version + } +} + +# If dotnet is installed locally, and expected version is not set or installation matches the expected version +if ((Get-Command "dotnet" -ErrorAction SilentlyContinue) -ne $null -and ` + (!(Test-Path variable:DotNetVersion) -or $(& dotnet --version) -eq $DotNetVersion)) { + $env:DOTNET_EXE = (Get-Command "dotnet").Path +} +else { + $DotNetDirectory = "$TempDirectory\dotnet-win" + $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe" + + # Download install script + $DotNetInstallFile = "$TempDirectory\dotnet-install.ps1" + md -force $TempDirectory > $null + (New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile) + + # Install by channel or version + if (!(Test-Path variable:DotNetVersion)) { + ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath } + } else { + ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath } + } +} + +Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)" + +ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false } +ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments } diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..6d6e2ad --- /dev/null +++ b/build.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +echo $(bash --version 2>&1 | head -n 1) + +set -eo pipefail +SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) + +########################################################################### +# CONFIGURATION +########################################################################### + +BUILD_PROJECT_FILE="$SCRIPT_DIR/build/_build.csproj" +TEMP_DIRECTORY="$SCRIPT_DIR//.tmp" + +DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json" +DOTNET_INSTALL_URL="https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.sh" +DOTNET_CHANNEL="Current" + +export DOTNET_CLI_TELEMETRY_OPTOUT=1 +export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + +########################################################################### +# EXECUTION +########################################################################### + +function FirstJsonValue { + perl -nle 'print $1 if m{"'$1'": "([^"\-]+)",?}' <<< ${@:2} +} + +# If global.json exists, load expected version +if [ -f "$DOTNET_GLOBAL_FILE" ]; then + DOTNET_VERSION=$(FirstJsonValue "version" $(cat "$DOTNET_GLOBAL_FILE")) + if [ "$DOTNET_VERSION" == "" ]; then + unset DOTNET_VERSION + fi +fi + +# If dotnet is installed locally, and expected version is not set or installation matches the expected version +if [[ -x "$(command -v dotnet)" && (-z ${DOTNET_VERSION+x} || $(dotnet --version) == "$DOTNET_VERSION") ]]; then + export DOTNET_EXE="$(command -v dotnet)" +else + DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix" + export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet" + + # Download install script + DOTNET_INSTALL_FILE="$TEMP_DIRECTORY/dotnet-install.sh" + mkdir -p "$TEMP_DIRECTORY" + curl -Lsfo "$DOTNET_INSTALL_FILE" "$DOTNET_INSTALL_URL" + chmod +x "$DOTNET_INSTALL_FILE" + + # Install by channel or version + if [ -z ${DOTNET_VERSION+x} ]; then + "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --channel "$DOTNET_CHANNEL" --no-path + else + "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path + fi +fi + +echo "Microsoft (R) .NET Core SDK version $("$DOTNET_EXE" --version)" + +"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false +"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@"