diff --git a/Directory.Build.props b/Directory.Build.props
index 406abcec72..a67c0adcf5 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -118,6 +118,14 @@
$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\
+
+
+ $(RepositoryRoot).dotnet\$(TargetArchitecture)\
+ $(RepositoryRoot).dotnet\
+
+ $(LocalDotNetRoot)packs\
+
+
$([MSBuild]::MakeRelative($(RepositoryRoot), $(MSBuildProjectDirectory)))
diff --git a/activate.ps1 b/activate.ps1
new file mode 100644
index 0000000000..78e8557fc8
--- /dev/null
+++ b/activate.ps1
@@ -0,0 +1,57 @@
+#
+# This file must be used by invoking ". .\activate.ps1" from the command line.
+# You cannot run it directly.
+# To exit from the environment this creates, execute the 'deactivate' function.
+#
+
+function deactivate ([switch]$init) {
+
+ # reset old environment variables
+ if (Test-Path variable:_OLD_PATH) {
+ $env:PATH = $_OLD_PATH
+ Remove-Item variable:_OLD_PATH
+ }
+
+ if (test-path function:_old_prompt) {
+ Set-Item Function:prompt -Value $function:_old_prompt -ea ignore
+ remove-item function:_old_prompt
+ }
+
+ Remove-Item env:DOTNET_ROOT -ea ignore
+ Remove-Item env:DOTNET_MULTILEVEL_LOOKUP -ea ignore
+ if (-not $init) {
+ # Remove the deactivate function
+ Remove-Item function:deactivate
+ }
+}
+
+# Cleanup the environment
+deactivate -init
+
+$_OLD_PATH = $env:PATH
+# Tell dotnet where to find itself
+$env:DOTNET_ROOT = "$PSScriptRoot\.dotnet\x64"
+# Tell dotnet not to look beyond the DOTNET_ROOT folder for more dotnet things
+$env:DOTNET_MULTILEVEL_LOOKUP = 0
+# Put dotnet first on PATH
+$env:PATH = "${env:DOTNET_ROOT};${env:PATH}"
+
+# Set the shell prompt
+if (-not $env:DISABLE_CUSTOM_PROMPT) {
+ $function:_old_prompt = $function:prompt
+ function dotnet_prompt {
+ # Add a prefix to the current prompt, but don't discard it.
+ write-host "($( split-path $PSScriptRoot -leaf )) " -nonewline
+ & $function:_old_prompt
+ }
+
+ Set-Item Function:prompt -Value $function:dotnet_prompt -ea ignore
+}
+
+Write-Host -f Magenta "Enabled the .NET Core environment. Execute 'deactivate' to exit."
+if (-not (Test-Path "${env:DOTNET_ROOT}\dotnet.exe")) {
+ Write-Host -f Yellow ".NET Core has not been installed yet. Run $PSScriptRoot\restore.cmd to install it."
+}
+else {
+ Write-Host "dotnet = ${env:DOTNET_ROOT}\dotnet.exe"
+}
diff --git a/activate.sh b/activate.sh
new file mode 100644
index 0000000000..894479a8b9
--- /dev/null
+++ b/activate.sh
@@ -0,0 +1,69 @@
+#
+# This file must be used by invoking "source activate.sh" from the command line.
+# You cannot run it directly.
+# To exit from the environment this creates, execute the 'deactivate' function.
+
+_MAGENTA="\033[0;95m"
+_YELLOW="\033[0;33m"
+_RESET="\033[0m"
+
+deactivate () {
+
+ # reset old environment variables
+ if [ ! -z "${_OLD_PATH:-}" ] ; then
+ export PATH="$_OLD_PATH"
+ unset _OLD_PATH
+ fi
+
+ if [ ! -z "${_OLD_PS1:-}" ] ; then
+ export PS1="$_OLD_PS1"
+ unset _OLD_PS1
+ fi
+
+ # This should detect bash and zsh, which have a hash command that must
+ # be called to get it to forget past commands. Without forgetting
+ # past commands the $PATH changes we made may not be respected
+ if [ -n "${BASH:-}" ] || [ -n "${ZSH_VERSION:-}" ] ; then
+ hash -r 2>/dev/null
+ fi
+
+ unset DOTNET_ROOT
+ unset DOTNET_MULTILEVEL_LOOKUP
+ if [ ! "${1:-}" = "init" ] ; then
+ # Remove the deactivate function
+ unset -f deactivate
+ fi
+}
+
+# Cleanup the environment
+deactivate init
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+_OLD_PATH="$PATH"
+# Tell dotnet where to find itself
+export DOTNET_ROOT="$DIR/.dotnet"
+# Tell dotnet not to look beyond the DOTNET_ROOT folder for more dotnet things
+export DOTNET_MULTILEVEL_LOOKUP=0
+# Put dotnet first on PATH
+export PATH="$DOTNET_ROOT:$PATH"
+
+# Set the shell prompt
+if [ -z "${DISABLE_CUSTOM_PROMPT:-}" ] ; then
+ _OLD_PS1="$PS1"
+ export PS1="(`basename \"$DIR\"`) $PS1"
+fi
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands. Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "${BASH:-}" ] || [ -n "${ZSH_VERSION:-}" ] ; then
+ hash -r 2>/dev/null
+fi
+
+echo "${_MAGENTA}Enabled the .NET Core environment. Execute 'deactivate' to exit.${_RESET}"
+
+if [ ! -f "$DOTNET_ROOT/dotnet" ]; then
+ echo "${_YELLOW}.NET Core has not been installed yet. Run $DIR/restore.sh to install it.${_RESET}"
+else
+ echo "dotnet = $DOTNET_ROOT/dotnet"
+fi
diff --git a/build.ps1 b/build.ps1
index 578129a9ac..859ae10cfe 100644
--- a/build.ps1
+++ b/build.ps1
@@ -234,12 +234,7 @@ if (Test-Path $ConfigFile) {
}
}
-$DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } `
- elseif ($CI) { Join-Path $PSScriptRoot '.dotnet' } `
- elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} `
- elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}`
- else { Join-Path $PSScriptRoot '.dotnet'}
-
+$DotNetHome = Join-Path $PSScriptRoot '.dotnet'
$env:DOTNET_HOME = $DotNetHome
# Execute
@@ -310,4 +305,5 @@ try {
}
finally {
Remove-Module 'KoreBuild' -ErrorAction Ignore
+ Remove-Item env:DOTNET_HOME
}
diff --git a/build.sh b/build.sh
index bf5e54e8b0..4499355155 100755
--- a/build.sh
+++ b/build.sh
@@ -236,9 +236,6 @@ while [[ $# -gt 0 ]]; do
;;
--ci|-[Cc][Ii])
ci=true
- if [[ -z "${DOTNET_HOME:-}" ]]; then
- DOTNET_HOME="$DIR/.dotnet"
- fi
;;
--verbose|-[Vv]erbose)
verbose=true
@@ -286,8 +283,7 @@ if [ -f "$config_file" ]; then
[ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source"
fi
-[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet"
-export DOTNET_HOME="$DOTNET_HOME"
+export DOTNET_HOME="$DIR/.dotnet"
get_korebuild
diff --git a/build/repo.props b/build/repo.props
index 397e3d471d..d6ed427f9f 100644
--- a/build/repo.props
+++ b/build/repo.props
@@ -58,6 +58,7 @@
$(RepositoryRoot)src\SignalR\clients\ts\**\node_modules\**\*.*proj;
$(RepositoryRoot)src\Components\Blazor\Templates\src\content\**\*.*proj;
$(RepositoryRoot)src\ProjectTemplates\Web.ProjectTemplates\content\**\*.csproj;
+ $(RepositoryRoot)src\ProjectTemplates\Web.ProjectTemplates\content\**\*.fsproj;
$(RepositoryRoot)src\ProjectTemplates\Web.Spa.ProjectTemplates\content\**\*.csproj;
" />
@@ -159,7 +160,6 @@
$(RepositoryRoot)src\SignalR\**\*.csproj;
$(RepositoryRoot)src\Components\**\*.csproj;
$(RepositoryRoot)src\ProjectTemplates\*\*.csproj;
- $(RepositoryRoot)src\ProjectTemplates\test\*.csproj;
$(RepositoryRoot)src\ProjectTemplates\testassets\*\*.csproj;
"
Exclude="
diff --git a/docs/BuildFromSource.md b/docs/BuildFromSource.md
index ef3bf330a1..267b48331a 100644
--- a/docs/BuildFromSource.md
+++ b/docs/BuildFromSource.md
@@ -53,7 +53,7 @@ To update an existing copy, run:
git submodule update --init --recursive
```
-## Building in Visual Studio / Code
+## Building in Visual Studio
Before opening our .sln files in Visual Studio or VS Code, you need to perform the following actions.
@@ -95,31 +95,23 @@ Or you can use this script to automatically traverse the project reference graph
./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir src/Mvc/
-#### PATH
+## Building with Visual Studio Code
-For VS Code and Visual Studio and `dotnet` commands to work correctly, you must place the following location in your PATH.
-Use the following commands to update the PATH variable in a command line window.
+Using Visual Studio Code with this repo requires setting environment variables on command line first.
+Use these command to launch VS Code with the right settings.
-Windows (Command Prompt)
-
-```batch
-set PATH=%USERPROFILE%\.dotnet\x64;%PATH%
+On Windows (requires PowerShell):
+```
+. activate.ps1
+code .
```
-Windows (Powershell)
-
-```ps1
-$env:PATH="$env:USERPROFILE\.dotnet\x64;$env:PATH"
+On macOS/Linux:
```
-
-Linux/macOS:
-
-```sh
-export PATH="$HOME/.dotnet:$PATH"
+source activate.sh
+code .
```
-On Windows, we recommend using the `startvs.cmd` command to launch Visual Studio.
-
## Building on command-line
You can also build the entire project on command line with the `build.cmd`/`.sh` scripts.
@@ -134,6 +126,22 @@ On macOS/Linux:
./build.sh
```
+### Using `dotnet` on command line in this repo
+
+Because we are using pre-release versions of .NET Core, you have to set a handful of environment variables
+to make the .NET Core command line tool work well. You can set these environment variables like this
+
+On Windows (requires PowerShell):
+
+```ps1
+. .\activate.ps1
+```
+
+On macOS/Linux:
+```bash
+source ./activate.sh
+```
+
## Running tests on command-line
Tests are not run by default. Use the `-test` option to run tests in addition to building.
diff --git a/src/Framework/src/SharedFx.targets b/src/Framework/src/SharedFx.targets
index 0de8d1dcdb..4bf154064f 100644
--- a/src/Framework/src/SharedFx.targets
+++ b/src/Framework/src/SharedFx.targets
@@ -22,15 +22,12 @@ This targets file should only be imported by .shfxproj files.
CollectSharedFxOutput;
PostBuildEvent;
GetTargetPath;
+ PrepareForRun;
-
+
PrepareForCrossGen;
CrossGenAssemblies;
-
-
-
- $(CollectOutputSharedFxDependsOn);
CrossGenSymbols;
@@ -46,6 +43,12 @@ This targets file should only be imported by .shfxproj files.
AfterResolveReferences
+
+ CollectSharedFxOutput;
+ GetCopyToSharedFrameworkItems;
+ InstallFrameworkIntoLocalDotNet;
+
+
$(MSBuildProjectName)
@@ -71,6 +74,7 @@ This targets file should only be imported by .shfxproj files.
$(OutputPath)symbols\
$(OutputPath)native\
$(OutputPath)lib\$(TargetFramework)\
+ $(LocalDotNetRoot)shared\$(SharedFxName)\$(SharedFxVersion)\
$(IntermediateOutputPath)crossgen\
@@ -100,6 +104,12 @@ This targets file should only be imported by .shfxproj files.
$(ManifestOutputDir)$(SharedFxName).PlatformManifest.txt
+
+
+
+
+
+
@@ -192,7 +202,9 @@ This targets file should only be imported by .shfxproj files.
-
+
+
+
@@ -202,13 +214,27 @@ This targets file should only be imported by .shfxproj files.
-
-
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
@@ -246,8 +272,10 @@ This targets file should only be imported by .shfxproj files.
$(IntermediateOutputPath)%(RecursiveDir)%(Filename).symbols.rsp
$(SymbolsOutputPath)%(RecursiveDir)%(Filename).ni.pdb
$(RuntimeAssetsOutputPath)%(RecursiveDir)%(Filename)%(Extension)
+ %(RecursiveDir)%(Filename)%(Extension)
$(SymbolsOutputPath)%(RecursiveDir)
+
@@ -255,7 +283,7 @@ This targets file should only be imported by .shfxproj files.
Run the crossgen tool.
This uses .rsp files to get around OS limitations in the maximum number of characters that can be passed in on command-line.
-->
-
@@ -294,7 +322,7 @@ This targets file should only be imported by .shfxproj files.
StandardOutputImportance="Normal" />
-
@@ -345,4 +373,17 @@ This targets file should only be imported by .shfxproj files.
+
+
+
+
+
+
+
+
+
diff --git a/src/ProjectTemplates/build.cmd b/src/ProjectTemplates/build.cmd
index 033fe6f614..bf38370326 100644
--- a/src/ProjectTemplates/build.cmd
+++ b/src/ProjectTemplates/build.cmd
@@ -1,3 +1,3 @@
@ECHO OFF
SET RepoRoot=%~dp0..\..
-%RepoRoot%\build.cmd -projects %~dp0\**\*.*proj %*
+%RepoRoot%\build.cmd -projects %~dp0\**\*.*proj -pack /t:BuildSharedFx /t:Build %*
diff --git a/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj b/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj
index 6e32f19f69..a8cd236f3d 100644
--- a/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj
+++ b/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj
@@ -6,6 +6,7 @@
false
+ true
true
diff --git a/src/ProjectTemplates/test/RazorComponentsTemplateTest.cs b/src/ProjectTemplates/test/RazorComponentsTemplateTest.cs
index 220361e2d6..eeed2796f7 100644
--- a/src/ProjectTemplates/test/RazorComponentsTemplateTest.cs
+++ b/src/ProjectTemplates/test/RazorComponentsTemplateTest.cs
@@ -23,17 +23,6 @@ namespace Templates.Test
{
RunDotNetNew("razorcomponents");
- // We don't want the Directory.Build.props/targets interfering
- File.WriteAllText(
- Path.Combine(TemplateOutputDir, "Directory.Build.props"),
- "");
- File.WriteAllText(
- Path.Combine(TemplateOutputDir, "Directory.Build.targets"),
- @"
-
-
-");
-
// Run the "server" project
ProjectName += ".Server";
TemplateOutputDir = Path.Combine(TemplateOutputDir, ProjectName);
diff --git a/src/Servers/IIS/build/testsite.props b/src/Servers/IIS/build/testsite.props
index c0bdaf0e0d..6da7d1c824 100644
--- a/src/Servers/IIS/build/testsite.props
+++ b/src/Servers/IIS/build/testsite.props
@@ -33,7 +33,8 @@
-h "$(IISAppHostConfig)"
aspnetcorev2_inprocess.dll
- $(userprofile)\.dotnet\$(NativePlatform)\dotnet.exe
+
+ $(RepositoryRoot).dotnet\$(NativePlatform)\dotnet.exe
diff --git a/startvs.cmd b/startvs.cmd
index f3fa9216a3..d15843640b 100644
--- a/startvs.cmd
+++ b/startvs.cmd
@@ -2,12 +2,8 @@
:: This command launches a Visual Studio solution with environment variables required to use a local version of the .NET Core SDK.
-IF "%DOTNET_HOME%"=="" (
- set DOTNET_HOME=%USERPROFILE%\.dotnet
-)
-
:: This tells .NET Core to use the same dotnet.exe that build scripts use
-SET DOTNET_ROOT=%DOTNET_HOME%\x64
+SET DOTNET_ROOT=%~dp0.dotnet\x64
:: This tells .NET Core not to go looking for .NET Core in other places
SET DOTNET_MULTILEVEL_LOOKUP=0