From d535daabd641820ce682cf5fe6ecdba0aa6d055d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 1 Dec 2018 14:04:12 +0100 Subject: [PATCH] Initial Nuke build system --- .nuke | 0 ThemeEditor.sln | 8 +++ build.ps1 | 69 ++++++++++++++++++++++++++ build.sh | 72 +++++++++++++++++++++++++++ build/Build.cs | 86 +++++++++++++++++++++++++++++++++ build/_build.csproj | 22 +++++++++ build/_build.csproj.DotSettings | 23 +++++++++ 7 files changed, 280 insertions(+) create mode 100644 .nuke create mode 100644 build.ps1 create mode 100644 build.sh create mode 100644 build/Build.cs create mode 100644 build/_build.csproj create mode 100644 build/_build.csproj.DotSettings diff --git a/.nuke b/.nuke new file mode 100644 index 0000000..e69de29 diff --git a/ThemeEditor.sln b/ThemeEditor.sln index 664b828..b33dca6 100644 --- a/ThemeEditor.sln +++ b/ThemeEditor.sln @@ -1,3 +1,4 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28010.2046 @@ -5,6 +6,8 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{3353FD4A-FE9B-4670-86C9-09EF0F7CEDB2}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig + build.ps1 = build.ps1 + build.sh = build.sh EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{2134CB05-065F-4694-83B7-3DF4E9CAFD0E}" @@ -48,6 +51,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{F2D7C825 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThemeEditor.Controls.ColorPicker.UnitTests", "tests\ThemeEditor.Controls.ColorPicker.UnitTests\ThemeEditor.Controls.ColorPicker.UnitTests.csproj", "{A8EB278A-149D-4BE4-8388-86EFB0D9030F}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "build\_build.csproj", "{DD390F62-BC92-4012-9C09-B2ED62CBFAA4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -66,6 +71,8 @@ Global {A8EB278A-149D-4BE4-8388-86EFB0D9030F}.Debug|Any CPU.Build.0 = Debug|Any CPU {A8EB278A-149D-4BE4-8388-86EFB0D9030F}.Release|Any CPU.ActiveCfg = Release|Any CPU {A8EB278A-149D-4BE4-8388-86EFB0D9030F}.Release|Any CPU.Build.0 = Release|Any CPU + {DD390F62-BC92-4012-9C09-B2ED62CBFAA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD390F62-BC92-4012-9C09-B2ED62CBFAA4}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -78,6 +85,7 @@ Global {683D24E2-5AE0-468F-8A2B-4B1936DAB7FB} = {219954C4-6A40-4D94-914E-148B7EBB718E} {DA3A88E9-BB02-4ED7-9760-7FF14257F23D} = {219954C4-6A40-4D94-914E-148B7EBB718E} {A8EB278A-149D-4BE4-8388-86EFB0D9030F} = {F2D7C825-1AC1-45FF-A221-CEE80E2F2374} + {DD390F62-BC92-4012-9C09-B2ED62CBFAA4} = {3353FD4A-FE9B-4670-86C9-09EF0F7CEDB2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CF676549-9409-4598-8229-80E04B51ADC5} diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..64beb44 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,69 @@ +[CmdletBinding()] +Param( + #[switch]$CustomParam, + [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 +$env:NUGET_XMLDOC_MODE = "skip" + +########################################################################### +# 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 run --project $BuildProjectFile -- $BuildArguments } diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..5a69449 --- /dev/null +++ b/build.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +echo $(bash --version 2>&1 | head -n 1) + +#CUSTOMPARAM=0 +BUILD_ARGUMENTS=() +for i in "$@"; do + case $(echo $1 | awk '{print tolower($0)}') in + # -custom-param) CUSTOMPARAM=1;; + *) BUILD_ARGUMENTS+=("$1") ;; + esac + shift +done + +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 +export NUGET_XMLDOC_MODE="skip" + +########################################################################### +# 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" run --project "$BUILD_PROJECT_FILE" -- ${BUILD_ARGUMENTS[@]} diff --git a/build/Build.cs b/build/Build.cs new file mode 100644 index 0000000..7b00e91 --- /dev/null +++ b/build/Build.cs @@ -0,0 +1,86 @@ +using System; +using System.Linq; +using Nuke.Common; +using Nuke.Common.Git; +using Nuke.Common.ProjectModel; +using Nuke.Common.Tools.DotNet; +using static Nuke.Common.EnvironmentInfo; +using static Nuke.Common.IO.FileSystemTasks; +using static Nuke.Common.IO.PathConstruction; +using static Nuke.Common.Tools.DotNet.DotNetTasks; + +class Build : NukeBuild +{ + public static int Main () => Execute(x => x.Compile); + + [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")] + readonly string Configuration = IsLocalBuild ? "Debug" : "Release"; + + [Solution("ThemeEditor.sln")] readonly Solution Solution; + [GitRepository] readonly GitRepository GitRepository; + + AbsolutePath SourceDirectory => RootDirectory / "src"; + AbsolutePath TestsDirectory => RootDirectory / "tests"; + AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts"; + + Target Clean => _ => _ + .Executes(() => + { + DeleteDirectories(GlobDirectories(SourceDirectory, "**/bin", "**/obj")); + DeleteDirectories(GlobDirectories(TestsDirectory, "**/bin", "**/obj")); + EnsureCleanDirectory(ArtifactsDirectory); + }); + + Target Restore => _ => _ + .DependsOn(Clean) + .Executes(() => + { + DotNetRestore(s => s + .SetProjectFile(Solution)); + }); + + Target Compile => _ => _ + .DependsOn(Restore) + .Executes(() => + { + DotNetBuild(s => s + .SetProjectFile(Solution) + .SetConfiguration(Configuration) + .EnableNoRestore()); + }); + + Target Test => _ => _ + .DependsOn(Compile) + .Executes(() => + { + DotNetTest(s => s + .SetProjectFile(Solution) + .SetConfiguration(Configuration) + .EnableNoBuild() + .EnableNoRestore()); + }); + + Target Pack => _ => _ + .DependsOn(Test) + .Executes(() => + { + DotNetPack(s => s + .SetProject(Solution) + .SetConfiguration(Configuration) + .SetOutputDirectory(ArtifactsDirectory / "NuGet") + .EnableNoBuild() + .EnableNoRestore()); + }); + + Target Publish => _ => _ + .DependsOn(Test) + .Executes(() => + { + DotNetPublish(s => s + .SetProject(Solution.GetProject("ThemeEditor")) + .SetConfiguration(Configuration) + .SetFramework("netcoreapp2.1") + .SetRuntime("win7-x64") + .SetOutput(ArtifactsDirectory / "Publish" / "ThemeEditor-win7-x64")); + }); +} diff --git a/build/_build.csproj b/build/_build.csproj new file mode 100644 index 0000000..335687c --- /dev/null +++ b/build/_build.csproj @@ -0,0 +1,22 @@ + + + + Exe + netcoreapp2.0 + false + + False + CS0649;CS0169 + + + + + + + + + + + + + diff --git a/build/_build.csproj.DotSettings b/build/_build.csproj.DotSettings new file mode 100644 index 0000000..96e392e --- /dev/null +++ b/build/_build.csproj.DotSettings @@ -0,0 +1,23 @@ + + False + Implicit + Implicit + ExpressionBody + 0 + NEXT_LINE + True + False + 120 + IF_OWNER_IS_SINGLE_LINE + WRAP_IF_LONG + False + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + True + True + True + True + True + True + True + True