diff --git a/.gitignore b/.gitignore
index 91696b1784..808b964260 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,13 +46,7 @@ src/Umbraco.Web.UI/Web.*.config.transformed
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
-_BuildOutput/*
*.ncrunchsolution
-build/UmbracoCms.AllBinaries*zip
-build/UmbracoCms.WebPI*zip
-build/UmbracoCms*zip
-build/UmbracoExamine.PDF*zip
-build/*.nupkg
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
@@ -68,7 +62,6 @@ src/packages/repositories.config
src/Umbraco.Web.UI/[Ww]eb.config
*.transformed
-webpihash.txt
node_modules
lib-bower
@@ -96,7 +89,6 @@ src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI.Client/[Bb]uild/*
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
-build/_BuildOutput/
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
tools/NDepend/
@@ -131,7 +123,6 @@ src/*.boltdata/
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.config.js
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.front.js
src/umbraco.sln.ide/*
-build/UmbracoCms.*/
src/.vs/
src/Umbraco.Web.UI/umbraco/js/install.loader.js
src/Umbraco.Tests/media
@@ -141,10 +132,11 @@ apidocs/api/*
build/docs.zip
build/ui-docs.zip
build/csharp-docs.zip
-build/msbuild.log
.vs/
src/packages/
src/PrecompiledWeb/*
-build/tools/
-src/PrecompiledWeb/*
-npm-debug.log
+
+
+build.out/
+build.tmp/
+build/Modules/*/temp/
\ No newline at end of file
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 0000000000..bc8ab500b1
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,149 @@
+Umbraco Cms Build
+--
+----
+
+# Quick!
+
+To build Umbraco, fire PowerShell and move to Umbraco's repository root (the directory that contains `src`, `build`, `README.md`...). There, trigger the build with the following command:
+
+ build\build.ps1
+
+By default, this builds the current version. It is possible to specify a different version as a parameter to the build script:
+
+ build\build.ps1 7.6.44
+
+Valid version strings are defined in the `Set-UmbracoVersion` documentation below.
+
+## Notes
+
+Git might have issues dealing with long file paths during build. You may want/need to enable `core.longpaths` support (see [this page](https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path) for details).
+
+# Build
+
+The Umbraco Build solution relies on a PowerShell module. The module needs to be imported into PowerShell. From within Umbraco's repository root:
+
+ build\build.ps1 -ModuleOnly
+
+Or the abbreviated form:
+
+ build\build.ps1 -mo
+
+Once the module has been imported, a set of commands are added to PowerShell.
+
+## Get-UmbracoBuildEnv
+
+Gets the Umbraco build environment ie NuGet, Semver, Visual Studio, etc. Downloads things that can be downloaded such as NuGet. Examples:
+
+ $uenv = Get-UmbracoBuildEnv
+ Write-Host $uenv.SolutionRoot
+ &$uenv.NuGet help
+
+The object exposes the following properties:
+
+* `SolutionRoot`: the absolute path to the solution root
+* `VisualStudio`: a Visual Studio object (see below)
+* `NuGet`: the absolute path to the NuGet executable
+* `Zip`: the absolute path to the 7Zip executable
+* `VsWhere`: the absolute path to the VsWhere executable
+* `NodePath`: the absolute path to the Node install
+* `NpmPath`: the absolute path to the Npm install
+
+The Visual Studio object is `null` when Visual Studio has not been detected (eg on VSTS). When not null, the object exposes the following properties:
+
+* `Path`: Visual Studio installation path (eg some place under `Program Files`)
+* `Major`: Visual Studio major version (eg `15` for VS 2017)
+* `Minor`: Visual Studio minor version
+* `MsBUild`: the absolute path to the MsBuild executable
+
+## Get-UmbracoVersion
+
+Gets an object representing the current Umbraco version. Example:
+
+ $v = Get-UmbracoVersion
+ Write-Host $v.Semver
+
+The object exposes the following properties:
+
+* `Semver`: the semver object representing the version
+* `Release`: the main part of the version (eg `7.6.33`)
+* `Comment`: the pre release part of the version (eg `alpha02`)
+* `Build`: the build number part of the version (eg `1234`)
+
+## Set-UmbracoVersion
+
+Modifies Umbraco files with the new version.
+
+>This entirely replaces the legacy `UmbracoVersion.txt` file.
+
+The version must be a valid semver version. It can include a *pre release* part (eg `alpha02`) and/or a *build number* (eg `1234`). Examples:
+
+ Set-UmbracoVersion 7.6.33
+ Set-UmbracoVersion 7.6.33-alpha02
+ Set-UmbracoVersion 7.6.33+1234
+ Set-UmbracoVersion 7.6.33-beta05+5678
+
+Note that `Set-UmbracoVersion` enforces a slightly more restrictive naming scheme than what semver would tolerate. The pre release part can only be composed of a-z and 0-9, therefore `alpha033` is considered valid but not `alpha.033` nor `alpha033-preview` nor `RC2` (would need to be lowercased `rc2`).
+
+>It is considered best to add trailing zeroes to pre releases, else NuGet gets the order of versions wrong. So if you plan to have more than 10, but no more that 100 alpha versions, number the versions `alpha00`, `alpha01`, etc.
+
+## Build-Umbraco
+
+Builds Umbraco. Temporary files are generated in `build.tmp` while the actual artifacts (zip files, NuGet packages...) are produced in `build.out`. Example:
+
+ Build-Umbraco
+
+Some log files, such as MsBuild logs, are produced in `build.tmp` too. The `build` directory should remain clean during a build.
+
+### web.config
+
+Building Umbraco requires a clean `web.config` file in the `Umbraco.Web.UI` project. If a `web.config` file already exists, the `pre-build` task (see below) will save it as `web.config.temp-build` and replace it with a clean copy of `web.Template.config`. The original file is replaced once it is safe to do so, by the `pre-packages` task.
+
+## Build-UmbracoDocs
+
+Builds umbraco documentation. Temporary files are generated in `build.tmp` while the actual artifacts (docs...) are produced in `build.out`. Example:
+
+ Build-UmbracoDocs
+
+Some log files, such as MsBuild logs, are produced in `build.tmp` too. The `build` directory should remain clean during a build.
+
+## Verify-NuGet
+
+Verifies that projects all require the same version of their dependencies, and that NuSpec files require versions that are consistent with projects. Example:
+
+ Verify-NuGet
+
+# VSTS
+
+Continuous integration, nightly builds and release builds run on VSTS.
+
+VSTS uses the `Build-Umbraco` command several times, each time passing a different *target* parameter. The supported targets are:
+
+* `pre-build`: prepares the build
+* `compile-belle`: compiles Belle
+* `compile-umbraco`: compiles Umbraco
+* `pre-tests`: prepares the tests
+* `compile-tests`: compiles the tests
+* `pre-packages`: prepares the packages
+* `pkg-zip`: creates the zip files
+* `pre-nuget`: prepares NuGet packages
+* `pkg-nuget`: creates NuGet packages
+
+All these targets are executed when `Build-Umbraco` is invoked without a parameter (or with the `all` parameter). On VSTS, compilations (of Umbraco and tests) are performed by dedicated VSTS tasks. Similarly, creating the NuGet packages is also performed by dedicated VSTS tasks.
+
+Finally, the produced artifacts are published in two containers that can be downloaded from VSTS: `zips` contains the zip files while `nuget` contains the NuGet packages.
+
+>During a VSTS build, some environment `UMBRACO_*` variables are exported by the `pre-build` target and can be reused in other targets *and* in VSTS tasks. The `UMBRACO_TMP` environment variable is used in `Umbraco.Tests` to disable some tests that have issues with VSTS at the moment.
+
+# Notes
+
+*This part needs to be cleaned up*
+
+Nightlies should use some sort of build number.
+
+We should increment versions as soon as a version is released. Ie, as soon as `7.6.33` is released, we should `Set-UmbracoVersion 7.6.34-alpha` and push.
+
+NuGet / NuSpec consistency checks are performed in tests. We should move it so it is done as part of the PowerShell script even before we try to compile and run the tests.
+
+There are still a few commands in `build` (to build docs, install Git or cleanup the install) that will need to be migrated to PowerShell.
+
+/eof
\ No newline at end of file
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000000..da9c4e137d
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,15 @@
+@ECHO OFF
+powershell .\build\build.ps1
+
+IF ERRORLEVEL 1 (
+ GOTO :error
+) ELSE (
+ GOTO :EOF
+)
+
+:error
+ECHO.
+ECHO Can not run build\build.ps1.
+ECHO If this is due to a SecurityError then make sure to run the following command from an administrator command prompt:
+ECHO.
+ECHO powershell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
\ No newline at end of file
diff --git a/build/Build.bat b/build/Build.bat
deleted file mode 100644
index 4a02d637b8..0000000000
--- a/build/Build.bat
+++ /dev/null
@@ -1,209 +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%
-
-IF EXIST ..\src\Umbraco.Web.UI.Client\bower_components (
- ECHO.
- ECHO Removing the bower_components folder to make sure everything is clean as a whistle
- 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 2>NUL
-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 vswhere.exe for VS2017+
-IF NOT EXIST "%toolsFolder%vswhere.exe" (
- ECHO vswhere not found - fetching now
- "%nuGetExecutable%" install vswhere -OutputDirectory tools -Verbosity quiet
-)
-
-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
-
-IF %SKIPNUGET% EQU 1 GOTO success
-
-IF EXIST ..\src\Umbraco.Web.UI.Client\node_modules (
- ECHO.
- ECHO Setting node_modules folder to hidden to prevent Visual Studio from crashing on it while loading the websites project
- attrib +h ..\src\Umbraco.Web.UI.Client\node_modules
-)
-
-ECHO.
-ECHO Adding Web.config transform files to the NuGet package
-REN .\_BuildOutput\WebApp\Views\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 b2175ef925..0000000000
--- a/build/Build.proj
+++ /dev/null
@@ -1,365 +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 dfbe634393..0000000000
--- a/build/BuildBelle.bat
+++ /dev/null
@@ -1,70 +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 nodeVersion=6.11.2
-
-SET nodeFileName=node-v%nodeVersion%-win-x86.7z
-SET nodeExtractFolder=%toolsFolder%node.js.%nodeVersion%
-
-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%')"
-)
-
-:: 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
-)
-
-:: 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"
-
-IF NOT EXIST "%nodeExtractFolder%" (
- ECHO Downloading http://nodejs.org/dist/v%nodeVersion%/%nodeFileName% to %toolsFolder%%nodeFileName%
- powershell -Command "(New-Object Net.WebClient).DownloadFile('http://nodejs.org/dist/v%nodeVersion%/%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"
-
-:build
- ECHO Adding Node to path
- REM SETLOCAL is on, so changes to the path not persist to the actual user's path
- PATH="%nodePath%";%PATH%
-
- ECHO Node version is:
- call node -v
-
- ECHO npm version is:
- call npm -v
-
- SET buildFolder=%CD%
-
- ECHO Change directory to %CD%\..\src\Umbraco.Web.UI.Client\
- CD %CD%\..\src\Umbraco.Web.UI.Client\
-
- ECHO Clean npm cache
- call npm cache clean
-
- ECHO Installing bower
- call npm install -g bower
-
- ECHO Installing gulp and gulp cli
- call npm install -g gulp
- call npm install -g gulp-cli
-
- ECHO Executing npm install
- call npm install
-
- ECHO Do gulp build of Belle
- call gulp build --buildversion=%release%
-
- ECHO Move back to the build folder
- CD "%buildFolder%"
\ No newline at end of file
diff --git a/build/BuildDocs.bat b/build/BuildDocs.bat
deleted file mode 100644
index 9d0a04e1cd..0000000000
--- a/build/BuildDocs.bat
+++ /dev/null
@@ -1,20 +0,0 @@
-@ECHO OFF
-SETLOCAL
-
-SET release=%1
-ECHO Installing Npm NuGet Package
-
-SET nuGetFolder=%CD%\..\src\packages\
-ECHO Configured packages folder: %nuGetFolder%
-ECHO Current folder: %CD%
-
-%CD%\..\src\.nuget\NuGet.exe install Npm.js -OutputDirectory %nuGetFolder% -Verbosity quiet
-
-for /f "delims=" %%A in ('dir %nuGetFolder%node.js.* /b') do set "nodePath=%nuGetFolder%%%A\"
-for /f "delims=" %%A in ('dir %nuGetFolder%npm.js.* /b') do set "npmPath=%nuGetFolder%%%A\tools\"
-
-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%
-
-Powershell.exe -ExecutionPolicy Unrestricted -File .\BuildDocs.ps1
\ No newline at end of file
diff --git a/build/BuildDocs.ps1 b/build/BuildDocs.ps1
deleted file mode 100644
index 7b13f98ca4..0000000000
--- a/build/BuildDocs.ps1
+++ /dev/null
@@ -1,114 +0,0 @@
-$PSScriptFilePath = (Get-Item $MyInvocation.MyCommand.Path);
-$RepoRoot = (get-item $PSScriptFilePath).Directory.Parent.FullName;
-$SolutionRoot = Join-Path -Path $RepoRoot "src";
-$ToolsRoot = Join-Path -Path $RepoRoot "tools";
-$DocFx = Join-Path -Path $ToolsRoot "docfx\docfx.exe"
-$DocFxFolder = (Join-Path -Path $ToolsRoot "docfx")
-$DocFxJson = Join-Path -Path $RepoRoot "apidocs\docfx.json"
-$7Zip = Join-Path -Path $ToolsRoot "7zip\7za.exe"
-$DocFxSiteOutput = Join-Path -Path $RepoRoot "apidocs\_site\*.*"
-$NgDocsSiteOutput = Join-Path -Path $RepoRoot "src\Umbraco.Web.UI.Client\docs\api\*.*"
-$ProgFiles86 = [Environment]::GetEnvironmentVariable("ProgramFiles(x86)");
-$MSBuild = "$ProgFiles86\MSBuild\14.0\Bin\MSBuild.exe"
-
-
-################ Do the UI docs
-
-"Changing to Umbraco.Web.UI.Client folder"
-cd ..
-cd src\Umbraco.Web.UI.Client
-Write-Host $(Get-Location)
-
-"Creating build folder so MSBuild doesn't run the whole grunt build"
-if (-Not (Test-Path "build")) {
- md "build"
-}
-
-"Installing node"
-# Check if Install-Product exists, should only exist on the build server
-if (Get-Command Install-Product -errorAction SilentlyContinue)
-{
- Install-Product node ''
-}
-
-"Installing node modules"
-& npm install
-
-"Installing grunt"
-& npm install -g grunt-cli
-
-"Moving back to build folder"
-cd ..
-cd ..
-cd build
-Write-Host $(Get-Location)
-
- & grunt --gruntfile ../src/umbraco.web.ui.client/gruntfile.js docs
-
-# change baseUrl
-$BaseUrl = "https://our.umbraco.org/apidocs/ui/"
-$IndexPath = "../src/umbraco.web.ui.client/docs/api/index.html"
-(Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath
-# zip it
-
-& $7Zip a -tzip ui-docs.zip $NgDocsSiteOutput -r
-
-################ Do the c# docs
-
-# Build the solution in debug mode
-$SolutionPath = Join-Path -Path $SolutionRoot -ChildPath "umbraco.sln"
-
-# Go get nuget.exe if we don't hae it
-$NuGet = "$ToolsRoot\nuget.exe"
-$FileExists = Test-Path $NuGet
-If ($FileExists -eq $False) {
- Write-Host "Retrieving nuget.exe..."
- $SourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
- Invoke-WebRequest $SourceNugetExe -OutFile $NuGet
-}
-
-#restore nuget packages
-Write-Host "Restoring nuget packages..."
-& $NuGet restore $SolutionPath
-
-& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount /t:Clean
-if (-not $?)
-{
- throw "The MSBuild process returned an error code."
-}
-& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount
-if (-not $?)
-{
- throw "The MSBuild process returned an error code."
-}
-
-# Go get docfx if we don't hae it
-$FileExists = Test-Path $DocFx
-If ($FileExists -eq $False) {
-
- If(!(Test-Path $DocFxFolder))
- {
- New-Item $DocFxFolder -type directory
- }
-
- $DocFxZip = Join-Path -Path $ToolsRoot "docfx\docfx.zip"
- $DocFxSource = "https://github.com/dotnet/docfx/releases/download/v1.9.4/docfx.zip"
- Invoke-WebRequest $DocFxSource -OutFile $DocFxZip
-
- #unzip it
- & $7Zip e $DocFxZip "-o$DocFxFolder"
-}
-
-#clear site
-If(Test-Path(Join-Path -Path $RepoRoot "apidocs\_site"))
-{
- Remove-Item $DocFxSiteOutput -recurse
-}
-
-# run it!
-& $DocFx metadata $DocFxJson
-& $DocFx build $DocFxJson
-
-# zip it
-
-& $7Zip a -tzip csharp-docs.zip $DocFxSiteOutput -r
diff --git a/build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1 b/build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1
new file mode 100644
index 0000000000..2633026f85
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1
@@ -0,0 +1,119 @@
+#
+
+function Build-UmbracoDocs
+{
+ $uenv = Get-UmbracoBuildEnv
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $out = "$($uenv.SolutionRoot)\build.out"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+
+ $buildTemp = "$PSScriptRoot\temp"
+ $cache = 2
+
+ Prepare-Build -keep $uenv
+
+ ################ Do the UI docs
+
+ # create Belle build folder, so that we don't cause a Belle rebuild
+ $belleBuildDir = "$src\Umbraco.Web.UI.Client\build"
+ if (-not (Test-Path $belleBuildDir))
+ {
+ mkdir $belleBuildDir > $null
+ }
+
+ Write-Host "Build UI documentation"
+
+ # get a temp clean node env (will restore)
+ Sandbox-Node $uenv
+
+ push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
+ write "node version is:" > $tmp\belle.log
+ &node -v >> $tmp\belle.log 2>&1
+ write "npm version is:" >> $tmp\belle.log 2>&1
+ &npm -v >> $tmp\belle.log 2>&1
+ write "cleaning npm cache" >> $tmp\belle.log 2>&1
+ &npm cache clean >> $tmp\belle.log 2>&1
+ write "installing bower" >> $tmp\belle.log 2>&1
+ &npm install -g bower >> $tmp\belle.log 2>&1
+ write "installing gulp" >> $tmp\belle.log 2>&1
+ &npm install -g gulp >> $tmp\belle.log 2>&1
+ write "installing gulp-cli" >> $tmp\belle.log 2>&1
+ &npm install -g gulp-cli --quiet >> $tmp\belle.log 2>&1
+ write "executing npm install" >> $tmp\belle.log 2>&1
+ &npm install >> $tmp\belle.log 2>&1
+ write "building docs using gulp" >> $tmp\belle.log 2>&1
+ &gulp docs >> $tmp\belle.log 2>&1
+ pop-location
+
+ # fixme - should we filter the log to find errors?
+ #get-content .\build.tmp\belle-docs.log | %{ if ($_ -match "build") { write $_}}
+
+ # change baseUrl
+ $baseUrl = "https://our.umbraco.org/apidocs/ui/"
+ $indexPath = "$src/Umbraco.Web.UI.Client/docs/api/index.html"
+ (Get-Content $indexPath).Replace("location.href.replace(rUrl, indexFile)", "'$baseUrl'") `
+ | Set-Content $indexPath
+
+ # restore
+ Restore-Node
+
+ # zip
+ &$uenv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Client\docs\api\*.*" `
+ > $null
+
+ ################ Do the c# docs
+
+ Write-Host "Build C# documentation"
+
+ # Build the solution in debug mode
+ # FIXME no only a simple compilation should be enough!
+ # FIXME we MUST handle msbuild & co error codes!
+ # FIXME deal with weird things in gitconfig?
+ #Build-Umbraco -Configuration Debug
+ Restore-NuGet $uenv
+ Compile-Umbraco $uenv "Debug" # FIXME different log file!
+ Restore-WebConfig "$src\Umbraco.Web.UI"
+
+ # ensure we have docfx
+ Get-DocFx $uenv $buildTemp
+
+ # clear
+ $docFxOutput = "$($uenv.SolutionRoot)\apidocs\_site"
+ if (test-path($docFxOutput))
+ {
+ Remove-Directory $docFxOutput
+ }
+
+ # run
+ $docFxJson = "$($uenv.SolutionRoot)\apidocs\docfx.json"
+ push-location "$($uenv.SolutionRoot)\build" # silly docfx.json wants this
+
+ Write-Host "Run DocFx metadata"
+ Write-Host "Logging to $tmp\docfx.metadata.log"
+ &$uenv.DocFx metadata $docFxJson > "$tmp\docfx.metadata.log"
+ Write-Host "Run DocFx build"
+ Write-Host "Logging to $tmp\docfx.build.log"
+ &$uenv.DocFx build $docFxJson > "$tmp\docfx.build.log"
+
+ pop-location
+
+ # zip
+ &$uenv.Zip a -tzip -r "$out\csharp-docs.zip" "$docFxOutput\*.*" `
+ > $null
+}
+
+function Get-DocFx($uenv, $buildTemp)
+{
+ $docFx = "$buildTemp\docfx"
+ if (-not (test-path $docFx))
+ {
+ Write-Host "Download DocFx..."
+ $source = "https://github.com/dotnet/docfx/releases/download/v2.19.2/docfx.zip"
+ Invoke-WebRequest $source -OutFile "$buildTemp\docfx.zip"
+
+ &$uenv.Zip x "$buildTemp\docfx.zip" -o"$buildTemp\docfx" -aos > $nul
+ Remove-File "$buildTemp\docfx.zip"
+ }
+ $uenv | add-member -memberType NoteProperty -name DocFx -value "$docFx\docfx.exe"
+}
\ 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..d1aaf7582f
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1
@@ -0,0 +1,180 @@
+#
+# 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..."
+ Invoke-WebRequest $source -OutFile $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
+ }
+
+ try
+ {
+ [Reflection.Assembly]::LoadFile($semver) > $null
+ }
+ catch
+ {
+ Write-Error -Exception $_.Exception -Message "Failed to load $semver"
+ break
+ }
+
+ # 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..."
+ Invoke-WebRequest $source -OutFile "$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"
+ }
+
+ # note: why? node already brings everything we need!
+ ## 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.0\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..a3ce784f14
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Get-UmbracoVersion.ps1
@@ -0,0 +1,26 @@
+#
+# Get-UmbracoVersion
+# Gets the Umbraco version
+#
+function Get-UmbracoVersion
+{
+ $uenv = Get-UmbracoBuildEnv
+
+ # 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..19681dcba0
--- /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..042cdc70d6
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Umbraco.Build.psm1
@@ -0,0 +1,603 @@
+
+# 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"
+. "$PSScriptRoot\Verify-NuGet.ps1"
+
+. "$PSScriptRoot\Build-UmbracoDocs.ps1"
+
+#
+# Prepares the build
+#
+function Prepare-Build
+{
+ param (
+ $uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv)
+
+ [Alias("k")]
+ [switch]
+ $keep = $false
+ )
+
+ 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\bower_components"
+
+ if (-not $keep)
+ {
+ Remove-Directory "$tmp"
+ mkdir "$tmp" > $null
+
+ Remove-Directory "$out"
+ mkdir "$out" > $null
+ }
+
+ # ensure proper web.config
+ $webUi = "$src\Umbraco.Web.UI"
+ Store-WebConfig $webUi
+ Write-Host "Create clean web.config"
+ Copy-File "$webUi\web.Template.config" "$webUi\web.config"
+}
+
+function Clear-EnvVar($var)
+{
+ $value = [Environment]::GetEnvironmentVariable($var)
+ if (test-path "env:$var") { rm "env:$var" }
+ return $value
+}
+
+function Set-EnvVar($var, $value)
+{
+ if ($value)
+ {
+ [Environment]::SetEnvironmentVariable($var, $value)
+ }
+ else
+ {
+ if (test-path "env:$var") { rm "env:$var" }
+ }
+}
+
+function Sandbox-Node
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ $global:node_path = $env:path
+ $nodePath = $uenv.NodePath
+ $gitExe = (get-command git).Source
+ $gitPath = [System.IO.Path]::GetDirectoryName($gitExe)
+ $env:path = "$nodePath;$gitPath"
+
+ $global:node_nodepath = Clear-EnvVar "NODEPATH"
+ $global:node_npmcache = Clear-EnvVar "NPM_CONFIG_CACHE"
+ $global:node_npmprefix = Clear-EnvVar "NPM_CONFIG_PREFIX"
+}
+
+function Restore-Node
+{
+ $env:path = $node_path
+
+ Set-EnvVar "NODEPATH" $node_nodepath
+ Set-EnvVar "NPM_CONFIG_CACHE" $node_npmcache
+ Set-EnvVar "NPM_CONFIG_PREFIX" $node_npmprefix
+}
+
+#
+# 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"
+
+ # get a temp clean node env (will restore)
+ Sandbox-Node $uenv
+
+ push-location "$($uenv.SolutionRoot)\src\Umbraco.Web.UI.Client"
+ write "node version is:" > $tmp\belle.log
+ &node -v >> $tmp\belle.log 2>&1
+ write "npm version is:" >> $tmp\belle.log 2>&1
+ &npm -v >> $tmp\belle.log 2>&1
+ write "cleaning npm cache" >> $tmp\belle.log 2>&1
+ &npm cache clean >> $tmp\belle.log 2>&1
+ write "installing bower" >> $tmp\belle.log 2>&1
+ &npm install -g bower >> $tmp\belle.log 2>&1
+ write "installing gulp" >> $tmp\belle.log 2>&1
+ &npm install -g gulp >> $tmp\belle.log 2>&1
+ write "installing gulp-cli" >> $tmp\belle.log 2>&1
+ &npm install -g gulp-cli --quiet >> $tmp\belle.log 2>&1
+ write "executing npm install" >> $tmp\belle.log 2>&1
+ &npm install >> $tmp\belle.log 2>&1
+ write "executing gulp but for version $version" >> $tmp\belle.log 2>&1
+ &gulp build --buildversion=$version.Release >> $tmp\belle.log 2>&1
+ pop-location
+
+ # fixme - should we filter the log to find errors?
+ #get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
+
+ # restore
+ Restore-Node
+
+ # 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)
+ [string] $buildConfiguration = "Release"
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+ $out = "$($uenv.SolutionRoot)\build.out"
+
+ 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:Platform=AnyCPU `
+ /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"
+ if( -Not (Test-Path -Path "$tmp\tests\Packaging" ) )
+ {
+ Write-Host "Create packaging directory"
+ New-Item -ItemType directory -Path "$tmp\tests\Packaging"
+ }
+ Copy-Files "$src\Umbraco.Tests\Packaging\Packages" "*" "$tmp\tests\Packaging\Packages"
+
+ # required for package install tests
+ if( -Not (Test-Path -Path "$tmp\tests\bin" ) )
+ {
+ Write-Host "Create bin directory"
+ New-Item -ItemType directory -Path "$tmp\tests\bin"
+ }
+}
+
+#
+# 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"
+ Write-Host "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:Platform=AnyCPU `
+ /p:UseWPP_CopyWebApplication=True `
+ /p:PipelineDependsOnBuild=False `
+ /p:OutDir=$out\\ `
+ /p:Verbosity=minimal `
+ /t:Build `
+ /tv:$toolsVersion `
+ /p:UmbracoBuild=True `
+ /p:NugetPackages=$src\packages `
+ > $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
+ Restore-WebConfig "$src\Umbraco.Web.UI"
+
+ # 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\umbraco\assets" "*" "$tmp\WebApp\umbraco\assets"
+ Copy-Files "$src\Umbraco.Web.UI\umbraco\js" "*" "$tmp\WebApp\umbraco\js"
+ Copy-Files "$src\Umbraco.Web.UI\umbraco\lib" "*" "$tmp\WebApp\umbraco\lib"
+ Copy-Files "$src\Umbraco.Web.UI\umbraco\views" "*" "$tmp\WebApp\umbraco\views"
+ Copy-Files "$src\Umbraco.Web.UI\umbraco\preview" "*" "$tmp\WebApp\umbraco\preview"
+
+ # 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"
+}
+
+#
+# Restores NuGet
+#
+function Restore-NuGet
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $tmp = "$($uenv.SolutionRoot)\build.tmp"
+
+ Write-Host ">> Restore NuGet"
+ Write-Host "Logging to $tmp\nuget.restore.log"
+
+ &$uenv.NuGet restore "$src\Umbraco.sln" > "$tmp\nuget.restore.log"
+}
+
+#
+# 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",
+ [string]
+ $buildConfiguration = "Release"
+ )
+
+ $target = $target.ToLowerInvariant()
+ Write-Host ">> Build-Umbraco <$target> <$buildConfiguration>"
+
+ 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 $buildConfiguration
+ }
+ elseif ($target -eq "pre-packages")
+ {
+ Prepare-Packages $uenv
+ }
+ elseif ($target -eq "pre-nuget")
+ {
+ Prepare-NuGet $uenv
+ }
+ elseif ($target -eq "restore-nuget")
+ {
+ Restore-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
+ Restore-NuGet $uenv
+ Compile-Belle $uenv $version
+ Compile-Umbraco $uenv $buildConfiguration
+ Prepare-Tests $uenv
+ Compile-Tests $uenv
+ # not running tests...
+ Prepare-Packages $uenv
+ Package-Zip $uenv
+ Verify-NuGet $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
+Export-ModuleMember -function Build-UmbracoDocs
+Export-ModuleMember -function Verify-NuGet
+
+#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..29b3c47429
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Utilities.ps1
@@ -0,0 +1,120 @@
+# 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)
+}
+
+# store web.config
+function Store-WebConfig($webUi)
+{
+ 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"
+ }
+ }
+}
+
+# restore web.config
+function Restore-WebConfig($webUi)
+{
+ 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"
+ }
+}
\ No newline at end of file
diff --git a/build/Modules/Umbraco.Build/Verify-NuGet.ps1 b/build/Modules/Umbraco.Build/Verify-NuGet.ps1
new file mode 100644
index 0000000000..1a2239393c
--- /dev/null
+++ b/build/Modules/Umbraco.Build/Verify-NuGet.ps1
@@ -0,0 +1,444 @@
+#
+# Verify-NuGet
+#
+
+function Format-Dependency
+{
+ param ( $d )
+
+ $m = $d.Id + " "
+ if ($d.MinInclude) { $m = $m + "[" }
+ else { $m = $m + "(" }
+ $m = $m + $d.MinVersion
+ if ($d.MaxVersion -ne $d.MinVersion) { $m = $m + "," + $d.MaxVersion }
+ if ($d.MaxInclude) { $m = $m + "]" }
+ else { $m = $m + ")" }
+
+ return $m
+}
+
+function Write-NuSpec
+{
+ param ( $name, $deps )
+
+ Write-Host ""
+ Write-Host "$name NuSpec dependencies:"
+
+ foreach ($d in $deps)
+ {
+ $m = Format-Dependency $d
+ Write-Host " $m"
+ }
+}
+
+function Write-Package
+{
+ param ( $name, $pkgs )
+
+ Write-Host ""
+ Write-Host "$name packages:"
+
+ foreach ($p in $pkgs)
+ {
+ Write-Host " $($p.Id) $($p.Version)"
+ }
+}
+
+function Verify-NuGet
+{
+ param (
+ $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv)
+ )
+
+ if ($uenv -eq $null)
+ {
+ $uenv = Get-UmbracoBuildEnv
+ }
+
+ $source = @"
+
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.IO;
+ using System.Xml;
+ using System.Xml.Serialization;
+ using Semver;
+
+ namespace Umbraco.Build
+ {
+ public class NuGet
+ {
+ public static Dependency[] GetNuSpecDependencies(string filename)
+ {
+ NuSpec nuspec;
+ var serializer = new XmlSerializer(typeof(NuSpec));
+ using (var reader = new StreamReader(filename))
+ {
+ nuspec = (NuSpec) serializer.Deserialize(reader);
+ }
+ var nudeps = nuspec.Metadata.Dependencies;
+ var deps = new List();
+ foreach (var nudep in nudeps)
+ {
+ var dep = new Dependency();
+ dep.Id = nudep.Id;
+
+ var parts = nudep.Version.Split(',');
+ if (parts.Length == 1)
+ {
+ dep.MinInclude = parts[0].StartsWith("[");
+ dep.MaxInclude = parts[0].EndsWith("]");
+
+ SemVersion version;
+ if (!SemVersion.TryParse(parts[0].Substring(1, parts[0].Length-2).Trim(), out version)) continue;
+ dep.MinVersion = dep.MaxVersion = version; //parts[0].Substring(1, parts[0].Length-2).Trim();
+ }
+ else
+ {
+ SemVersion version;
+ if (!SemVersion.TryParse(parts[0].Substring(1).Trim(), out version)) continue;
+ dep.MinVersion = version; //parts[0].Substring(1).Trim();
+ if (!SemVersion.TryParse(parts[1].Substring(0, parts[1].Length-1).Trim(), out version)) continue;
+ dep.MaxVersion = version; //parts[1].Substring(0, parts[1].Length-1).Trim();
+ dep.MinInclude = parts[0].StartsWith("[");
+ dep.MaxInclude = parts[1].EndsWith("]");
+ }
+
+ deps.Add(dep);
+ }
+ return deps.ToArray();
+ }
+
+ public static IEnumerable DistinctBy(/*this*/ IEnumerable source, Func keySelector)
+ {
+ HashSet knownKeys = new HashSet();
+ foreach (TSource element in source)
+ {
+ if (knownKeys.Add(keySelector(element)))
+ {
+ yield return element;
+ }
+ }
+ }
+
+ public static Package[] GetProjectsPackages(string src, string[] projects)
+ {
+ var l = new List();
+ foreach (var project in projects)
+ {
+ var path = Path.Combine(src, project);
+ var packageConfig = Path.Combine(path, "packages.config");
+ if (File.Exists(packageConfig))
+ ReadPackagesConfig(packageConfig, l);
+ var csprojs = Directory.GetFiles(path, "*.csproj");
+ foreach (var csproj in csprojs)
+ {
+ ReadCsProj(csproj, l);
+ }
+ }
+ IEnumerable p = l.OrderBy(x => x.Id);
+ p = DistinctBy(p, x => x.Id + ":::" + x.Version);
+ return p.ToArray();
+ }
+
+ public static object[] GetPackageErrors(Package[] pkgs)
+ {
+ return pkgs
+ .GroupBy(x => x.Id)
+ .Where(x => x.Count() > 1)
+ .ToArray();
+ }
+
+ public static object[] GetNuSpecErrors(Package[] pkgs, Dependency[] deps)
+ {
+ var d = pkgs.ToDictionary(x => x.Id, x => x.Version);
+ return deps
+ .Select(x =>
+ {
+ SemVersion v;
+ if (!d.TryGetValue(x.Id, out v)) return null;
+
+ var ok = true;
+
+ /*
+ if (x.MinInclude)
+ {
+ if (v < x.MinVersion) ok = false;
+ }
+ else
+ {
+ if (v <= x.MinVersion) ok = false;
+ }
+
+ if (x.MaxInclude)
+ {
+ if (v > x.MaxVersion) ok = false;
+ }
+ else
+ {
+ if (v >= x.MaxVersion) ok = false;
+ }
+ */
+
+ if (!x.MinInclude || v != x.MinVersion) ok = false;
+
+ return ok ? null : new { Dependency = x, Version = v };
+ })
+ .Where(x => x != null)
+ .ToArray();
+ }
+
+ /*
+ public static Package[] GetProjectPackages(string path)
+ {
+ var l = new List();
+ var packageConfig = Path.Combine(path, "packages.config");
+ if (File.Exists(packageConfig))
+ ReadPackagesConfig(packageConfig, l);
+ var csprojs = Directory.GetFiles(path, "*.csproj");
+ foreach (var csproj in csprojs)
+ {
+ ReadCsProj(csproj, l);
+ }
+ return l.ToArray();
+ }
+ */
+
+ public static string GetDirectoryName(string filename)
+ {
+ return Path.GetFileName(Path.GetDirectoryName(filename));
+ }
+
+ public static void ReadPackagesConfig(string filename, List packages)
+ {
+ //Console.WriteLine("read " + filename);
+
+ PackagesConfigPackages pkgs;
+ var serializer = new XmlSerializer(typeof(PackagesConfigPackages));
+ using (var reader = new StreamReader(filename))
+ {
+ pkgs = (PackagesConfigPackages) serializer.Deserialize(reader);
+ }
+ foreach (var p in pkgs.Packages)
+ {
+ SemVersion version;
+ if (!SemVersion.TryParse(p.Version, out version)) continue;
+ packages.Add(new Package { Id = p.Id, Version = version, Project = GetDirectoryName(filename) });
+ }
+ }
+
+ public static void ReadCsProj(string filename, List packages)
+ {
+ //Console.WriteLine("read " + filename);
+
+ // if xmlns then it's not a VS2017 with PackageReference
+ var text = File.ReadAllLines(filename);
+ var line = text.FirstOrDefault(x => x.Contains(" x.Packages != null).SelectMany(x => x.Packages))
+ {
+ var sversion = p.VersionE ?? p.VersionA;
+ SemVersion version;
+ if (!SemVersion.TryParse(sversion, out version)) continue;
+ packages.Add(new Package { Id = p.Id, Version = version, Project = GetDirectoryName(filename) });
+ }
+ }
+
+ public class Dependency
+ {
+ public string Id { get; set; }
+ public SemVersion MinVersion { get; set; }
+ public SemVersion MaxVersion { get; set; }
+ public bool MinInclude { get; set; }
+ public bool MaxInclude { get; set; }
+ }
+
+ public class Package
+ {
+ public string Id { get; set; }
+ public SemVersion Version { get; set; }
+ public string Project { get; set; }
+ }
+
+ [XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [XmlRoot(Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", IsNullable = false, ElementName = "package")]
+ public class NuSpec
+ {
+ [XmlElement("metadata")]
+ public NuSpecMetadata Metadata { get; set; }
+ }
+
+ [XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", TypeName = "metadata")]
+ public class NuSpecMetadata
+ {
+ [XmlArray("dependencies")]
+ [XmlArrayItem("dependency", IsNullable = false)]
+ public NuSpecDependency[] Dependencies { get; set; }
+ }
+
+ [XmlType(AnonymousType = true, Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", TypeName = "dependencies")]
+ public class NuSpecDependency
+ {
+ [XmlAttribute(AttributeName = "id")]
+ public string Id { get; set; }
+
+ [XmlAttribute(AttributeName = "version")]
+ public string Version { get; set; }
+ }
+
+ [XmlType(AnonymousType = true)]
+ [XmlRoot(Namespace = "", IsNullable = false, ElementName = "packages")]
+ public class PackagesConfigPackages
+ {
+ [XmlElement("package")]
+ public PackagesConfigPackage[] Packages { get; set; }
+ }
+
+ [XmlType(AnonymousType = true, TypeName = "package")]
+ public class PackagesConfigPackage
+ {
+ [XmlAttribute(AttributeName = "id")]
+ public string Id { get; set; }
+
+ [XmlAttribute(AttributeName = "version")]
+ public string Version { get; set; }
+ }
+
+ [XmlType(AnonymousType = true)]
+ [XmlRoot(Namespace = "", IsNullable = false, ElementName = "Project")]
+ public class CsProjProject
+ {
+ [XmlElement("ItemGroup")]
+ public CsProjItemGroup[] ItemGroups { get; set; }
+ }
+
+ [XmlType(AnonymousType = true, TypeName = "ItemGroup")]
+ public class CsProjItemGroup
+ {
+ [XmlElement("PackageReference")]
+ public CsProjPackageReference[] Packages { get; set; }
+ }
+
+ [XmlType(AnonymousType = true, TypeName = "PackageReference")]
+ public class CsProjPackageReference
+ {
+ [XmlAttribute(AttributeName = "Include")]
+ public string Id { get; set; }
+
+ [XmlAttribute(AttributeName = "Version")]
+ public string VersionA { get; set; }
+
+ [XmlElement("Version")]
+ public string VersionE { get; set;}
+ }
+ }
+ }
+
+"@
+
+ Write-Host ">> Verify NuGet consistency"
+
+ $assem = (
+ "System.Xml",
+ "System.Core", # "System.Collections.Generic"
+ "System.Linq",
+ "System.Xml.Serialization",
+ "System.IO",
+ "System.Globalization",
+ $uenv.Semver
+ )
+
+ try
+ {
+ # as long as the code hasn't changed it's fine to re-add, but if the code
+ # has changed this will throw - better warn the dev that we have an issue
+ add-type -referencedAssemblies $assem -typeDefinition $source -language CSharp
+ }
+ catch
+ {
+ if ($_.FullyQualifiedErrorId.StartsWith("TYPE_ALREADY_EXISTS,"))
+ { Write-Error "Failed to add type, did you change the code?" }
+ else
+ { Write-Error $_ }
+ }
+ if (-not $?) { break }
+
+ $nuspecs = (
+ "UmbracoCms",
+ "UmbracoCms.Core"
+ )
+
+ $projects = (
+ "Umbraco.Core",
+ "Umbraco.Web",
+ "Umbraco.Web.UI",
+ "UmbracoExamine"#,
+ #"Umbraco.Tests",
+ #"Umbraco.Tests.Benchmarks"
+ )
+
+ $src = "$($uenv.SolutionRoot)\src"
+ $pkgs = [Umbraco.Build.NuGet]::GetProjectsPackages($src, $projects)
+ if (-not $?) { break }
+ #Write-Package "All" $pkgs
+
+ $errs = [Umbraco.Build.NuGet]::GetPackageErrors($pkgs)
+ if (-not $?) { break }
+
+ if ($errs.Length -gt 0)
+ {
+ Write-Host ""
+ }
+ foreach ($err in $errs)
+ {
+ Write-Host $err.Key
+ foreach ($e in $err)
+ {
+ Write-Host " $($e.Version) required by $($e.Project)"
+ }
+ }
+ if ($errs.Length -gt 0)
+ {
+ Write-Error "Found non-consolidated package dependencies"
+ break
+ }
+
+ $nuerr = $false
+ $nupath = "$($uenv.SolutionRoot)\build\NuSpecs"
+ foreach ($nuspec in $nuspecs)
+ {
+ $deps = [Umbraco.Build.NuGet]::GetNuSpecDependencies("$nupath\$nuspec.nuspec")
+ if (-not $?) { break }
+ #Write-NuSpec $nuspec $deps
+
+ $errs = [Umbraco.Build.NuGet]::GetNuSpecErrors($pkgs, $deps)
+ if (-not $?) { break }
+
+ if ($errs.Length -gt 0)
+ {
+ Write-Host ""
+ Write-Host "$nuspec requires:"
+ $nuerr = $true
+ }
+ foreach ($err in $errs)
+ {
+ $m = Format-Dependency $err.Dependency
+ Write-Host " $m but projects require $($err.Version)"
+ }
+ }
+
+ if ($nuerr)
+ {
+ Write-Error "Found inconsistent NuGet dependencies"
+ break
+ }
+}
\ No newline at end of file
diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec
index 08475e5b46..aac6f26878 100644
--- a/build/NuSpecs/UmbracoCms.Core.nuspec
+++ b/build/NuSpecs/UmbracoCms.Core.nuspec
@@ -44,65 +44,65 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec
index 8d58ec43a3..22430a4516 100644
--- a/build/NuSpecs/UmbracoCms.nuspec
+++ b/build/NuSpecs/UmbracoCms.nuspec
@@ -19,22 +19,22 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
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 6f8b223965..0000000000
--- a/build/UmbracoVersion.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
-7.7.0
-beta005
\ No newline at end of file
diff --git a/build/build.ps1 b/build/build.ps1
new file mode 100644
index 0000000000..72d8287d9c
--- /dev/null
+++ b/build/build.ps1
@@ -0,0 +1,67 @@
+param (
+ [Parameter(Mandatory=$false)]
+ [string]
+ $version,
+
+ [Parameter(Mandatory=$false)]
+ [Alias("mo")]
+ [switch]
+ $moduleOnly = $false
+)
+
+# the script can run either from the solution root,
+# or from the ./build directory - anything else fails
+if ([System.IO.Path]::GetFileName($pwd) -eq "build")
+{
+ $mpath = [System.IO.Path]::GetDirectoryName($pwd) + "\build\Modules\"
+}
+else
+{
+ $mpath = "$pwd\build\Modules\"
+}
+
+# look for the module and throw if not found
+if (-not [System.IO.Directory]::Exists($mpath + "Umbraco.Build"))
+{
+ Write-Error "Could not locate Umbraco build Powershell module."
+ break
+}
+
+# add the module path (if not already there)
+if (-not $env:PSModulePath.Contains($mpath))
+{
+ $env:PSModulePath = "$mpath;$env:PSModulePath"
+}
+
+# force-import (or re-import) the module
+Write-Host "Import Umbraco build Powershell module"
+Import-Module Umbraco.Build -Force -DisableNameChecking
+
+# module only?
+if ($moduleOnly)
+{
+ if (-not [string]::IsNullOrWhiteSpace($version))
+ {
+ Write-Host "(module only: ignoring version parameter)"
+ }
+ else
+ {
+ Write-Host "(module only)"
+ }
+ break
+}
+
+# get build environment
+Write-Host "Setup Umbraco build Environment"
+$uenv = Get-UmbracoBuildEnv
+
+# set the version if any
+if (-not [string]::IsNullOrWhiteSpace($version))
+{
+ Write-Host "Set Umbraco version to $version"
+ Set-UmbracoVersion $version
+}
+
+# full umbraco build
+Write-Host "Build Umbraco"
+Build-Umbraco
\ 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/src/SQLCE4Umbraco/SqlCE4Umbraco.csproj b/src/SQLCE4Umbraco/SqlCE4Umbraco.csproj
index a5d86d5377..2f2bb5866d 100644
--- a/src/SQLCE4Umbraco/SqlCE4Umbraco.csproj
+++ b/src/SQLCE4Umbraco/SqlCE4Umbraco.csproj
@@ -93,7 +93,6 @@
-
@@ -1074,19 +1075,19 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
+
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index e5b2568430..abe4bbc7cf 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -2002,6 +2002,5 @@
-
\ No newline at end of file
diff --git a/src/UmbracoExamine/UmbracoExamine.csproj b/src/UmbracoExamine/UmbracoExamine.csproj
index b76bdbc029..8fdd5b2d04 100644
--- a/src/UmbracoExamine/UmbracoExamine.csproj
+++ b/src/UmbracoExamine/UmbracoExamine.csproj
@@ -188,7 +188,6 @@
-