diff --git a/build/Build.bat b/build/Build.bat
deleted file mode 100644
index f26c4877cd..0000000000
--- a/build/Build.bat
+++ /dev/null
@@ -1,217 +0,0 @@
-@ECHO OFF
-
-:: UMBRACO BUILD FILE
-
-
-:: ensure we have UmbracoVersion.txt
-IF NOT EXIST UmbracoVersion.txt (
- ECHO UmbracoVersion.txt is missing!
- GOTO error
-)
-
-REM Get the version and comment from UmbracoVersion.txt lines 2 and 3
-SET RELEASE=
-SET COMMENT=
-FOR /F "skip=1 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED RELEASE SET RELEASE=%%i
-FOR /F "skip=2 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED COMMENT SET COMMENT=%%i
-
-REM process args
-
-SET INTEGRATION=0
-SET nuGetFolder=%CD%\..\src\packages
-SET SKIPNUGET=0
-
-:processArgs
-
-:: grab the first parameter as a whole eg "/action:start"
-:: end if no more parameter
-SET SWITCHPARSE=%1
-IF [%SWITCHPARSE%] == [] goto endProcessArgs
-
-:: get switch and value
-SET SWITCH=
-SET VALUE=
-FOR /F "tokens=1,* delims=: " %%a IN ("%SWITCHPARSE%") DO SET SWITCH=%%a& SET VALUE=%%b
-
-:: route arg
-IF '%SWITCH%'=='/release' GOTO argRelease
-IF '%SWITCH%'=='-release' GOTO argRelease
-IF '%SWITCH%'=='/comment' GOTO argComment
-IF '%SWITCH%'=='-comment' GOTO argComment
-IF '%SWITCH%'=='/integration' GOTO argIntegration
-IF '%SWITCH%'=='-integration' GOTO argIntegration
-IF '%SWITCH%'=='/nugetfolder' GOTO argNugetFolder
-IF '%SWITCH%'=='-nugetfolder' GOTO argNugetFolder
-IF '%SWITCH%'=='/skipnuget' GOTO argSkipNuget
-IF '%SWITCH%'=='-skipnuget' GOTO argSkipNuget
-ECHO "Invalid switch %SWITCH%"
-GOTO error
-
-:: handle each arg
-
-:argRelease
-set RELEASE=%VALUE%
-SHIFT
-goto processArgs
-
-:argComment
-SET COMMENT=%VALUE%
-SHIFT
-GOTO processArgs
-
-:argIntegration
-SET INTEGRATION=1
-SHIFT
-GOTO processArgs
-
-:argNugetFolder
-SET nuGetFolder=%VALUE%
-SHIFT
-GOTO processArgs
-
-:argSkipNuget
-SET SKIPNUGET=1
-SHIFT
-GOTO processArgs
-
-:endProcessArgs
-
-REM run
-
-SET VERSION=%RELEASE%
-IF [%COMMENT%] EQU [] (SET VERSION=%RELEASE%) ELSE (SET VERSION=%RELEASE%-%COMMENT%)
-
-ECHO ################################################################
-ECHO Building Umbraco %VERSION%
-ECHO ################################################################
-
-SET MSBUILDPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
-SET MSBUILD="%MSBUILDPATH%\MsBuild.exe"
-SET PATH="%MSBUILDPATH%";%PATH%
-
-ReplaceIISExpressPortNumber.exe ..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj %RELEASE%
-
-ECHO.
-ECHO Removing the belle build folder and bower_components folder to make sure everything is clean as a whistle
-RD ..\src\Umbraco.Web.UI.Client\build /Q /S
-RD ..\src\Umbraco.Web.UI.Client\bower_components /Q /S
-
-ECHO.
-ECHO Removing existing built files to make sure everything is clean as a whistle
-RMDIR /Q /S _BuildOutput
-DEL /F /Q UmbracoCms.*.zip 2>NUL
-DEL /F /Q UmbracoExamine.*.zip 2>NUL
-DEL /F /Q UmbracoCms.*.nupkg 2>NUL
-DEL /F /Q webpihash.txt 2>NUL
-
-ECHO.
-ECHO Making sure Git is in the path so that the build can succeed
-CALL InstallGit.cmd
-
-REM Adding the default Git path so that if it's installed it can actually be found
-REM This is necessary because SETLOCAL is on in InstallGit.cmd so that one might find Git,
-REM but the path setting is lost due to SETLOCAL
-SET PATH="C:\Program Files (x86)\Git\cmd";"C:\Program Files\Git\cmd";%PATH%
-
-SET toolsFolder=%CD%\tools\
-IF NOT EXIST "%toolsFolder%" (
- MD tools
-)
-
-SET nuGetExecutable=%CD%\tools\nuget.exe
-IF NOT EXIST "%nuGetExecutable%" (
- ECHO Getting NuGet so we can fetch some tools
- ECHO Downloading https://dist.nuget.org/win-x86-commandline/latest/nuget.exe to %nuGetExecutable%
- powershell -Command "(New-Object Net.WebClient).DownloadFile('https://dist.nuget.org/win-x86-commandline/latest/nuget.exe', '%nuGetExecutable%')"
-)
-
-:: We need 7za.exe for BuildBelle.bat
-IF NOT EXIST "%toolsFolder%7za.exe" (
- ECHO 7zip not found - fetching now
- "%nuGetExecutable%" install 7-Zip.CommandLine -OutputDirectory tools -Verbosity quiet
-)
-
-:: We need vswhere.exe for VS2017+
-IF NOT EXIST "%toolsFolder%vswhere.exe" (
- ECHO vswhere not found - fetching now
- "%nuGetExecutable%" install vswhere -OutputDirectory tools -Verbosity quiet
-)
-
-:: Put 7za.exe and vswhere.exe in a predictable path (not version specific)
-FOR /f "delims=" %%A in ('dir "%toolsFolder%7-Zip.CommandLine.*" /b') DO SET "sevenZipExePath=%toolsFolder%%%A\"
-MOVE "%sevenZipExePath%tools\7za.exe" "%toolsFolder%7za.exe"
-
-FOR /f "delims=" %%A in ('dir "%toolsFolder%vswhere.*" /b') DO SET "vswhereExePath=%toolsFolder%%%A\"
-MOVE "%vswhereExePath%tools\vswhere.exe" "%toolsFolder%vswhere.exe"
-
-ECHO.
-ECHO Making sure we have a web.config
-IF NOT EXIST "%CD%\..\src\Umbraco.Web.UI\web.config" COPY "%CD%\..\src\Umbraco.Web.UI\web.Template.config" "%CD%\..\src\Umbraco.Web.UI\web.config"
-
-for /f "usebackq tokens=1* delims=: " %%i in (`"%CD%\tools\vswhere.exe" -latest -requires Microsoft.Component.MSBuild`) do (
- if /i "%%i"=="installationPath" set InstallDir=%%j
-)
-
-SET VSWherePath="%InstallDir%\MSBuild"
-
-ECHO.
-ECHO Visual Studio is installed in: %InstallDir%
-
-SET MSBUILDPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
-SET MSBUILD="%MSBUILDPATH%\MsBuild.exe"
-
-ECHO.
-ECHO Reporting NuGet version
-"%nuGetExecutable%" help | findstr "^NuGet Version:"
-
-ECHO.
-ECHO Restoring NuGet packages
-ECHO Into %nuGetFolder%
-"%nuGetExecutable%" restore "%CD%\..\src\umbraco.sln" -Verbosity Quiet -NonInteractive -PackagesDirectory "%nuGetFolder%"
-IF ERRORLEVEL 1 GOTO :error
-
-ECHO.
-ECHO.
-ECHO Performing MSBuild and producing Umbraco binaries zip files
-ECHO This takes a few minutes and logging is set to report warnings
-ECHO and errors only so it might seems like nothing is happening for a while.
-ECHO You can check the msbuild.log file for progress.
-ECHO.
-%MSBUILD% "Build.proj" /p:BUILD_RELEASE=%RELEASE% /p:BUILD_COMMENT=%COMMENT% /p:NugetPackagesDirectory="%nuGetFolder%" /p:VSWherePath=%VSWherePath% /consoleloggerparameters:Summary;ErrorsOnly /fileLogger
-IF ERRORLEVEL 1 GOTO error
-
-ECHO.
-ECHO Setting node_modules folder to hidden to prevent VS13 from crashing on it while loading the websites project
-attrib +h ..\src\Umbraco.Web.UI.Client\node_modules
-
-IF %SKIPNUGET% EQU 1 GOTO success
-
-ECHO.
-ECHO Adding Web.config transform files to the NuGet package
-REN .\_BuildOutput\WebApp\Views\Web.config Web.config.transform
-REN .\_BuildOutput\WebApp\Xslt\Web.config Web.config.transform
-
-ECHO.
-ECHO Packing the NuGet release files
-..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.Core.nuspec -Version %VERSION% -Symbols -Verbosity quiet
-..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.nuspec -Version %VERSION% -Verbosity quiet
-IF ERRORLEVEL 1 GOTO error
-
-:success
-ECHO.
-ECHO No errors were detected!
-ECHO There may still be some in the output, which you would need to investigate.
-ECHO Warnings are usually normal.
-ECHO.
-ECHO.
-GOTO :EOF
-
-:error
-
-ECHO.
-ECHO Errors were detected!
-ECHO.
-
-REM don't pause if continuous integration else the build server waits forever
-REM before cancelling the build (and, there is noone to read the output anyways)
-IF %INTEGRATION% NEQ 1 PAUSE
diff --git a/build/Build.proj b/build/Build.proj
deleted file mode 100644
index 1f57ca5915..0000000000
--- a/build/Build.proj
+++ /dev/null
@@ -1,345 +0,0 @@
-
-
-
-
-
- ..\MSBuildCommunityTasks
- ..\UmbracoMSBuildTasks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- b.ToString("x2"))));
- }
- }
- }
- }
- }
- ]]>
-
-
-
-
-
-
-
-
-
- .$(BUILD_NUMBER)
-
-
- .$(BUILD_RELEASE)
-
-
- .$(BUILD_RELEASE)-$(BUILD_COMMENT)
-
-
- .$(BUILD_RELEASE)-$(BUILD_NIGHTLY)
-
-
- .$(BUILD_RELEASE)-$(BUILD_COMMENT)-$(BUILD_NIGHTLY)
-
-
-
- Release
- _BuildOutput\
- UmbracoCms$(DECIMAL_BUILD_NUMBER).zip
- UmbracoCms.AllBinaries$(DECIMAL_BUILD_NUMBER).zip
- UmbracoCms.WebPI$(DECIMAL_BUILD_NUMBER).zip
- False
- ..\..\build\$(BuildFolder)
- $(MSBuildProjectDirectory)\$(BuildFolder)
- $(BuildFolder)bin\
- $(BuildFolder)WebApp\
- $(BuildFolder)WebPi\
- $(BuildFolder)Configs\
- $(BuildFolderRelativeToProjects)bin\
- $(BuildFolderAbsolutePath)bin\
- $(BuildFolderRelativeToProjects)WebApp\
- $(BuildFolderAbsolutePath)WebApp\
- $(BuildFolderRelativeToProjects)WebPi\
- $(BuildFolderAbsolutePath)WebPi\
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(BUILD_RELEASE)
- $(BUILD_RELEASE)-$(BUILD_COMMENT)
- $(BUILD_RELEASE)-$(BUILD_NIGHTLY)
- $(BUILD_RELEASE)-$(BUILD_COMMENT)-$(BUILD_NIGHTLY)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build/BuildBelle.bat b/build/BuildBelle.bat
deleted file mode 100644
index 78b7736c2b..0000000000
--- a/build/BuildBelle.bat
+++ /dev/null
@@ -1,59 +0,0 @@
-@ECHO OFF
-SETLOCAL
- :: SETLOCAL is on, so changes to the path not persist to the actual user's path
-
-SET toolsFolder=%CD%\tools\
-ECHO Current folder: %CD%
-
-SET nodeFileName=node-v6.9.1-win-x86.7z
-SET nodeExtractFolder=%toolsFolder%node.js.691
-
-IF NOT EXIST "%nodeExtractFolder%" (
- ECHO Downloading http://nodejs.org/dist/v6.9.1/%nodeFileName% to %toolsFolder%%nodeFileName%
- powershell -Command "(New-Object Net.WebClient).DownloadFile('http://nodejs.org/dist/v6.9.1/%nodeFileName%', '%toolsFolder%%nodeFileName%')"
- ECHO Extracting %nodeFileName% to %nodeExtractFolder%
- "%toolsFolder%\7za.exe" x "%toolsFolder%\%nodeFileName%" -o"%nodeExtractFolder%" -aos > nul
-)
-FOR /f "delims=" %%A in ('dir "%nodeExtractFolder%\node*" /b') DO SET "nodePath=%nodeExtractFolder%\%%A"
-
-
-SET nuGetExecutable=%CD%\tools\nuget.exe
-IF NOT EXIST "%nuGetExecutable%" (
- ECHO Downloading https://dist.nuget.org/win-x86-commandline/latest/nuget.exe to %nuGetExecutable%
- powershell -Command "(New-Object Net.WebClient).DownloadFile('https://dist.nuget.org/win-x86-commandline/latest/nuget.exe', '%nuGetExecutable%')"
-)
-
-SET drive=%CD:~0,2%
-SET nuGetFolder=%drive%\packages\
-FOR /f "delims=" %%A in ('dir "%nuGetFolder%npm.*" /b') DO SET "npmPath=%nuGetFolder%%%A\"
-
-IF [%npmPath%] == [] GOTO :installnpm
-IF NOT [%npmPath%] == [] GOTO :build
-
-:installnpm
- ECHO Downloading npm
- ECHO Configured packages folder: %nuGetFolder%
- ECHO Installing Npm NuGet Package
- "%nuGetExecutable%" install Npm -OutputDirectory %nuGetFolder% -Verbosity detailed
- REM Ensures that we look for the just downloaded NPM, not whatever the user has installed on their machine
- FOR /f "delims=" %%A in ('dir %nuGetFolder%npm.* /b') DO SET "npmPath=%nuGetFolder%%%A\"
- GOTO :build
-
-:build
- ECHO Adding Npm and Node to path
- REM SETLOCAL is on, so changes to the path not persist to the actual user's path
- PATH="%npmPath%";"%nodePath%";%PATH%
- SET buildFolder=%CD%
-
- ECHO Change directory to %CD%\..\src\Umbraco.Web.UI.Client\
- CD %CD%\..\src\Umbraco.Web.UI.Client\
-
- ECHO Do npm install and the grunt build of Belle
- call npm cache clean --quiet
- call npm install --quiet
- call npm install -g grunt-cli --quiet
- call npm install -g bower --quiet
- call grunt build --buildversion=%release%
-
- ECHO Move back to the build folder
- CD "%buildFolder%"
\ No newline at end of file
diff --git a/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1 b/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1
new file mode 100644
index 0000000000..c58517bdd0
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1
@@ -0,0 +1,171 @@
+#
+# Get-UmbracoBuildEnv
+# Gets the Umbraco build environment
+# Downloads tools if necessary
+#
+function Get-UmbracoBuildEnv
+{
+ # store tools in the module's directory
+ # and cache them for two days
+ $path = "$PSScriptRoot\temp"
+ $cache = 2
+
+ if (-not (test-path $path))
+ {
+ mkdir $path > $null
+ }
+
+ # ensure we have NuGet
+ $nuget = "$path\nuget.exe"
+ $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-File $nuget
+ }
+ if (-not (test-path $nuget))
+ {
+ Write-Host "Download NuGet..."
+ $client = new-object Net.WebClient
+ $client.DownloadFile($source, $nuget)
+ }
+
+ # ensure we have 7-Zip
+ $sevenZip = "$path\7za.exe"
+ if ((test-path $sevenZip) -and ((ls $sevenZip).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
+ {
+ Remove-File $sevenZip
+ }
+ if (-not (test-path $sevenZip))
+ {
+ Write-Host "Download 7-Zip..."
+ &$nuget install 7-Zip.CommandLine -OutputDirectory $path -Verbosity quiet
+ $dir = ls "$path\7-Zip.CommandLine.*" | sort -property Name -descending | select -first 1
+ $file = ls -path "$dir" -name 7za.exe -recurse
+ mv "$dir\$file" $sevenZip
+ Remove-Directory $dir
+ }
+
+ # ensure we have vswhere
+ $vswhere = "$path\vswhere.exe"
+ if ((test-path $vswhere) -and ((ls $vswhere).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
+ {
+ Remove-File $vswhere
+ }
+ if (-not (test-path $vswhere))
+ {
+ Write-Host "Download VsWhere..."
+ &$nuget install vswhere -OutputDirectory $path -Verbosity quiet
+ $dir = ls "$path\vswhere.*" | sort -property Name -descending | select -first 1
+ $file = ls -path "$dir" -name vswhere.exe -recurse
+ mv "$dir\$file" $vswhere
+ Remove-Directory $dir
+ }
+
+ # ensure we have semver
+ $semver = "$path\Semver.dll"
+ if ((test-path $semver) -and ((ls $semver).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
+ {
+ Remove-File $semver
+ }
+ if (-not (test-path $semver))
+ {
+ Write-Host "Download Semver..."
+ &$nuget install semver -OutputDirectory $path -Verbosity quiet
+ $dir = ls "$path\semver.*" | sort -property Name -descending | select -first 1
+ $file = "$dir\lib\net452\Semver.dll"
+ if (-not (test-path $file))
+ {
+ Write-Error "Failed to file $file"
+ return
+ }
+ mv "$file" $semver
+ Remove-Directory $dir
+ }
+
+ # ensure we have node
+ $node = "$path\node-v6.9.1-win-x86"
+ $source = "http://nodejs.org/dist/v6.9.1/node-v6.9.1-win-x86.7z"
+ if (-not (test-path $node))
+ {
+ Write-Host "Download Node..."
+ $client = new-object Net.WebClient
+ $client.DownloadFile($source, "$path\node-v6.9.1-win-x86.7z")
+ &$sevenZip x "$path\node-v6.9.1-win-x86.7z" -o"$path" -aos > $nul
+ Remove-File "$path\node-v6.9.1-win-x86.7z"
+ }
+
+ # ensure we have npm
+ $npm = "$path\npm.*"
+ $getNpm = $true
+ if (test-path $npm)
+ {
+ $getNpm = $false
+ $tmpNpm = ls "$path\npm.*" | sort -property Name -descending | select -first 1
+ if ($tmpNpm.CreationTime -lt [DateTime]::Now.AddDays(-$cache))
+ {
+ $getNpm = $true
+ }
+ else
+ {
+ $npm = $tmpNpm.ToString()
+ }
+ }
+ if ($getNpm)
+ {
+ Write-Host "Download Npm..."
+ &$nuget install npm -OutputDirectory $path -Verbosity quiet
+ $npm = ls "$path\npm.*" | sort -property Name -descending | select -first 1
+ $npm.CreationTime = [DateTime]::Now
+ $npm = $npm.ToString()
+ }
+
+ # find visual studio
+ # will not work on VSO but VSO does not need it
+ $vsPath = ""
+ $vsVer = ""
+ $msBuild = $null
+ &$vswhere | foreach {
+ if ($_.StartsWith("installationPath:")) { $vsPath = $_.SubString("installationPath:".Length).Trim() }
+ if ($_.StartsWith("installationVersion:")) { $vsVer = $_.SubString("installationVersion:".Length).Trim() }
+ }
+ if ($vsPath -ne "")
+ {
+ $vsVerParts = $vsVer.Split('.')
+ $vsMajor = [int]::Parse($vsVerParts[0])
+ $vsMinor = [int]::Parse($vsVerParts[1])
+ if ($vsMajor -eq 15) {
+ $msBuild = "$vsPath\MSBuild\$vsMajor.$vsMinor\Bin"
+ }
+ elseif ($vsMajor -eq 14) {
+ $msBuild = "c:\Program Files (x86)\MSBuild\$vsMajor\Bin"
+ }
+ else
+ {
+ $msBuild = $null
+ }
+ }
+
+ $vs = $null
+ if ($msBuild)
+ {
+ $vs = new-object -typeName PsObject
+ $vs | add-member -memberType NoteProperty -name Path -value $vsPath
+ $vs | add-member -memberType NoteProperty -name Major -value $vsMajor
+ $vs | add-member -memberType NoteProperty -name Minor -value $vsMinor
+ $vs | add-member -memberType NoteProperty -name MsBuild -value "$msBuild\MsBuild.exe"
+ }
+
+ $solutionRoot = Get-FullPath "$PSScriptRoot\..\..\.."
+
+ $uenv = new-object -typeName PsObject
+ $uenv | add-member -memberType NoteProperty -name SolutionRoot -value $solutionRoot
+ $uenv | add-member -memberType NoteProperty -name VisualStudio -value $vs
+ $uenv | add-member -memberType NoteProperty -name NuGet -value $nuget
+ $uenv | add-member -memberType NoteProperty -name Zip -value $sevenZip
+ $uenv | add-member -memberType NoteProperty -name VsWhere -value $vswhere
+ $uenv | add-member -memberType NoteProperty -name Semver -value $semver
+ $uenv | add-member -memberType NoteProperty -name NodePath -value $node
+ $uenv | add-member -memberType NoteProperty -name NpmPath -value $npm
+
+ return $uenv
+}
diff --git a/build/Modules/Umbraco.Build/Get-UmbracoVersion.ps1 b/build/Modules/Umbraco.Build/Get-UmbracoVersion.ps1
new file mode 100644
index 0000000000..25d73df976
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Get-UmbracoVersion.ps1
@@ -0,0 +1,36 @@
+#
+# Get-UmbracoVersion
+# Gets the Umbraco version
+#
+function Get-UmbracoVersion
+{
+ $uenv = Get-UmbracoBuildEnv
+
+ try
+ {
+ [Reflection.Assembly]::LoadFile($uenv.Semver) > $null
+ }
+ catch
+ {
+ Write-Error -Exception $_.Exception -Message "Failed to load $uenv.Semver"
+ break
+ }
+
+ # parse SolutionInfo and retrieve the version string
+ $filepath = "$($uenv.SolutionRoot)\src\SolutionInfo.cs"
+ $text = [System.IO.File]::ReadAllText($filepath)
+ $match = [System.Text.RegularExpressions.Regex]::Matches($text, "AssemblyInformationalVersion\(`"(.+)?`"\)")
+ $version = $match.Groups[1]
+
+ # semver-parse the version string
+ $semver = [SemVer.SemVersion]::Parse($version)
+ $release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch
+
+ $versions = new-object -typeName PsObject
+ $versions | add-member -memberType NoteProperty -name Semver -value $semver
+ $versions | add-member -memberType NoteProperty -name Release -value $release
+ $versions | add-member -memberType NoteProperty -name Comment -value $semver.PreRelease
+ $versions | add-member -memberType NoteProperty -name Build -value $semver.Build
+
+ return $versions
+}
diff --git a/build/Modules/Umbraco.Build/Get-VisualStudio.ps1 b/build/Modules/Umbraco.Build/Get-VisualStudio.ps1
new file mode 100644
index 0000000000..cc88984eb2
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Get-VisualStudio.ps1
@@ -0,0 +1,30 @@
+# finds msbuild
+function Get-VisualStudio($vswhere)
+{
+ $vsPath = ""
+ $vsVer = ""
+ &$vswhere | foreach {
+ if ($_.StartsWith("installationPath:")) { $vsPath = $_.SubString("installationPath:".Length).Trim() }
+ if ($_.StartsWith("installationVersion:")) { $vsVer = $_.SubString("installationVersion:".Length).Trim() }
+ }
+ if ($vsPath -eq "") { return $null }
+
+ $vsVerParts = $vsVer.Split('.')
+ $vsMajor = [int]::Parse($vsVerParts[0])
+ $vsMinor = [int]::Parse($vsVerParts[1])
+ if ($vsMajor -eq 15) {
+ $msBuild = "$vsPath\MSBuild\$vsMajor.$vsMinor\Bin"
+ }
+ elseif ($vsMajor -eq 14) {
+ $msBuild = "c:\Program Files (x86)\MSBuild\$vsMajor\Bin"
+ }
+ else { return $null }
+ $msBuild = "$msBuild\MsBuild.exe"
+
+ $vs = new-object -typeName PsObject
+ $vs | add-member -memberType NoteProperty -name Path -value $vsPath
+ $vs | add-member -memberType NoteProperty -name Major -value $vsMajor
+ $vs | add-member -memberType NoteProperty -name Minor -value $vsMinor
+ $vs | add-member -memberType NoteProperty -name MsBuild -value $msBuild
+ return $vs
+}
diff --git a/build/Modules/Umbraco.Build/Set-UmbracoVersion.ps1 b/build/Modules/Umbraco.Build/Set-UmbracoVersion.ps1
new file mode 100644
index 0000000000..feece180fc
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Set-UmbracoVersion.ps1
@@ -0,0 +1,117 @@
+#
+# Set-UmbracoVersion
+# Sets the Umbraco version
+#
+# -Version
+# where is a Semver valid version
+# eg 1.2.3, 1.2.3-alpha, 1.2.3-alpha+456
+#
+function Set-UmbracoVersion
+{
+ param (
+ [Parameter(Mandatory=$true)]
+ [string]
+ $version
+ )
+
+ $uenv = Get-UmbracoBuildEnv
+
+ try
+ {
+ [Reflection.Assembly]::LoadFile($uenv.Semver) > $null
+ }
+ catch
+ {
+ Write-Error "Failed to load $uenv.Semver"
+ break
+ }
+
+ # validate input
+ $ok = [Regex]::Match($version, "^[0-9]+\.[0-9]+\.[0-9]+(\-[a-z0-9]+)?(\+[0-9]+)?$")
+ if (-not $ok.Success)
+ {
+ Write-Error "Invalid version $version"
+ break
+ }
+
+ # parse input
+ try
+ {
+ $semver = [SemVer.SemVersion]::Parse($version)
+ }
+ catch
+ {
+ Write-Error "Invalid version $version"
+ break
+ }
+
+ #
+ $release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch
+
+ # edit files and set the proper versions and dates
+ Write-Host "Update UmbracoVersion.cs"
+ Replace-FileText "$($uenv.SolutionRoot)\src\Umbraco.Core\Configuration\UmbracoVersion.cs" `
+ "(\d+)\.(\d+)\.(\d+)(.(\d+))?" `
+ "$release"
+ Replace-FileText "$($uenv.SolutionRoot)\src\Umbraco.Core\Configuration\UmbracoVersion.cs" `
+ "CurrentComment { get { return `"(.+)`"" `
+ "CurrentComment { get { return `"$semver.PreRelease`""
+ Write-Host "Update SolutionInfo.cs"
+ Replace-FileText "$($uenv.SolutionRoot)\src\SolutionInfo.cs" `
+ "AssemblyFileVersion\(`"(.+)?`"\)" `
+ "AssemblyFileVersion(`"$release`")"
+ Replace-FileText "$($uenv.SolutionRoot)\src\SolutionInfo.cs" `
+ "AssemblyInformationalVersion\(`"(.+)?`"\)" `
+ "AssemblyInformationalVersion(`"$semver`")"
+ $year = [System.DateTime]::Now.ToString("yyyy")
+ Replace-FileText "$($uenv.SolutionRoot)\src\SolutionInfo.cs" `
+ "AssemblyCopyright\(`"Copyright © Umbraco (\d{4})`"\)" `
+ "AssemblyCopyright(`"Copyright © Umbraco $year`")"
+
+ # edit csproj and set IIS Express port number
+ # this is a raw copy of ReplaceIISExpressPortNumber.exe
+ # it probably can be achieved in a much nicer way - l8tr
+ $source = @"
+ using System;
+ using System.IO;
+ using System.Xml;
+ using System.Globalization;
+
+ namespace Umbraco
+ {
+ public static class PortUpdater
+ {
+ public static void Update(string path, string release)
+ {
+ XmlDocument xmlDocument = new XmlDocument();
+ string fullPath = Path.GetFullPath(path);
+ xmlDocument.Load(fullPath);
+ int result = 1;
+ int.TryParse(release.Replace(`".`", `"`"), out result);
+ while (result < 1024)
+ result *= 10;
+ XmlNode xmlNode1 = xmlDocument.GetElementsByTagName(`"IISUrl`").Item(0);
+ if (xmlNode1 != null)
+ xmlNode1.InnerText = `"http://localhost:`" + (object) result;
+ XmlNode xmlNode2 = xmlDocument.GetElementsByTagName(`"DevelopmentServerPort`").Item(0);
+ if (xmlNode2 != null)
+ xmlNode2.InnerText = result.ToString((IFormatProvider) CultureInfo.InvariantCulture);
+ xmlDocument.Save(fullPath);
+ }
+ }
+ }
+"@
+
+ $assem = (
+ "System.Xml",
+ "System.IO",
+ "System.Globalization"
+ )
+
+ Write-Host "Update Umbraco.Web.UI.csproj"
+ add-type -referencedAssemblies $assem -typeDefinition $source -language CSharp
+ $csproj = "$($uenv.SolutionRoot)\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj"
+ [Umbraco.PortUpdater]::Update($csproj, $release)
+
+ return $semver
+}
diff --git a/build/Modules/Umbraco.Build/Umbraco.Build.psm1 b/build/Modules/Umbraco.Build/Umbraco.Build.psm1
new file mode 100644
index 0000000000..b303d03da1
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Umbraco.Build.psm1
@@ -0,0 +1,524 @@
+
+# Umbraco.Build.psm1
+#
+# $env:PSModulePath = "$pwd\build\Modules\;$env:PSModulePath"
+# Import-Module Umbraco.Build -Force -DisableNameChecking
+#
+# PowerShell Modules:
+# https://msdn.microsoft.com/en-us/library/dd878324%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
+#
+# PowerShell Module Manifest:
+# https://msdn.microsoft.com/en-us/library/dd878337%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
+#
+# See also
+# http://www.powershellmagazine.com/2014/08/15/pstip-taking-control-of-verbose-and-debug-output-part-5/
+
+
+. "$PSScriptRoot\Utilities.ps1"
+. "$PSScriptRoot\Get-VisualStudio.ps1"
+
+. "$PSScriptRoot\Get-UmbracoBuildEnv.ps1"
+. "$PSScriptRoot\Set-UmbracoVersion.ps1"
+. "$PSScriptRoot\Get-UmbracoVersion.ps1"
+
+#
+# Prepares the build
+#
+function Prepare-Build
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ Write-Host ">> Prepare Build"
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+
+ # clear
+ Write-Host "Clear folders and files"
+
+ Remove-Directory "$src\Umbraco.Web.UI.Client\build"
+ Remove-Directory "$src\Umbraco.Web.UI.Client\bower_components"
+
+ Remove-Directory "$tmp"
+ mkdir "$tmp" > $null
+
+ Remove-Directory "$out"
+ mkdir "$out" > $null
+
+ # prepare web.config
+ $webUi = "$src\Umbraco.Web.UI"
+ if (test-path "$webUi\web.config")
+ {
+ if (test-path "$webUi\web.config.temp-build")
+ {
+ Write-Host "Found existing web.config.temp-build"
+ $i = 0
+ while (test-path "$webUi\web.config.temp-build.$i")
+ {
+ $i = $i + 1
+ }
+ Write-Host "Save existing web.config as web.config.temp-build.$i"
+ Write-Host "(WARN: the original web.config.temp-build will be restored during post-build)"
+ mv "$webUi\web.config" "$webUi\web.config.temp-build.$i"
+ }
+ else
+ {
+ Write-Host "Save existing web.config as web.config.temp-build"
+ Write-Host "(will be restored during post-build)"
+ mv "$webUi\web.config" "$webUi\web.config.temp-build"
+ }
+ }
+ Write-Host "Create clean web.config"
+ Copy-File "$webUi\web.Template.config" "$webUi\web.config"
+}
+
+#
+# Builds the Belle UI project
+#
+function Compile-Belle
+{
+ param (
+ $uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ $version # an Umbraco version object (see Get-UmbracoVersion)
+ )
+
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $src = "$($uenv.SolutionRoot)\src"
+
+ Write-Host ">> Compile Belle"
+ Write-Host "Logging to $tmp\belle.log"
+
+ push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
+ $p = $env:path
+ $env:path = $uenv.NpmPath + ";" + $uenv.NodePath + ";" + $env:path
+
+ write "cache clean" > $tmp\belle.log
+ &npm cache clean --quiet >> $tmp\belle.log 2>&1
+ &npm install --quiet >> $tmp\belle.log 2>&1
+ &npm install -g grunt-cli --quiet >> $tmp\belle.log 2>&1
+ &npm install -g bower --quiet >> $tmp\belle.log 2>&1
+ &grunt build --buildversion=$version.Release >> $tmp\belle.log 2>&1
+
+ # fixme - should we filter the log to find errors?
+ #get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
+
+ pop-location
+ $env:path = $p
+
+
+ # 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 "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)
+}
+
+#
+# Compiles Umbraco
+#
+function Compile-Umbraco
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+
+ $buildConfiguration = "Release"
+
+ if ($uenv.VisualStudio -eq $null)
+ {
+ Write-Error "Build environment does not provide VisualStudio."
+ break
+ }
+
+ $toolsVersion = "4.0"
+ if ($uenv.VisualStudio.Major -eq 15)
+ {
+ $toolsVersion = "15.0"
+ }
+
+ Write-Host ">> Compile Umbraco"
+ Write-Host "Logging to $tmp\msbuild.umbraco.log"
+
+ # beware of the weird double \\ at the end of paths
+ # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
+ &$uenv.VisualStudio.MsBuild "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" `
+ /p:WarningLevel=0 `
+ /p:Configuration=$buildConfiguration `
+ /p:UseWPP_CopyWebApplication=True `
+ /p:PipelineDependsOnBuild=False `
+ /p:OutDir=$tmp\bin\\ `
+ /p:WebProjectOutputDir=$tmp\WebApp\\ `
+ /p:Verbosity=minimal `
+ /t:Clean`;Rebuild `
+ /tv:$toolsVersion `
+ /p:UmbracoBuild=True `
+ > $tmp\msbuild.umbraco.log
+
+ # /p:UmbracoBuild tells the csproj that we are building from PS
+}
+
+#
+# Prepare Tests
+#
+function Prepare-Tests
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+
+ 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"
+ mkdir "$tmp\tests\Packaging" > $null
+ Copy-Files "$src\Umbraco.Tests\Packaging\Packages" "*" "$tmp\tests\Packaging\Packages"
+
+ # required for package install tests
+ Write-Host "Create bin directory"
+ mkdir "$tmp\tests\bin" > $null
+}
+
+#
+# Compiles Tests
+#
+function Compile-Tests
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$tmp\tests"
+
+ $buildConfiguration = "Release"
+
+ if ($uenv.VisualStudio -eq $null)
+ {
+ Write-Error "Build environment does not provide VisualStudio."
+ break
+ }
+
+ $toolsVersion = "4.0"
+ if ($uenv.VisualStudio.Major -eq 15)
+ {
+ $toolsVersion = "15.0"
+ }
+
+ Write-Host ">> Compile Tests (logging to $tmp\msbuild.tests.log)"
+
+ # beware of the weird double \\ at the end of paths
+ # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
+ &$uenv.VisualStudio.MsBuild "$src\Umbraco.Tests\Umbraco.Tests.csproj" `
+ /p:WarningLevel=0 `
+ /p:Configuration=$buildConfiguration `
+ /p:UseWPP_CopyWebApplication=True `
+ /p:PipelineDependsOnBuild=False `
+ /p:OutDir=$out\\ `
+ /p:Verbosity=minimal `
+ /t:Build `
+ /tv:$toolsVersion `
+ /p:UmbracoBuild=True `
+ > $tmp\msbuild.tests.log
+
+ # /p:UmbracoBuild tells the csproj that we are building from PS
+}
+
+#
+# Cleans things up and prepare files after compilation
+#
+function Prepare-Packages
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ Write-Host ">> Prepare Packages"
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+
+ $buildConfiguration = "Release"
+
+ # restore web.config
+ $webUi = "$src\Umbraco.Web.UI"
+ if (test-path "$webUi\web.config.temp-build")
+ {
+ Write-Host "Restoring existing web.config"
+ Remove-File "$webUi\web.config"
+ mv "$webUi\web.config.temp-build" "$webUi\web.config"
+ }
+
+ # cleanup build
+ Write-Host "Clean build"
+ Remove-File "$tmp\bin\*.dll.config"
+ Remove-File "$tmp\WebApp\bin\*.dll.config"
+
+ # cleanup presentation
+ Write-Host "Cleanup presentation"
+ Remove-Directory "$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"
+ cp -force "$tmp\bin\*.xml" "$tmp\WebApp\bin"
+
+ Write-Host "Copy transformed configs and langs"
+ # note: exclude imageprocessor/*.config as imageprocessor pkg installs them
+ Copy-Files "$tmp\WebApp\config" "*.config" "$tmp\Configs" `
+ { -not $_.RelativeName.StartsWith("imageprocessor") }
+ Copy-Files "$tmp\WebApp\config" "*.js" "$tmp\Configs"
+ Copy-Files "$tmp\WebApp\config\lang" "*.xml" "$tmp\Configs\Lang"
+ Copy-File "$tmp\WebApp\web.config" "$tmp\Configs\web.config.transform"
+
+ Write-Host "Copy transformed web.config"
+ Copy-File "$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"
+ ls -r "$tmp\*.dll" | foreach {
+ $_.CreationTime = $_.CreationTime.AddHours(-11)
+ $_.LastWriteTime = $_.LastWriteTime.AddHours(-11)
+ }
+
+ # copy libs
+ Write-Host "Copy SqlCE libraries"
+ Copy-Files "$src\packages\SqlServerCE.4.0.0.1" "*.*" "$tmp\bin" `
+ { -not $_.Extension.StartsWith(".nu") -and -not $_.RelativeName.StartsWith("lib\") }
+ Copy-Files "$src\packages\SqlServerCE.4.0.0.1" "*.*" "$tmp\WebApp\bin" `
+ { -not $_.Extension.StartsWith(".nu") -and -not $_.RelativeName.StartsWith("lib\") }
+
+ # copy Belle
+ Write-Host "Copy Belle"
+ Copy-Files "$src\Umbraco.Web.UI.Client\build\belle" "*" "$tmp\WebApp\umbraco" `
+ { -not ($_.RelativeName -eq "index.html") }
+
+ # prepare WebPI
+ Write-Host "Prepare WebPI"
+ Remove-Directory "$tmp\WebPi"
+ mkdir "$tmp\WebPi" > $null
+ mkdir "$tmp\WebPi\umbraco" > $null
+ Copy-Files "$tmp\WebApp" "*" "$tmp\WebPi\umbraco"
+ Copy-Files "$src\WebPi" "*" "$tmp\WebPi"
+}
+
+#
+# Creates the Zip packages
+#
+function Package-Zip
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ Write-Host ">> Create Zip packages"
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+
+ Write-Host "Zip all binaries"
+ &$uenv.Zip a -r "$out\UmbracoCms.AllBinaries.$($version.Semver).zip" `
+ "$tmp\bin\*" `
+ "-x!dotless.Core.*" `
+ > $null
+
+ Write-Host "Zip cms"
+ &$uenv.Zip a -r "$out\UmbracoCms.$($version.Semver).zip" `
+ "$tmp\WebApp\*" `
+ "-x!dotless.Core.*" "-x!Content_Types.xml" `
+ > $null
+
+ Write-Host "Zip WebPI"
+ &$uenv.Zip a -r "$out\UmbracoCms.WebPI.$($version.Semver).zip" `
+ "$tmp\WebPi\*" `
+ "-x!dotless.Core.*" `
+ > $null
+
+ # hash the webpi file
+ Write-Host "Hash WebPI"
+ $hash = Get-FileHash "$out\UmbracoCms.WebPI.$($version.Semver).zip"
+ Write $hash | out-file "$out\webpihash.txt" -encoding ascii
+}
+
+#
+# Prepares NuGet
+#
+function Prepare-NuGet
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ Write-Host ">> Prepare NuGet"
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+
+ # add Web.config transform files to the NuGet package
+ Write-Host "Add web.config transforms to NuGet package"
+ mv "$tmp\WebApp\Views\Web.config" "$tmp\WebApp\Views\Web.config.transform"
+
+ # fixme - that one does not exist in .bat build either?
+ #mv "$tmp\WebApp\Xslt\Web.config" "$tmp\WebApp\Xslt\Web.config.transform"
+}
+
+#
+# Creates the NuGet packages
+#
+function Package-NuGet
+{
+ param (
+ $uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ $version # an Umbraco version object (see Get-UmbracoVersion)
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+ $nuspecs = "$($uenv.SolutionRoot)\build\NuSpecs"
+
+ Write-Host ">> Create NuGet packages"
+
+ # see https://docs.microsoft.com/en-us/nuget/schema/nuspec
+ # note - warnings about SqlCE native libs being outside of 'lib' folder,
+ # nothing much we can do about it as it's intentional yet there does not
+ # seem to be a way to disable the warning
+
+ &$uenv.NuGet Pack "$nuspecs\UmbracoCms.Core.nuspec" `
+ -Properties BuildTmp="$tmp" `
+ -Version $version.Semver.ToString() `
+ -Symbols -Verbosity quiet -outputDirectory $out
+
+ &$uenv.NuGet Pack "$nuspecs\UmbracoCms.nuspec" `
+ -Properties BuildTmp="$tmp" `
+ -Version $version.Semver.ToString() `
+ -Verbosity quiet -outputDirectory $out
+}
+
+#
+# Builds Umbraco
+#
+function Build-Umbraco
+{
+ [CmdletBinding()]
+ param (
+ [string]
+ $target = "all"
+ )
+
+ $target = $target.ToLowerInvariant()
+ Write-Host ">> Build-Umbraco <$target>"
+
+ Write-Host "Get Build Environment"
+ $uenv = Get-UmbracoBuildEnv
+
+ Write-Host "Get Version"
+ $version = Get-UmbracoVersion
+ Write-Host "Version $($version.Semver)"
+
+ if ($target -eq "pre-build")
+ {
+ Prepare-Build $uenv
+ Compile-Belle $uenv $version
+
+ # set environment variables
+ $env:UMBRACO_VERSION=$version.Semver.ToString()
+ $env:UMBRACO_RELEASE=$version.Release
+ $env:UMBRACO_COMMENT=$version.Comment
+ $env:UMBRACO_BUILD=$version.Build
+
+ # 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;]$($version.Semver.ToString())")
+ Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($version.Release)")
+ Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($version.Comment)")
+ Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($version.Build)")
+
+ Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($uenv.SolutionRoot)\build.tmp")
+ }
+ elseif ($target -eq "pre-tests")
+ {
+ Prepare-Tests $uenv
+ }
+ elseif ($target -eq "compile-tests")
+ {
+ Compile-Tests $uenv
+ }
+ elseif ($target -eq "compile-umbraco")
+ {
+ Compile-Umbraco $uenv
+ }
+ elseif ($target -eq "pre-packages")
+ {
+ Prepare-Packages $uenv
+ }
+ elseif ($target -eq "pre-nuget")
+ {
+ Prepare-NuGet $uenv
+ }
+ elseif ($target -eq "pkg-zip")
+ {
+ Package-Zip $uenv
+ }
+ elseif ($target -eq "compile-belle")
+ {
+ Compile-Belle $uenv $version
+ }
+ elseif ($target -eq "all")
+ {
+ Prepare-Build $uenv
+ Compile-Belle $uenv $version
+ Compile-Umbraco $uenv
+ Prepare-Tests $uenv
+ Compile-Tests $uenv
+ # not running tests...
+ Prepare-Packages $uenv
+ Package-Zip $uenv
+ Prepare-NuGet $uenv
+ Package-NuGet $uenv $version
+ }
+ else
+ {
+ Write-Error "Unsupported target `"$target`"."
+ }
+}
+
+#
+# export functions
+#
+Export-ModuleMember -function Get-UmbracoBuildEnv
+Export-ModuleMember -function Set-UmbracoVersion
+Export-ModuleMember -function Get-UmbracoVersion
+Export-ModuleMember -function Build-Umbraco
+
+#eof
\ No newline at end of file
diff --git a/build/Modules/Umbraco.Build/Utilities.ps1 b/build/Modules/Umbraco.Build/Utilities.ps1
new file mode 100644
index 0000000000..a90a85b11f
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Utilities.ps1
@@ -0,0 +1,83 @@
+# returns a string containing the hash of $file
+function Get-FileHash($file)
+{
+ try
+ {
+ $crypto = new-object System.Security.Cryptography.SHA1CryptoServiceProvider
+ $stream = [System.IO.File]::OpenRead($file)
+ $hash = $crypto.ComputeHash($stream)
+ $text = ""
+ $hash | foreach `
+ {
+ $text = $text + $_.ToString("x2")
+ }
+ return $text
+ }
+ finally
+ {
+ if ($stream)
+ {
+ $stream.Dispose()
+ }
+ $crypto.Dispose()
+ }
+}
+
+# returns the full path if $file is relative to $pwd
+function Get-FullPath($file)
+{
+ $path = [System.IO.Path]::Combine($pwd, $file)
+ $path = [System.IO.Path]::GetFullPath($path)
+ return $path
+}
+
+# removes a directory, doesn't complain if it does not exist
+function Remove-Directory($dir)
+{
+ remove-item $dir -force -recurse -errorAction SilentlyContinue > $null
+}
+
+# removes a file, doesn't complain if it does not exist
+function Remove-File($file)
+{
+ remove-item $file -force -errorAction SilentlyContinue > $null
+}
+
+# copies a file, creates target dir if needed
+function Copy-File($source, $target)
+{
+ $ignore = new-item -itemType file -path $target -force
+ cp -force $source $target
+}
+
+# copies files to a directory
+function Copy-Files($source, $select, $target, $filter)
+{
+ $files = ls -r "$source\$select"
+ $files | foreach {
+ $relative = $_.FullName.SubString($source.Length+1)
+ $_ | add-member -memberType NoteProperty -name RelativeName -value $relative
+ }
+ if ($filter -ne $null) {
+ $files = $files | where $filter
+ }
+ $files |
+ foreach {
+ if ($_.PsIsContainer) {
+ $ignore = new-item -itemType directory -path "$target\$($_.RelativeName)" -force
+ }
+ else {
+ Copy-File $_.FullName "$target\$($_.RelativeName)"
+ }
+ }
+}
+
+# regex-replaces content in a file
+function Replace-FileText($filename, $source, $replacement)
+{
+ $filepath = Get-FullPath $filename
+ $text = [System.IO.File]::ReadAllText($filepath)
+ $text = [System.Text.RegularExpressions.Regex]::Replace($text, $source, $replacement)
+ $utf8bom = New-Object System.Text.UTF8Encoding $true
+ [System.IO.File]::WriteAllText($filepath, $text, $utf8bom)
+}
diff --git a/build/ReplaceIISExpressPortNumber.exe b/build/ReplaceIISExpressPortNumber.exe
deleted file mode 100644
index 04334ebffe..0000000000
Binary files a/build/ReplaceIISExpressPortNumber.exe and /dev/null differ
diff --git a/build/UmbracoVersion.txt b/build/UmbracoVersion.txt
deleted file mode 100644
index c12ac783cc..0000000000
--- a/build/UmbracoVersion.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
-7.6.4
\ No newline at end of file
diff --git a/src/.nuget/NuGet.Config b/src/.nuget/NuGet.Config
deleted file mode 100644
index 6a318ad9b7..0000000000
--- a/src/.nuget/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.nuget/NuGet.exe b/src/.nuget/NuGet.exe
deleted file mode 100644
index 6804fb7da7..0000000000
Binary files a/src/.nuget/NuGet.exe and /dev/null differ
diff --git a/src/.nuget/NuGet.targets b/src/.nuget/NuGet.targets
deleted file mode 100644
index 6ff51f6e83..0000000000
--- a/src/.nuget/NuGet.targets
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
- $(MSBuildProjectDirectory)\..\
-
-
- false
-
-
- false
-
-
- true
-
-
- false
-
-
-
-
-
-
-
-
-
-
-
-
- $([System.IO.Path]::Combine($(SolutionDir), ".nuget"))
- $([System.IO.Path]::Combine($(ProjectDir), "packages.config"))
-
-
-
-
- $(SolutionDir).nuget
- packages.config
-
-
-
-
- $(NuGetToolsPath)\NuGet.exe
- @(PackageSource)
-
- "$(NuGetExePath)"
- mono --runtime=v4.0.30319 $(NuGetExePath)
-
- $(TargetDir.Trim('\\'))
-
- -RequireConsent
- -NonInteractive
-
- "$(SolutionDir) "
- "$(SolutionDir)"
-
-
- $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)
- $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols
-
-
-
- RestorePackages;
- $(BuildDependsOn);
-
-
-
-
- $(BuildDependsOn);
- BuildPackage;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/tools/7zip/7za.exe b/tools/7zip/7za.exe
deleted file mode 100644
index 7f6bf86bc4..0000000000
Binary files a/tools/7zip/7za.exe and /dev/null differ