diff --git a/.nuke b/.nuke deleted file mode 100644 index 7b6e2b9..0000000 --- a/.nuke +++ /dev/null @@ -1 +0,0 @@ -SpiroNet.sln \ No newline at end of file diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json new file mode 100644 index 0000000..ee72d94 --- /dev/null +++ b/.nuke/build.schema.json @@ -0,0 +1,131 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Build Schema", + "$ref": "#/definitions/build", + "definitions": { + "build": { + "type": "object", + "properties": { + "Configuration": { + "type": "string", + "description": "configuration" + }, + "Continue": { + "type": "boolean", + "description": "Indicates to continue a previously failed build attempt" + }, + "Help": { + "type": "boolean", + "description": "Shows the help text for this build assembly" + }, + "Host": { + "type": "string", + "description": "Host for execution. Default is 'automatic'", + "enum": [ + "AppVeyor", + "AzurePipelines", + "Bamboo", + "Bitrise", + "GitHubActions", + "GitLab", + "Jenkins", + "Rider", + "SpaceAutomation", + "TeamCity", + "Terminal", + "TravisCI", + "VisualStudio", + "VSCode" + ] + }, + "NoLogo": { + "type": "boolean", + "description": "Disables displaying the NUKE logo" + }, + "Partition": { + "type": "string", + "description": "Partition to use on CI" + }, + "Plan": { + "type": "boolean", + "description": "Shows the execution plan (HTML)" + }, + "Profile": { + "type": "array", + "description": "Defines the profiles to load", + "items": { + "type": "string" + } + }, + "PublishFramework": { + "type": "string", + "description": "publish-framework" + }, + "PublishProject": { + "type": "string", + "description": "publish-project" + }, + "PublishRuntime": { + "type": "string", + "description": "publish-runtime" + }, + "PublishSelfContained": { + "type": "boolean", + "description": "publish-self-contained" + }, + "Root": { + "type": "string", + "description": "Root directory during build execution" + }, + "Skip": { + "type": "array", + "description": "List of targets to be skipped. Empty list skips all dependencies", + "items": { + "type": "string", + "enum": [ + "Clean", + "Compile", + "Pack", + "Publish", + "Restore", + "Test" + ] + } + }, + "Solution": { + "type": "string", + "description": "Path to a solution file that is automatically loaded" + }, + "Target": { + "type": "array", + "description": "List of targets to be invoked. Default is '{default_target}'", + "items": { + "type": "string", + "enum": [ + "Clean", + "Compile", + "Pack", + "Publish", + "Restore", + "Test" + ] + } + }, + "Verbosity": { + "type": "string", + "description": "Logging verbosity during build execution. Default is 'Normal'", + "enum": [ + "Minimal", + "Normal", + "Quiet", + "Verbose" + ] + }, + "VersionSuffix": { + "type": "string", + "description": "version-suffix" + } + } + } + } +} \ No newline at end of file diff --git a/.nuke/parameters.json b/.nuke/parameters.json new file mode 100644 index 0000000..73e9a7b --- /dev/null +++ b/.nuke/parameters.json @@ -0,0 +1,4 @@ +{ + "$schema": "./build.schema.json", + "Solution": "SpiroNet.sln" +} \ No newline at end of file diff --git a/SpiroNet.sln b/SpiroNet.sln index df82887..3b95771 100644 --- a/SpiroNet.sln +++ b/SpiroNet.sln @@ -22,10 +22,10 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{FE0DAB01-63F2-42B5-9F81-3B85B33E264B}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig - .nuke = .nuke build.ps1 = build.ps1 build.sh = build.sh global.json = global.json + azure-pipelines.yml = azure-pipelines.yml EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "git", "git", "{E69A5428-7807-4FA9-AAE5-8FE55AECBFE0}" diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fba3807..56c6349 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -11,8 +11,7 @@ resources: variables: BuildConfiguration: 'Release' BuildPlatform: 'Any CPU' - NetCoreSDK: '5.0.400' - PublishFramework: 'net5.0' + PublishFramework: 'net6.0' PublishProject: 'SpiroNet.Avalonia' PublishRuntime: '' diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..b08cc59 --- /dev/null +++ b/build.cmd @@ -0,0 +1,7 @@ +:; set -eo pipefail +:; SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) +:; ${SCRIPT_DIR}/build.sh "$@" +:; exit $? + +@ECHO OFF +powershell -ExecutionPolicy ByPass -NoProfile -File "%~dp0build.ps1" %* diff --git a/build.ps1 b/build.ps1 index d07775c..21da68e 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,13 +1,12 @@ [CmdletBinding()] Param( - #[switch]$CustomParam, [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] [string[]]$BuildArguments ) -Write-Output "Windows PowerShell $($Host.Version)" +Write-Output "PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)" -Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { exit 1 } +Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { Write-Error $_ -ErrorAction Continue; exit 1 } $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent ########################################################################### @@ -15,15 +14,15 @@ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent ########################################################################### $BuildProjectFile = "$PSScriptRoot\build\build\_build.csproj" -$TempDirectory = "$PSScriptRoot\\.tmp" +$TempDirectory = "$PSScriptRoot\\.nuke\temp" $DotNetGlobalFile = "$PSScriptRoot\\global.json" -$DotNetInstallUrl = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1" +$DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1" $DotNetChannel = "Current" $env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1 $env:DOTNET_CLI_TELEMETRY_OPTOUT = 1 -$env:NUGET_XMLDOC_MODE = "skip" +$env:DOTNET_MULTILEVEL_LOOKUP = 0 ########################################################################### # EXECUTION @@ -34,36 +33,37 @@ function ExecSafe([scriptblock] $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)) { +# If dotnet CLI is installed globally and it matches requested version, use for execution +if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and ` + $(dotnet --version) -and $LASTEXITCODE -eq 0) { $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-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 (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 } + # 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 + } } + + # Install by channel or version + $DotNetDirectory = "$TempDirectory\dotnet-win" + if (!(Test-Path variable:DotNetVersion)) { + ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath } + } else { + ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath } + } + $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe" } Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)" -ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile -- $BuildArguments } +ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet } +ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments } diff --git a/build.sh b/build.sh index f40cfb1..c2e4343 100644 --- a/build.sh +++ b/build.sh @@ -1,16 +1,6 @@ #!/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 +bash --version 2>&1 | head -n 1 set -eo pipefail SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) @@ -20,53 +10,53 @@ SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) ########################################################################### BUILD_PROJECT_FILE="$SCRIPT_DIR/build/build/_build.csproj" -TEMP_DIRECTORY="$SCRIPT_DIR//.tmp" +TEMP_DIRECTORY="$SCRIPT_DIR//.nuke/temp" DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json" -DOTNET_INSTALL_URL="https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.sh" +DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh" DOTNET_CHANNEL="Current" export DOTNET_CLI_TELEMETRY_OPTOUT=1 export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 -export NUGET_XMLDOC_MODE="skip" +export DOTNET_MULTILEVEL_LOOKUP=0 ########################################################################### # EXECUTION ########################################################################### function FirstJsonValue { - perl -nle 'print $1 if m{"'$1'": "([^"\-]+)",?}' <<< ${@:2} + 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 +# If dotnet CLI is installed globally and it matches requested version, use for execution +if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; 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" - + + # 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 + # Install by channel or version - if [ -z ${DOTNET_VERSION+x} ]; then + DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix" + 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 + export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet" fi echo "Microsoft (R) .NET Core SDK version $("$DOTNET_EXE" --version)" -"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" -- ${BUILD_ARGUMENTS[@]} +"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet +"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@" diff --git a/build/build/Build.cs b/build/build/Build.cs index 725e94e..b89d875 100644 --- a/build/build/Build.cs +++ b/build/build/Build.cs @@ -1,11 +1,9 @@ -using System; using System.Collections.Generic; -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 Nuke.Common.IO; using static Nuke.Common.IO.FileSystemTasks; using static Nuke.Common.IO.PathConstruction; using static Nuke.Common.Tools.DotNet.DotNetTasks; @@ -35,6 +33,9 @@ class Build : NukeBuild [Parameter("publish-project")] public string PublishProject { get; set; } + [Parameter("publish-self-contained")] + public bool PublishSelfContained { get; set; } = true; + AbsolutePath SourceDirectory => RootDirectory / "src"; AbsolutePath TestsDirectory => RootDirectory / "tests"; @@ -89,7 +90,7 @@ class Build : NukeBuild DotNetTest(s => s .SetProjectFile(Solution) .SetConfiguration(Configuration) - .SetLogger("trx") + .SetLoggers("trx") .SetResultsDirectory(ArtifactsDirectory / "TestResults") .EnableNoBuild() .EnableNoRestore()); @@ -121,6 +122,7 @@ class Build : NukeBuild .SetVersionSuffix(VersionSuffix) .SetFramework(PublishFramework) .SetRuntime(PublishRuntime) + .SetSelfContained(PublishSelfContained) .SetOutput(ArtifactsDirectory / "Publish" / PublishProject + "-" + PublishFramework + "-" + PublishRuntime)); }); } diff --git a/build/build/_build.csproj b/build/build/_build.csproj index 6c25453..d144715 100644 --- a/build/build/_build.csproj +++ b/build/build/_build.csproj @@ -2,15 +2,15 @@ Exe - net5.0 + net6.0 false - False CS0649;CS0169 + 1 - + diff --git a/global.json b/global.json index cef6095..055ac3d 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "5.0.400", + "version": "6.0.100", "rollForward": "latestMinor", "allowPrerelease": true } diff --git a/samples/SpiroNet.Avalonia/SpiroNet.Avalonia.csproj b/samples/SpiroNet.Avalonia/SpiroNet.Avalonia.csproj index d79643d..20a5721 100644 --- a/samples/SpiroNet.Avalonia/SpiroNet.Avalonia.csproj +++ b/samples/SpiroNet.Avalonia/SpiroNet.Avalonia.csproj @@ -1,7 +1,7 @@  - net5.0;net461 + net6.0 WinExe False False diff --git a/src/SpiroNet.Editor.Avalonia/SpiroNet.Editor.Avalonia.csproj b/src/SpiroNet.Editor.Avalonia/SpiroNet.Editor.Avalonia.csproj index 70ea266..bb420b1 100644 --- a/src/SpiroNet.Editor.Avalonia/SpiroNet.Editor.Avalonia.csproj +++ b/src/SpiroNet.Editor.Avalonia/SpiroNet.Editor.Avalonia.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netstandard2.1;net5.0;net461 + netstandard2.0;netstandard2.1;net461;net5.0;net6.0 Library False False diff --git a/src/SpiroNet.Editor/SpiroNet.Editor.csproj b/src/SpiroNet.Editor/SpiroNet.Editor.csproj index c3bfc25..4fa4c07 100644 --- a/src/SpiroNet.Editor/SpiroNet.Editor.csproj +++ b/src/SpiroNet.Editor/SpiroNet.Editor.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netstandard2.1;net5.0;net461 + netstandard2.0;netstandard2.1;net461;net5.0;net6.0 Library False False diff --git a/src/SpiroNet.Json/SpiroNet.Json.csproj b/src/SpiroNet.Json/SpiroNet.Json.csproj index fff0450..8cb9fd7 100644 --- a/src/SpiroNet.Json/SpiroNet.Json.csproj +++ b/src/SpiroNet.Json/SpiroNet.Json.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netstandard2.1;net5.0;net461 + netstandard2.0;netstandard2.1;net461;net5.0;net6.0 Library False False diff --git a/src/SpiroNet.ViewModels/SpiroNet.ViewModels.csproj b/src/SpiroNet.ViewModels/SpiroNet.ViewModels.csproj index 3234ecc..f00c6a4 100644 --- a/src/SpiroNet.ViewModels/SpiroNet.ViewModels.csproj +++ b/src/SpiroNet.ViewModels/SpiroNet.ViewModels.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netstandard2.1;net5.0;net461 + netstandard2.0;netstandard2.1;net461;net5.0;net6.0 Library False False diff --git a/src/SpiroNet/SpiroNet.csproj b/src/SpiroNet/SpiroNet.csproj index e1ad811..e0c20c7 100644 --- a/src/SpiroNet/SpiroNet.csproj +++ b/src/SpiroNet/SpiroNet.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netstandard2.1;net5.0;net461 + netstandard2.0;netstandard2.1;net461;net5.0;net6.0 Library False False diff --git a/tests/SpiroNet.UnitTests/SpiroNet.UnitTests.csproj b/tests/SpiroNet.UnitTests/SpiroNet.UnitTests.csproj index 0e7b052..6463a7b 100644 --- a/tests/SpiroNet.UnitTests/SpiroNet.UnitTests.csproj +++ b/tests/SpiroNet.UnitTests/SpiroNet.UnitTests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Library False enable