From ae42e3256a671883d694f2a13e633d57499d1c15 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Wed, 29 Jul 2020 12:47:06 +0200 Subject: [PATCH] upgrade to .NET 5 --- build/build-bootstrap.ps1 | 94 +++ build/build-tmp.ps1 | 546 ++++++++++++++++++ build/build.ps1 | 546 ++++++++++++++++++ .../Extensions/DocumentStoreExtensions.cs | 2 +- zero.Core/zero.Core.csproj | 8 +- zero.Debug/wwwroot/Assets/zero-dark.png | Bin 0 -> 4113 bytes zero.Debug/zero.Debug.csproj | 2 +- zero.Web.UI/App/navigation.vue | 4 +- zero.Web/zero.Web.csproj | 2 +- zero.sln | 7 + 10 files changed, 1202 insertions(+), 9 deletions(-) create mode 100644 build/build-bootstrap.ps1 create mode 100644 build/build-tmp.ps1 create mode 100644 build/build.ps1 create mode 100644 zero.Debug/wwwroot/Assets/zero-dark.png diff --git a/build/build-bootstrap.ps1 b/build/build-bootstrap.ps1 new file mode 100644 index 00000000..82c789ff --- /dev/null +++ b/build/build-bootstrap.ps1 @@ -0,0 +1,94 @@ + + # this script should be dot-sourced into the build.ps1 scripts + # right after the parameters declaration + # ie + # . "$PSScriptRoot\build-bootstrap.ps1" + + # THIS FILE IS DISTRIBUTED AS PART OF UMBRACO.BUILD + # DO NOT MODIFY IT - ALWAYS USED THE COMMON VERSION + + # ################################################################ + # BOOTSTRAP + # ################################################################ + + # reset errors + $error.Clear() + + # ensure we have temp folder for downloads + $scriptRoot = "$PSScriptRoot" + $scriptTemp = "$scriptRoot\temp" + if (-not (test-path $scriptTemp)) { mkdir $scriptTemp > $null } + + # get NuGet + $cache = 4 + $nuget = "$scriptTemp\nuget.exe" + # ensure the correct NuGet-source is used. This one is used by Umbraco + $nugetsourceUmbraco = "https://www.myget.org/F/umbracocore/api/v3/index.json" + if (-not $local) + { + $source = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" + if ((test-path $nuget) -and ((ls $nuget).CreationTime -lt [DateTime]::Now.AddDays(-$cache))) + { + Remove-Item $nuget -force -errorAction SilentlyContinue > $null + } + if (-not (test-path $nuget)) + { + Write-Host "Download NuGet..." + Invoke-WebRequest $source -OutFile $nuget + if (-not $?) { throw "Failed to download NuGet." } + } + } + elseif (-not (test-path $nuget)) + { + throw "Failed to locate NuGet.exe." + } + + # NuGet notes + # As soon as we use -ConfigFile, NuGet uses that file, and only that file, and does not + # merge configuration from system level. See comments in NuGet.Client solution, class + # NuGet.Configuration.Settings, method LoadDefaultSettings. + # For NuGet to merge configurations, it needs to "find" the file in the current directory, + # or above. Which means we cannot really use -ConfigFile but instead have to have Umbraco's + # NuGet.config file at root, and always run NuGet.exe while at root or in a directory below + # root. + + $solutionRoot = "$scriptRoot\.." + $testPwd = [System.IO.Path]::GetFullPath($pwd.Path) + "\" + $testRoot = [System.IO.Path]::GetFullPath($solutionRoot) + "\" + if (-not $testPwd.ToLower().StartsWith($testRoot.ToLower())) + { + throw "Cannot run outside of the solution's root." + } + + # get the build system + if (-not $local) + { + $params = "-OutputDirectory", $scriptTemp, "-Verbosity", "quiet", "-PreRelease", "-Source", $nugetsourceUmbraco + &$nuget install Umbraco.Build @params + if (-not $?) { throw "Failed to download Umbraco.Build." } + } + + # ensure we have the build system + $ubuildPath = ls "$scriptTemp\Umbraco.Build.*" | sort -property CreationTime -descending | select -first 1 + if (-not $ubuildPath) + { + throw "Failed to locate the build system." + } + + # boot the build system + # this creates $global:ubuild + return &"$ubuildPath\ps\Boot.ps1" + + # at that point the build.ps1 script must boot the build system + # eg + # $ubuild.Boot($ubuildPath.FullName, [System.IO.Path]::GetFullPath("$scriptRoot\.."), + # @{ Local = $local; With7Zip = $false; WithNode = $false }, + # @{ continue = $continue }) + # if (-not $?) { throw "Failed to boot the build system." } + # + # and it's good practice to report + # eg + # Write-Host "Umbraco.Whatever Build" + # Write-Host "Umbraco.Build v$($ubuild.BuildVersion)" + + # eof diff --git a/build/build-tmp.ps1 b/build/build-tmp.ps1 new file mode 100644 index 00000000..3ba347a6 --- /dev/null +++ b/build/build-tmp.ps1 @@ -0,0 +1,546 @@ + + param ( + # get, don't execute + [Parameter(Mandatory=$false)] + [Alias("g")] + [switch] $get = $false, + + # run local, don't download, assume everything is ready + [Parameter(Mandatory=$false)] + [Alias("l")] + [Alias("loc")] + [switch] $local = $false, + + # enable docfx + [Parameter(Mandatory=$false)] + [Alias("doc")] + [switch] $docfx = $false, + + # keep the build directories, don't clear them + [Parameter(Mandatory=$false)] + [Alias("c")] + [Alias("cont")] + [switch] $continue = $false, + + # execute a command + [Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)] + [String[]] + $command + ) + + # ################################################################ + # BOOTSTRAP + # ################################################################ + + # create and boot the buildsystem + $ubuild = &"$PSScriptRoot\build-bootstrap.ps1" + if (-not $?) { return } + $ubuild.Boot($PSScriptRoot, + @{ Local = $local; WithDocFx = $docfx }, + @{ Continue = $continue }) + if ($ubuild.OnError()) { return } + + Write-Host "Umbraco Cms Build" + Write-Host "Umbraco.Build v$($ubuild.BuildVersion)" + + # ################################################################ + # TASKS + # ################################################################ + + $ubuild.DefineMethod("SetMoreUmbracoVersion", + { + param ( $semver ) + + $release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch + + Write-Host "Update IIS Express port in csproj" + $updater = New-Object "Umbraco.Build.ExpressPortUpdater" + $csproj = "$($this.SolutionRoot)\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" + $updater.Update($csproj, $release) + }) + + $ubuild.DefineMethod("SandboxNode", + { + $global:node_path = $env:path + $nodePath = $this.BuildEnv.NodePath + $gitExe = (Get-Command git).Source + if (-not $gitExe) { $gitExe = (Get-Command git).Path } + $gitPath = [System.IO.Path]::GetDirectoryName($gitExe) + $env:path = "$nodePath;$gitPath" + + $global:node_nodepath = $this.ClearEnvVar("NODEPATH") + $global:node_npmcache = $this.ClearEnvVar("NPM_CONFIG_CACHE") + $global:node_npmprefix = $this.ClearEnvVar("NPM_CONFIG_PREFIX") + + # https://github.com/gruntjs/grunt-contrib-connect/issues/235 + $this.SetEnvVar("NODE_NO_HTTP2", "1") + }) + + $ubuild.DefineMethod("RestoreNode", + { + $env:path = $node_path + + $this.SetEnvVar("NODEPATH", $node_nodepath) + $this.SetEnvVar("NPM_CONFIG_CACHE", $node_npmcache) + $this.SetEnvVar("NPM_CONFIG_PREFIX", $node_npmprefix) + + $ignore = $this.ClearEnvVar("NODE_NO_HTTP2") + }) + + $ubuild.DefineMethod("CompileBelle", + { + $src = "$($this.SolutionRoot)\src" + $log = "$($this.BuildTemp)\belle.log" + + Write-Host "Compile Belle" + Write-Host "Logging to $log" + + # get a temp clean node env (will restore) + $this.SandboxNode() + + # stupid PS is going to gather all "warnings" in $error + # so we have to take care of it else they'll bubble and kill the build + if ($error.Count -gt 0) { return } + + try { + Push-Location "$($this.SolutionRoot)\src\Umbraco.Web.UI.Client" + Write-Output "" > $log + + Write-Output "### node version is:" > $log + node -v >> $log 2>&1 + if (-not $?) { throw "Failed to report node version." } + + Write-Output "### npm version is:" >> $log 2>&1 + npm -v >> $log 2>&1 + if (-not $?) { throw "Failed to report npm version." } + + Write-Output "### clean npm cache" >> $log 2>&1 + npm cache clean --force >> $log 2>&1 + $error.Clear() # that one can fail 'cos security bug - ignore + + Write-Output "### npm install" >> $log 2>&1 + npm install >> $log 2>&1 + Write-Output ">> $? $($error.Count)" >> $log 2>&1 + # Don't really care about the messages from npm install making us think there are errors + $error.Clear() + + Write-Output "### gulp build for version $($this.Version.Release)" >> $log 2>&1 + npx gulp build --buildversion=$this.Version.Release >> $log 2>&1 + if (-not $?) { throw "Failed to build" } # that one is expected to work + } finally { + Pop-Location + + # FIXME: should we filter the log to find errors? + #get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}} + + # restore + $this.RestoreNode() + } + + # setting node_modules folder to hidden + # used to prevent VS13 from crashing on it while loading the websites project + # also makes sure aspnet compiler does not try to handle rogue files and chokes + # in VSO with Microsoft.VisualC.CppCodeProvider -related errors + # use get-item -force 'cos it might be hidden already + Write-Host "Set hidden attribute on node_modules" + $dir = Get-Item -force "$src\Umbraco.Web.UI.Client\node_modules" + $dir.Attributes = $dir.Attributes -bor ([System.IO.FileAttributes]::Hidden) + }) + + $ubuild.DefineMethod("CompileUmbraco", + { + $buildConfiguration = "Release" + + $src = "$($this.SolutionRoot)\src" + $log = "$($this.BuildTemp)\msbuild.umbraco.log" + + if ($this.BuildEnv.VisualStudio -eq $null) + { + throw "Build environment does not provide VisualStudio." + } + + Write-Host "Compile Umbraco" + Write-Host "Logging to $log" + + # beware of the weird double \\ at the end of paths + # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/ + &$this.BuildEnv.VisualStudio.MsBuild "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" ` + /p:WarningLevel=0 ` + /p:Configuration=$buildConfiguration ` + /p:Platform=AnyCPU ` + /p:UseWPP_CopyWebApplication=True ` + /p:PipelineDependsOnBuild=False ` + /p:OutDir="$($this.BuildTemp)\bin\\" ` + /p:WebProjectOutputDir="$($this.BuildTemp)\WebApp\\" ` + /p:Verbosity=minimal ` + /t:Clean`;Rebuild ` + /tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" ` + /p:UmbracoBuild=True ` + > $log + + if (-not $?) { throw "Failed to compile Umbraco.Web.UI." } + + # /p:UmbracoBuild tells the csproj that we are building from PS, not VS + }) + + $ubuild.DefineMethod("PrepareTests", + { + Write-Host "Prepare Tests" + + # FIXME: - idea is to avoid rebuilding everything for tests + # but because of our weird assembly versioning (with .* stuff) + # everything gets rebuilt all the time... + #Copy-Files "$tmp\bin" "." "$tmp\tests" + + # data + Write-Host "Copy data files" + if (-not (Test-Path -Path "$($this.BuildTemp)\tests\Packaging" )) + { + Write-Host "Create packaging directory" + mkdir "$($this.BuildTemp)\tests\Packaging" > $null + } + $this.CopyFiles("$($this.SolutionRoot)\src\Umbraco.Tests\Packaging\Packages", "*", "$($this.BuildTemp)\tests\Packaging\Packages") + + # required for package install tests + if (-not (Test-Path -Path "$($this.BuildTemp)\tests\bin" )) + { + Write-Host "Create bin directory" + mkdir "$($this.BuildTemp)\tests\bin" > $null + } + }) + + $ubuild.DefineMethod("CompileTests", + { + $buildConfiguration = "Release" + $log = "$($this.BuildTemp)\msbuild.tests.log" + + if ($this.BuildEnv.VisualStudio -eq $null) + { + throw "Build environment does not provide VisualStudio." + } + + Write-Host "Compile Tests" + Write-Host "Logging to $log" + + # beware of the weird double \\ at the end of paths + # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/ + &$this.BuildEnv.VisualStudio.MsBuild "$($this.SolutionRoot)\src\Umbraco.Tests\Umbraco.Tests.csproj" ` + /p:WarningLevel=0 ` + /p:Configuration=$buildConfiguration ` + /p:Platform=AnyCPU ` + /p:UseWPP_CopyWebApplication=True ` + /p:PipelineDependsOnBuild=False ` + /p:OutDir="$($this.BuildTemp)\tests\\" ` + /p:Verbosity=minimal ` + /t:Build ` + /tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" ` + /p:UmbracoBuild=True ` + > $log + + if (-not $?) { throw "Failed to compile tests." } + + # /p:UmbracoBuild tells the csproj that we are building from PS + }) + + $ubuild.DefineMethod("PreparePackages", + { + Write-Host "Prepare Packages" + + $src = "$($this.SolutionRoot)\src" + $tmp = "$($this.BuildTemp)" + $out = "$($this.BuildOutput)" + + $buildConfiguration = "Release" + + # restore web.config + $this.TempRestoreFile("$src\Umbraco.Web.UI\web.config") + + # cleanup build + Write-Host "Clean build" + $this.RemoveFile("$tmp\bin\*.dll.config") + $this.RemoveFile("$tmp\WebApp\bin\*.dll.config") + + # cleanup presentation + Write-Host "Cleanup presentation" + $this.RemoveDirectory("$tmp\WebApp\umbraco.presentation") + + # create directories + Write-Host "Create directories" + mkdir "$tmp\Configs" > $null + mkdir "$tmp\Configs\Lang" > $null + mkdir "$tmp\WebApp\App_Data" > $null + #mkdir "$tmp\WebApp\Media" > $null + #mkdir "$tmp\WebApp\Views" > $null + + # copy various files + Write-Host "Copy xml documentation" + Copy-Item -force "$tmp\bin\*.xml" "$tmp\WebApp\bin" + + Write-Host "Copy transformed configs and langs" + # note: exclude imageprocessor/*.config as imageprocessor pkg installs them + $this.CopyFiles("$tmp\WebApp\config", "*.config", "$tmp\Configs", ` + { -not $_.RelativeName.StartsWith("imageprocessor") }) + $this.CopyFiles("$tmp\WebApp\config", "*.js", "$tmp\Configs") + $this.CopyFiles("$tmp\WebApp\config\lang", "*.xml", "$tmp\Configs\Lang") + $this.CopyFile("$tmp\WebApp\web.config", "$tmp\Configs\web.config.transform") + + Write-Host "Copy transformed web.config" + $this.CopyFile("$src\Umbraco.Web.UI\web.$buildConfiguration.Config.transformed", "$tmp\WebApp\web.config") + + # offset the modified timestamps on all umbraco dlls, as WebResources + # break if date is in the future, which, due to timezone offsets can happen. + Write-Host "Offset dlls timestamps" + Get-ChildItem -r "$tmp\*.dll" | ForEach-Object { + $_.CreationTime = $_.CreationTime.AddHours(-11) + $_.LastWriteTime = $_.LastWriteTime.AddHours(-11) + } + + # copy libs + Write-Host "Copy SqlCE libraries" + $nugetPackages = $env:NUGET_PACKAGES + if (-not $nugetPackages) + { + $nugetPackages = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\.nuget\packages") + } + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\bin\x86") + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\bin\amd64") + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\WebApp\bin\x86") + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\WebApp\bin\amd64") + + # copy Belle + Write-Host "Copy Belle" + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\assets", "*", "$tmp\WebApp\umbraco\assets") + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\js", "*", "$tmp\WebApp\umbraco\js") + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\lib", "*", "$tmp\WebApp\umbraco\lib") + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\views", "*", "$tmp\WebApp\umbraco\views") + }) + + $ubuild.DefineMethod("PackageZip", + { + Write-Host "Create Zip packages" + + $src = "$($this.SolutionRoot)\src" + $tmp = $this.BuildTemp + $out = $this.BuildOutput + + Write-Host "Zip all binaries" + &$this.BuildEnv.Zip a -r "$out\UmbracoCms.AllBinaries.$($this.Version.Semver).zip" ` + "$tmp\bin\*" ` + "-x!dotless.Core.*" ` + > $null + if (-not $?) { throw "Failed to zip UmbracoCms.AllBinaries." } + + Write-Host "Zip cms" + &$this.BuildEnv.Zip a -r "$out\UmbracoCms.$($this.Version.Semver).zip" ` + "$tmp\WebApp\*" ` + "-x!dotless.Core.*" "-x!Content_Types.xml" "-x!*.pdb" ` + > $null + if (-not $?) { throw "Failed to zip UmbracoCms." } + }) + + $ubuild.DefineMethod("PrepareBuild", + { + $this.TempStoreFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config") + Write-Host "Create clean web.config" + $this.CopyFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.Template.config", "$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config") + + Write-host "Set environment" + $env:UMBRACO_VERSION=$this.Version.Semver.ToString() + $env:UMBRACO_RELEASE=$this.Version.Release + $env:UMBRACO_COMMENT=$this.Version.Comment + $env:UMBRACO_BUILD=$this.Version.Build + + if ($args -and $args[0] -eq "vso") + { + Write-host "Set VSO environment" + # set environment variable for VSO + # https://github.com/Microsoft/vsts-tasks/issues/375 + # https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md + Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($this.Version.Semver.ToString())") + Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($this.Version.Release)") + Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($this.Version.Comment)") + Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($this.Version.Build)") + + Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($this.SolutionRoot)\build.tmp") + } + }) + + $ubuild.DefineMethod("PrepareNuGet", + { + Write-Host "Prepare NuGet" + + # add Web.config transform files to the NuGet package + Write-Host "Add web.config transforms to NuGet package" + mv "$($this.BuildTemp)\WebApp\Views\Web.config" "$($this.BuildTemp)\WebApp\Views\Web.config.transform" + + }) + + $nugetsourceUmbraco = "https://api.nuget.org/v3/index.json" + + $ubuild.DefineMethod("RestoreNuGet", + { + Write-Host "Restore NuGet" + Write-Host "Logging to $($this.BuildTemp)\nuget.restore.log" + $params = "-Source", $nugetsourceUmbraco + &$this.BuildEnv.NuGet restore "$($this.SolutionRoot)\src\Umbraco.sln" > "$($this.BuildTemp)\nuget.restore.log" @params + if (-not $?) { throw "Failed to restore NuGet packages." } + }) + + $ubuild.DefineMethod("PackageNuGet", + { + $nuspecs = "$($this.SolutionRoot)\build\NuSpecs" + + Write-Host "Create NuGet packages" + + &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Core.nuspec" ` + -Properties BuildTmp="$($this.BuildTemp)" ` + -Version "$($this.Version.Semver.ToString())" ` + -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmscore.log" + if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Core." } + + &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Web.nuspec" ` + -Properties BuildTmp="$($this.BuildTemp)" ` + -Version "$($this.Version.Semver.ToString())" ` + -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmsweb.log" + if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Web." } + + &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.nuspec" ` + -Properties BuildTmp="$($this.BuildTemp)" ` + -Version "$($this.Version.Semver.ToString())" ` + -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cms.log" + if (-not $?) { throw "Failed to pack NuGet UmbracoCms." } + + # run hook + if ($this.HasMethod("PostPackageNuGet")) + { + Write-Host "Run PostPackageNuGet hook" + $this.PostPackageNuGet(); + if (-not $?) { throw "Failed to run hook." } + } + }) + + $ubuild.DefineMethod("VerifyNuGet", + { + $this.VerifyNuGetConsistency( + ("UmbracoCms", "UmbracoCms.Core", "UmbracoCms.Web"), + ("Umbraco.Core", "Umbraco.Web", "Umbraco.Web.UI", "Umbraco.Examine")) + if ($this.OnError()) { return } + }) + + $ubuild.DefineMethod("PrepareAzureGallery", + { + Write-Host "Prepare Azure Gallery" + $this.CopyFile("$($this.SolutionRoot)\build\Azure\azuregalleryrelease.ps1", $this.BuildOutput) + }) + + $ubuild.DefineMethod("PrepareCSharpDocs", + { + Write-Host "Prepare C# Documentation" + + $src = "$($this.SolutionRoot)\src" + $tmp = $this.BuildTemp + $out = $this.BuildOutput + $DocFxJson = Join-Path -Path $src "\ApiDocs\docfx.json" + $DocFxSiteOutput = Join-Path -Path $tmp "\_site\*.*" + + + #restore nuget packages + $this.RestoreNuGet() + # run DocFx + $DocFx = $this.BuildEnv.DocFx + + & $DocFx metadata $DocFxJson + & $DocFx build $DocFxJson + + # zip it + & $this.BuildEnv.Zip a -tzip -r "$out\csharp-docs.zip" $DocFxSiteOutput + }) + + $ubuild.DefineMethod("PrepareAngularDocs", + { + Write-Host "Prepare Angular Documentation" + + $src = "$($this.SolutionRoot)\src" + $out = $this.BuildOutput + + "Moving to Umbraco.Web.UI.Docs folder" + cd ..\src\Umbraco.Web.UI.Docs + + "Generating the docs and waiting before executing the next commands" + & npm install + & npx gulp docs + + # change baseUrl + $BaseUrl = "https://our.umbraco.com/apidocs/v8/ui/" + $IndexPath = "./api/index.html" + (Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath + + # zip it + & $this.BuildEnv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Docs\api\*.*" + }) + + $ubuild.DefineMethod("Build", + { + $error.Clear() + + $this.PrepareBuild() + if ($this.OnError()) { return } + $this.RestoreNuGet() + if ($this.OnError()) { return } + $this.CompileBelle() + if ($this.OnError()) { return } + $this.CompileUmbraco() + if ($this.OnError()) { return } + $this.PrepareTests() + if ($this.OnError()) { return } + $this.CompileTests() + if ($this.OnError()) { return } + # not running tests + $this.PreparePackages() + if ($this.OnError()) { return } + $this.PackageZip() + if ($this.OnError()) { return } + $this.VerifyNuGet() + if ($this.OnError()) { return } + $this.PrepareNuGet() + if ($this.OnError()) { return } + $this.PackageNuGet() + if ($this.OnError()) { return } + $this.PrepareAzureGallery() + if ($this.OnError()) { return } + $this.PostPackageHook() + if ($this.OnError()) { return } + + Write-Host "Done" + }) + + $ubuild.DefineMethod("PostPackageHook", + { + # run hook + if ($this.HasMethod("PostPackage")) + { + Write-Host "Run PostPackage hook" + $this.PostPackage(); + if (-not $?) { throw "Failed to run hook." } + } + }) + + # ################################################################ + # RUN + # ################################################################ + + # configure + $ubuild.ReleaseBranches = @( "master" ) + + # run + if (-not $get) + { +cd + if ($command.Length -eq 0) + { + $command = @( "Build" ) + } + $ubuild.RunMethod($command); + if ($ubuild.OnError()) { return } + } + if ($get) { return $ubuild } diff --git a/build/build.ps1 b/build/build.ps1 new file mode 100644 index 00000000..3ba347a6 --- /dev/null +++ b/build/build.ps1 @@ -0,0 +1,546 @@ + + param ( + # get, don't execute + [Parameter(Mandatory=$false)] + [Alias("g")] + [switch] $get = $false, + + # run local, don't download, assume everything is ready + [Parameter(Mandatory=$false)] + [Alias("l")] + [Alias("loc")] + [switch] $local = $false, + + # enable docfx + [Parameter(Mandatory=$false)] + [Alias("doc")] + [switch] $docfx = $false, + + # keep the build directories, don't clear them + [Parameter(Mandatory=$false)] + [Alias("c")] + [Alias("cont")] + [switch] $continue = $false, + + # execute a command + [Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)] + [String[]] + $command + ) + + # ################################################################ + # BOOTSTRAP + # ################################################################ + + # create and boot the buildsystem + $ubuild = &"$PSScriptRoot\build-bootstrap.ps1" + if (-not $?) { return } + $ubuild.Boot($PSScriptRoot, + @{ Local = $local; WithDocFx = $docfx }, + @{ Continue = $continue }) + if ($ubuild.OnError()) { return } + + Write-Host "Umbraco Cms Build" + Write-Host "Umbraco.Build v$($ubuild.BuildVersion)" + + # ################################################################ + # TASKS + # ################################################################ + + $ubuild.DefineMethod("SetMoreUmbracoVersion", + { + param ( $semver ) + + $release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch + + Write-Host "Update IIS Express port in csproj" + $updater = New-Object "Umbraco.Build.ExpressPortUpdater" + $csproj = "$($this.SolutionRoot)\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" + $updater.Update($csproj, $release) + }) + + $ubuild.DefineMethod("SandboxNode", + { + $global:node_path = $env:path + $nodePath = $this.BuildEnv.NodePath + $gitExe = (Get-Command git).Source + if (-not $gitExe) { $gitExe = (Get-Command git).Path } + $gitPath = [System.IO.Path]::GetDirectoryName($gitExe) + $env:path = "$nodePath;$gitPath" + + $global:node_nodepath = $this.ClearEnvVar("NODEPATH") + $global:node_npmcache = $this.ClearEnvVar("NPM_CONFIG_CACHE") + $global:node_npmprefix = $this.ClearEnvVar("NPM_CONFIG_PREFIX") + + # https://github.com/gruntjs/grunt-contrib-connect/issues/235 + $this.SetEnvVar("NODE_NO_HTTP2", "1") + }) + + $ubuild.DefineMethod("RestoreNode", + { + $env:path = $node_path + + $this.SetEnvVar("NODEPATH", $node_nodepath) + $this.SetEnvVar("NPM_CONFIG_CACHE", $node_npmcache) + $this.SetEnvVar("NPM_CONFIG_PREFIX", $node_npmprefix) + + $ignore = $this.ClearEnvVar("NODE_NO_HTTP2") + }) + + $ubuild.DefineMethod("CompileBelle", + { + $src = "$($this.SolutionRoot)\src" + $log = "$($this.BuildTemp)\belle.log" + + Write-Host "Compile Belle" + Write-Host "Logging to $log" + + # get a temp clean node env (will restore) + $this.SandboxNode() + + # stupid PS is going to gather all "warnings" in $error + # so we have to take care of it else they'll bubble and kill the build + if ($error.Count -gt 0) { return } + + try { + Push-Location "$($this.SolutionRoot)\src\Umbraco.Web.UI.Client" + Write-Output "" > $log + + Write-Output "### node version is:" > $log + node -v >> $log 2>&1 + if (-not $?) { throw "Failed to report node version." } + + Write-Output "### npm version is:" >> $log 2>&1 + npm -v >> $log 2>&1 + if (-not $?) { throw "Failed to report npm version." } + + Write-Output "### clean npm cache" >> $log 2>&1 + npm cache clean --force >> $log 2>&1 + $error.Clear() # that one can fail 'cos security bug - ignore + + Write-Output "### npm install" >> $log 2>&1 + npm install >> $log 2>&1 + Write-Output ">> $? $($error.Count)" >> $log 2>&1 + # Don't really care about the messages from npm install making us think there are errors + $error.Clear() + + Write-Output "### gulp build for version $($this.Version.Release)" >> $log 2>&1 + npx gulp build --buildversion=$this.Version.Release >> $log 2>&1 + if (-not $?) { throw "Failed to build" } # that one is expected to work + } finally { + Pop-Location + + # FIXME: should we filter the log to find errors? + #get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}} + + # restore + $this.RestoreNode() + } + + # setting node_modules folder to hidden + # used to prevent VS13 from crashing on it while loading the websites project + # also makes sure aspnet compiler does not try to handle rogue files and chokes + # in VSO with Microsoft.VisualC.CppCodeProvider -related errors + # use get-item -force 'cos it might be hidden already + Write-Host "Set hidden attribute on node_modules" + $dir = Get-Item -force "$src\Umbraco.Web.UI.Client\node_modules" + $dir.Attributes = $dir.Attributes -bor ([System.IO.FileAttributes]::Hidden) + }) + + $ubuild.DefineMethod("CompileUmbraco", + { + $buildConfiguration = "Release" + + $src = "$($this.SolutionRoot)\src" + $log = "$($this.BuildTemp)\msbuild.umbraco.log" + + if ($this.BuildEnv.VisualStudio -eq $null) + { + throw "Build environment does not provide VisualStudio." + } + + Write-Host "Compile Umbraco" + Write-Host "Logging to $log" + + # beware of the weird double \\ at the end of paths + # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/ + &$this.BuildEnv.VisualStudio.MsBuild "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" ` + /p:WarningLevel=0 ` + /p:Configuration=$buildConfiguration ` + /p:Platform=AnyCPU ` + /p:UseWPP_CopyWebApplication=True ` + /p:PipelineDependsOnBuild=False ` + /p:OutDir="$($this.BuildTemp)\bin\\" ` + /p:WebProjectOutputDir="$($this.BuildTemp)\WebApp\\" ` + /p:Verbosity=minimal ` + /t:Clean`;Rebuild ` + /tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" ` + /p:UmbracoBuild=True ` + > $log + + if (-not $?) { throw "Failed to compile Umbraco.Web.UI." } + + # /p:UmbracoBuild tells the csproj that we are building from PS, not VS + }) + + $ubuild.DefineMethod("PrepareTests", + { + Write-Host "Prepare Tests" + + # FIXME: - idea is to avoid rebuilding everything for tests + # but because of our weird assembly versioning (with .* stuff) + # everything gets rebuilt all the time... + #Copy-Files "$tmp\bin" "." "$tmp\tests" + + # data + Write-Host "Copy data files" + if (-not (Test-Path -Path "$($this.BuildTemp)\tests\Packaging" )) + { + Write-Host "Create packaging directory" + mkdir "$($this.BuildTemp)\tests\Packaging" > $null + } + $this.CopyFiles("$($this.SolutionRoot)\src\Umbraco.Tests\Packaging\Packages", "*", "$($this.BuildTemp)\tests\Packaging\Packages") + + # required for package install tests + if (-not (Test-Path -Path "$($this.BuildTemp)\tests\bin" )) + { + Write-Host "Create bin directory" + mkdir "$($this.BuildTemp)\tests\bin" > $null + } + }) + + $ubuild.DefineMethod("CompileTests", + { + $buildConfiguration = "Release" + $log = "$($this.BuildTemp)\msbuild.tests.log" + + if ($this.BuildEnv.VisualStudio -eq $null) + { + throw "Build environment does not provide VisualStudio." + } + + Write-Host "Compile Tests" + Write-Host "Logging to $log" + + # beware of the weird double \\ at the end of paths + # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/ + &$this.BuildEnv.VisualStudio.MsBuild "$($this.SolutionRoot)\src\Umbraco.Tests\Umbraco.Tests.csproj" ` + /p:WarningLevel=0 ` + /p:Configuration=$buildConfiguration ` + /p:Platform=AnyCPU ` + /p:UseWPP_CopyWebApplication=True ` + /p:PipelineDependsOnBuild=False ` + /p:OutDir="$($this.BuildTemp)\tests\\" ` + /p:Verbosity=minimal ` + /t:Build ` + /tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" ` + /p:UmbracoBuild=True ` + > $log + + if (-not $?) { throw "Failed to compile tests." } + + # /p:UmbracoBuild tells the csproj that we are building from PS + }) + + $ubuild.DefineMethod("PreparePackages", + { + Write-Host "Prepare Packages" + + $src = "$($this.SolutionRoot)\src" + $tmp = "$($this.BuildTemp)" + $out = "$($this.BuildOutput)" + + $buildConfiguration = "Release" + + # restore web.config + $this.TempRestoreFile("$src\Umbraco.Web.UI\web.config") + + # cleanup build + Write-Host "Clean build" + $this.RemoveFile("$tmp\bin\*.dll.config") + $this.RemoveFile("$tmp\WebApp\bin\*.dll.config") + + # cleanup presentation + Write-Host "Cleanup presentation" + $this.RemoveDirectory("$tmp\WebApp\umbraco.presentation") + + # create directories + Write-Host "Create directories" + mkdir "$tmp\Configs" > $null + mkdir "$tmp\Configs\Lang" > $null + mkdir "$tmp\WebApp\App_Data" > $null + #mkdir "$tmp\WebApp\Media" > $null + #mkdir "$tmp\WebApp\Views" > $null + + # copy various files + Write-Host "Copy xml documentation" + Copy-Item -force "$tmp\bin\*.xml" "$tmp\WebApp\bin" + + Write-Host "Copy transformed configs and langs" + # note: exclude imageprocessor/*.config as imageprocessor pkg installs them + $this.CopyFiles("$tmp\WebApp\config", "*.config", "$tmp\Configs", ` + { -not $_.RelativeName.StartsWith("imageprocessor") }) + $this.CopyFiles("$tmp\WebApp\config", "*.js", "$tmp\Configs") + $this.CopyFiles("$tmp\WebApp\config\lang", "*.xml", "$tmp\Configs\Lang") + $this.CopyFile("$tmp\WebApp\web.config", "$tmp\Configs\web.config.transform") + + Write-Host "Copy transformed web.config" + $this.CopyFile("$src\Umbraco.Web.UI\web.$buildConfiguration.Config.transformed", "$tmp\WebApp\web.config") + + # offset the modified timestamps on all umbraco dlls, as WebResources + # break if date is in the future, which, due to timezone offsets can happen. + Write-Host "Offset dlls timestamps" + Get-ChildItem -r "$tmp\*.dll" | ForEach-Object { + $_.CreationTime = $_.CreationTime.AddHours(-11) + $_.LastWriteTime = $_.LastWriteTime.AddHours(-11) + } + + # copy libs + Write-Host "Copy SqlCE libraries" + $nugetPackages = $env:NUGET_PACKAGES + if (-not $nugetPackages) + { + $nugetPackages = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\.nuget\packages") + } + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\bin\x86") + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\bin\amd64") + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\WebApp\bin\x86") + $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\WebApp\bin\amd64") + + # copy Belle + Write-Host "Copy Belle" + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\assets", "*", "$tmp\WebApp\umbraco\assets") + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\js", "*", "$tmp\WebApp\umbraco\js") + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\lib", "*", "$tmp\WebApp\umbraco\lib") + $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\views", "*", "$tmp\WebApp\umbraco\views") + }) + + $ubuild.DefineMethod("PackageZip", + { + Write-Host "Create Zip packages" + + $src = "$($this.SolutionRoot)\src" + $tmp = $this.BuildTemp + $out = $this.BuildOutput + + Write-Host "Zip all binaries" + &$this.BuildEnv.Zip a -r "$out\UmbracoCms.AllBinaries.$($this.Version.Semver).zip" ` + "$tmp\bin\*" ` + "-x!dotless.Core.*" ` + > $null + if (-not $?) { throw "Failed to zip UmbracoCms.AllBinaries." } + + Write-Host "Zip cms" + &$this.BuildEnv.Zip a -r "$out\UmbracoCms.$($this.Version.Semver).zip" ` + "$tmp\WebApp\*" ` + "-x!dotless.Core.*" "-x!Content_Types.xml" "-x!*.pdb" ` + > $null + if (-not $?) { throw "Failed to zip UmbracoCms." } + }) + + $ubuild.DefineMethod("PrepareBuild", + { + $this.TempStoreFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config") + Write-Host "Create clean web.config" + $this.CopyFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.Template.config", "$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config") + + Write-host "Set environment" + $env:UMBRACO_VERSION=$this.Version.Semver.ToString() + $env:UMBRACO_RELEASE=$this.Version.Release + $env:UMBRACO_COMMENT=$this.Version.Comment + $env:UMBRACO_BUILD=$this.Version.Build + + if ($args -and $args[0] -eq "vso") + { + Write-host "Set VSO environment" + # set environment variable for VSO + # https://github.com/Microsoft/vsts-tasks/issues/375 + # https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md + Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($this.Version.Semver.ToString())") + Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($this.Version.Release)") + Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($this.Version.Comment)") + Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($this.Version.Build)") + + Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($this.SolutionRoot)\build.tmp") + } + }) + + $ubuild.DefineMethod("PrepareNuGet", + { + Write-Host "Prepare NuGet" + + # add Web.config transform files to the NuGet package + Write-Host "Add web.config transforms to NuGet package" + mv "$($this.BuildTemp)\WebApp\Views\Web.config" "$($this.BuildTemp)\WebApp\Views\Web.config.transform" + + }) + + $nugetsourceUmbraco = "https://api.nuget.org/v3/index.json" + + $ubuild.DefineMethod("RestoreNuGet", + { + Write-Host "Restore NuGet" + Write-Host "Logging to $($this.BuildTemp)\nuget.restore.log" + $params = "-Source", $nugetsourceUmbraco + &$this.BuildEnv.NuGet restore "$($this.SolutionRoot)\src\Umbraco.sln" > "$($this.BuildTemp)\nuget.restore.log" @params + if (-not $?) { throw "Failed to restore NuGet packages." } + }) + + $ubuild.DefineMethod("PackageNuGet", + { + $nuspecs = "$($this.SolutionRoot)\build\NuSpecs" + + Write-Host "Create NuGet packages" + + &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Core.nuspec" ` + -Properties BuildTmp="$($this.BuildTemp)" ` + -Version "$($this.Version.Semver.ToString())" ` + -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmscore.log" + if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Core." } + + &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Web.nuspec" ` + -Properties BuildTmp="$($this.BuildTemp)" ` + -Version "$($this.Version.Semver.ToString())" ` + -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmsweb.log" + if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Web." } + + &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.nuspec" ` + -Properties BuildTmp="$($this.BuildTemp)" ` + -Version "$($this.Version.Semver.ToString())" ` + -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cms.log" + if (-not $?) { throw "Failed to pack NuGet UmbracoCms." } + + # run hook + if ($this.HasMethod("PostPackageNuGet")) + { + Write-Host "Run PostPackageNuGet hook" + $this.PostPackageNuGet(); + if (-not $?) { throw "Failed to run hook." } + } + }) + + $ubuild.DefineMethod("VerifyNuGet", + { + $this.VerifyNuGetConsistency( + ("UmbracoCms", "UmbracoCms.Core", "UmbracoCms.Web"), + ("Umbraco.Core", "Umbraco.Web", "Umbraco.Web.UI", "Umbraco.Examine")) + if ($this.OnError()) { return } + }) + + $ubuild.DefineMethod("PrepareAzureGallery", + { + Write-Host "Prepare Azure Gallery" + $this.CopyFile("$($this.SolutionRoot)\build\Azure\azuregalleryrelease.ps1", $this.BuildOutput) + }) + + $ubuild.DefineMethod("PrepareCSharpDocs", + { + Write-Host "Prepare C# Documentation" + + $src = "$($this.SolutionRoot)\src" + $tmp = $this.BuildTemp + $out = $this.BuildOutput + $DocFxJson = Join-Path -Path $src "\ApiDocs\docfx.json" + $DocFxSiteOutput = Join-Path -Path $tmp "\_site\*.*" + + + #restore nuget packages + $this.RestoreNuGet() + # run DocFx + $DocFx = $this.BuildEnv.DocFx + + & $DocFx metadata $DocFxJson + & $DocFx build $DocFxJson + + # zip it + & $this.BuildEnv.Zip a -tzip -r "$out\csharp-docs.zip" $DocFxSiteOutput + }) + + $ubuild.DefineMethod("PrepareAngularDocs", + { + Write-Host "Prepare Angular Documentation" + + $src = "$($this.SolutionRoot)\src" + $out = $this.BuildOutput + + "Moving to Umbraco.Web.UI.Docs folder" + cd ..\src\Umbraco.Web.UI.Docs + + "Generating the docs and waiting before executing the next commands" + & npm install + & npx gulp docs + + # change baseUrl + $BaseUrl = "https://our.umbraco.com/apidocs/v8/ui/" + $IndexPath = "./api/index.html" + (Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath + + # zip it + & $this.BuildEnv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Docs\api\*.*" + }) + + $ubuild.DefineMethod("Build", + { + $error.Clear() + + $this.PrepareBuild() + if ($this.OnError()) { return } + $this.RestoreNuGet() + if ($this.OnError()) { return } + $this.CompileBelle() + if ($this.OnError()) { return } + $this.CompileUmbraco() + if ($this.OnError()) { return } + $this.PrepareTests() + if ($this.OnError()) { return } + $this.CompileTests() + if ($this.OnError()) { return } + # not running tests + $this.PreparePackages() + if ($this.OnError()) { return } + $this.PackageZip() + if ($this.OnError()) { return } + $this.VerifyNuGet() + if ($this.OnError()) { return } + $this.PrepareNuGet() + if ($this.OnError()) { return } + $this.PackageNuGet() + if ($this.OnError()) { return } + $this.PrepareAzureGallery() + if ($this.OnError()) { return } + $this.PostPackageHook() + if ($this.OnError()) { return } + + Write-Host "Done" + }) + + $ubuild.DefineMethod("PostPackageHook", + { + # run hook + if ($this.HasMethod("PostPackage")) + { + Write-Host "Run PostPackage hook" + $this.PostPackage(); + if (-not $?) { throw "Failed to run hook." } + } + }) + + # ################################################################ + # RUN + # ################################################################ + + # configure + $ubuild.ReleaseBranches = @( "master" ) + + # run + if (-not $get) + { +cd + if ($command.Length -eq 0) + { + $command = @( "Build" ) + } + $ubuild.RunMethod($command); + if ($ubuild.OnError()) { return } + } + if ($get) { return $ubuild } diff --git a/zero.Core/Extensions/DocumentStoreExtensions.cs b/zero.Core/Extensions/DocumentStoreExtensions.cs index 898130fa..123576f6 100644 --- a/zero.Core/Extensions/DocumentStoreExtensions.cs +++ b/zero.Core/Extensions/DocumentStoreExtensions.cs @@ -23,7 +23,7 @@ namespace zero.Core.Extensions Type dbConventionType = typeof(IZeroDbConventions); - store.Conventions.IdentityPartsSeparator = "."; + store.Conventions.IdentityPartsSeparator = '.'; store.Conventions.FindCollectionName = type => { diff --git a/zero.Core/zero.Core.csproj b/zero.Core/zero.Core.csproj index 968e9cdb..41586f8a 100644 --- a/zero.Core/zero.Core.csproj +++ b/zero.Core/zero.Core.csproj @@ -10,12 +10,12 @@ --> - + - - - + + + \ No newline at end of file diff --git a/zero.Debug/wwwroot/Assets/zero-dark.png b/zero.Debug/wwwroot/Assets/zero-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f234ec88b34b22b2bbfbca0e7d124ea6db7419e6 GIT binary patch literal 4113 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 P00000NkvXXu0mjf37WGj literal 0 HcmV?d00001 diff --git a/zero.Debug/zero.Debug.csproj b/zero.Debug/zero.Debug.csproj index 750421ab..4f66016f 100644 --- a/zero.Debug/zero.Debug.csproj +++ b/zero.Debug/zero.Debug.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net5.0 diff --git a/zero.Web.UI/App/navigation.vue b/zero.Web.UI/App/navigation.vue index 363b24a1..d9bc2c29 100644 --- a/zero.Web.UI/App/navigation.vue +++ b/zero.Web.UI/App/navigation.vue @@ -1,8 +1,8 @@