Add customizations required to test CLI tools with MSBuild

This commit is contained in:
Nate McMaster 2016-11-02 15:24:07 -07:00
Родитель 68c2072b77
Коммит 2a775bac7a
8 изменённых файлов: 282 добавлений и 149 удалений

Просмотреть файл

@ -33,6 +33,9 @@ if ($env:KOREBUILD_SKIP_RUNTIME_INSTALL -eq "1")
} }
else else
{ {
# Install an MSBuild version of dotnet-cli
& "$koreBuildFolder/dotnet/dotnet-install.ps1" -InstallDir "$koreBuildFolder/dotnet" -Version (Get-Content "$koreBuildFolder\cli.version.msbuild") -Architecture x64 -Channel "rel-1.0.0"
# Install the version of dotnet-cli used to compile
& "$koreBuildFolder\dotnet\dotnet-install.ps1" -Channel $dotnetChannel -Version $dotnetVersion -Architecture x64 & "$koreBuildFolder\dotnet\dotnet-install.ps1" -Channel $dotnetChannel -Version $dotnetVersion -Architecture x64
} }
if (!($env:Path.Split(';') -icontains $dotnetLocalInstallFolder)) if (!($env:Path.Split(';') -icontains $dotnetLocalInstallFolder))

Просмотреть файл

@ -54,6 +54,10 @@ else
export KOREBUILD_FOLDER="$(dirname $koreBuildFolder)" export KOREBUILD_FOLDER="$(dirname $koreBuildFolder)"
chmod +x $koreBuildFolder/dotnet/dotnet-install.sh chmod +x $koreBuildFolder/dotnet/dotnet-install.sh
# Install an MSBuild version of dotnet-cli
$koreBuildFolder/dotnet/dotnet-install.sh --install-dir "$koreBuildFolder/dotnet" --channel rel-1.0.0 --version $(cat $koreBuildFolder/cli.version.msbuild)
# Install the version of dotnet-cli used to compile
$koreBuildFolder/dotnet/dotnet-install.sh --channel $KOREBUILD_DOTNET_CHANNEL --version $KOREBUILD_DOTNET_VERSION $koreBuildFolder/dotnet/dotnet-install.sh --channel $KOREBUILD_DOTNET_CHANNEL --version $KOREBUILD_DOTNET_VERSION
# Add .NET installation directory to the path if it isn't yet included. # Add .NET installation directory to the path if it isn't yet included.

Просмотреть файл

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<packageSources> <packageSources>
<clear /> <add key="aspnetcore-tools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="aspnetmaster" value="https://dotnet.myget.org/f/aspnetcore-master/api/v3/index.json" />
</packageSources> </packageSources>
</configuration> </configuration>

Просмотреть файл

@ -0,0 +1 @@
1.0.0-preview3-004007

108
build/dotnet/dotnet-install.ps1 поставляемый
Просмотреть файл

@ -45,12 +45,14 @@
.PARAMETER Verbose .PARAMETER Verbose
Displays diagnostics information. Displays diagnostics information.
.PARAMETER AzureFeed .PARAMETER AzureFeed
Default: https://dotnetcli.blob.core.windows.net/dotnet Default: https://dotnetcli.azureedge.net/dotnet
This parameter should not be usually changed by user. It allows to change URL for the Azure feed used by this installer. This parameter should not be usually changed by user. It allows to change URL for the Azure feed used by this installer.
.PARAMETER ProxyAddress
If set, the installer will use the proxy when making web requests
#> #>
[cmdletbinding()] [cmdletbinding()]
param( param(
[string]$Channel="preview", [string]$Channel="rel-1.0.0",
[string]$Version="Latest", [string]$Version="Latest",
[string]$InstallDir="<auto>", [string]$InstallDir="<auto>",
[string]$Architecture="<auto>", [string]$Architecture="<auto>",
@ -58,7 +60,9 @@ param(
[switch]$DebugSymbols, # TODO: Switch does not work yet. Symbols zip is not being uploaded yet. [switch]$DebugSymbols, # TODO: Switch does not work yet. Symbols zip is not being uploaded yet.
[switch]$DryRun, [switch]$DryRun,
[switch]$NoPath, [switch]$NoPath,
[string]$AzureFeed="https://dotnetcli.blob.core.windows.net/dotnet" [string]$AzureFeed="https://dotnetcli.azureedge.net/dotnet",
[string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet",
[string]$ProxyAddress
) )
Set-StrictMode -Version Latest Set-StrictMode -Version Latest
@ -115,26 +119,74 @@ function Get-Version-Info-From-Version-Text([string]$VersionText) {
return $VersionInfo return $VersionInfo
} }
function Load-Assembly([string] $Assembly) {
try {
Add-Type -Assembly $Assembly | Out-Null
}
catch {
# On Nano Server, Powershell Core Edition is used. Add-Type is unable to resolve base class assemblies because they are not GAC'd.
# Loading the base class assemblies is not unnecessary as the types will automatically get resolved.
}
}
function GetHTTPResponse([Uri] $Uri)
{
$HttpClient = $null
try {
# HttpClient is used vs Invoke-WebRequest in order to support Nano Server which doesn't support the Invoke-WebRequest cmdlet.
Load-Assembly -Assembly System.Net.Http
if($ProxyAddress){
$HttpClientHandler = New-Object System.Net.Http.HttpClientHandler
$HttpClientHandler.Proxy = New-Object System.Net.WebProxy -Property @{Address=$ProxyAddress}
$HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
}
else {
$HttpClient = New-Object System.Net.Http.HttpClient
}
$Response = $HttpClient.GetAsync($Uri).Result
if (($Response -eq $null) -or (-not ($Response.IsSuccessStatusCode)))
{
$ErrorMsg = "Failed to download $Uri."
if ($Response -ne $null)
{
$ErrorMsg += " $Response"
}
throw $ErrorMsg
}
return $Response
}
finally {
if ($HttpClient -ne $null) {
$HttpClient.Dispose()
}
}
}
function Get-Latest-Version-Info([string]$AzureFeed, [string]$AzureChannel, [string]$CLIArchitecture) { function Get-Latest-Version-Info([string]$AzureFeed, [string]$AzureChannel, [string]$CLIArchitecture) {
Say-Invocation $MyInvocation Say-Invocation $MyInvocation
$VersionFileUrl = $null $VersionFileUrl = $null
if ($SharedRuntime) { if ($SharedRuntime) {
$VersionFileUrl = "$AzureFeed/$AzureChannel/dnvm/latest.sharedfx.win.$CLIArchitecture.version" $VersionFileUrl = "$UncachedFeed/$AzureChannel/dnvm/latest.sharedfx.win.$CLIArchitecture.version"
} }
else { else {
$VersionFileUrl = "$AzureFeed/$AzureChannel/dnvm/latest.win.$CLIArchitecture.version" $VersionFileUrl = "$UncachedFeed/Sdk/$AzureChannel/latest.version"
} }
$Response = Invoke-WebRequest -UseBasicParsing $VersionFileUrl $Response = GetHTTPResponse -Uri $VersionFileUrl
$StringContent = $Response.Content.ReadAsStringAsync().Result
switch ($Response.Headers.'Content-Type'){ switch ($Response.Content.Headers.ContentType) {
{ ($_ -eq "application/octet-stream") } { $VersionText = [Text.Encoding]::UTF8.GetString($Response.Content) } { ($_ -eq "application/octet-stream") } { $VersionText = [Text.Encoding]::UTF8.GetString($StringContent) }
{ ($_ -eq "text/plain") } { $VersionText = $Response.Content } { ($_ -eq "text/plain") } { $VersionText = $StringContent }
default { throw "``$Response.Headers.'Content-Type'`` is an unknown .version file content type." } default { throw "``$Response.Content.Headers.ContentType`` is an unknown .version file content type." }
} }
$VersionInfo = Get-Version-Info-From-Version-Text $VersionText $VersionInfo = Get-Version-Info-From-Version-Text $VersionText
return $VersionInfo return $VersionInfo
@ -147,10 +199,8 @@ function Get-Azure-Channel-From-Channel([string]$Channel) {
# For compatibility with build scripts accept also directly Azure channels names # For compatibility with build scripts accept also directly Azure channels names
switch ($Channel.ToLower()) { switch ($Channel.ToLower()) {
{ ($_ -eq "future") -or ($_ -eq "dev") } { return "dev" } { ($_ -eq "future") -or ($_ -eq "dev") } { return "dev" }
{ ($_ -eq "beta") } { return "beta" }
{ ($_ -eq "preview") } { return "preview" }
{ $_ -eq "production" } { throw "Production channel does not exist yet" } { $_ -eq "production" } { throw "Production channel does not exist yet" }
default { throw "``$Channel`` is an invalid channel name. Use one of the following: ``future``, ``preview``, ``production``" } default { return $_ }
} }
} }
@ -171,19 +221,16 @@ function Get-Download-Links([string]$AzureFeed, [string]$AzureChannel, [string]$
Say-Invocation $MyInvocation Say-Invocation $MyInvocation
$ret = @() $ret = @()
$files = @()
if ($SharedRuntime) { if ($SharedRuntime) {
$files += "dotnet"; $PayloadURL = "$AzureFeed/$AzureChannel/Binaries/$SpecificVersion/dotnet-win-$CLIArchitecture.$SpecificVersion.zip"
} }
else { else {
$files += "dotnet-dev"; $PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-dev-win-$CLIArchitecture.$SpecificVersion.zip"
} }
foreach ($file in $files) {
$PayloadURL = "$AzureFeed/$AzureChannel/Binaries/$SpecificVersion/$file-win-$CLIArchitecture.$SpecificVersion.zip"
Say-Verbose "Constructed payload URL: $PayloadURL" Say-Verbose "Constructed payload URL: $PayloadURL"
$ret += $PayloadURL $ret += $PayloadURL
}
return $ret return $ret
} }
@ -286,7 +333,7 @@ function Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package([Sys
function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) { function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
Say-Invocation $MyInvocation Say-Invocation $MyInvocation
Add-Type -Assembly System.IO.Compression.FileSystem | Out-Null Load-Assembly -Assembly System.IO.Compression.FileSystem
Set-Variable -Name Zip Set-Variable -Name Zip
try { try {
$Zip = [System.IO.Compression.ZipFile]::OpenRead($ZipPath) $Zip = [System.IO.Compression.ZipFile]::OpenRead($ZipPath)
@ -313,6 +360,23 @@ function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
} }
} }
function DownloadFile([Uri]$Uri, [string]$OutPath) {
$Stream = $null
try {
$Response = GetHTTPResponse -Uri $Uri
$Stream = $Response.Content.ReadAsStreamAsync().Result
$File = [System.IO.File]::Create($OutPath)
$Stream.CopyTo($File)
$File.Close()
}
finally {
if ($Stream -ne $null) {
$Stream.Dispose()
}
}
}
$AzureChannel = Get-Azure-Channel-From-Channel -Channel $Channel $AzureChannel = Get-Azure-Channel-From-Channel -Channel $Channel
$CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture $CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture
$SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $AzureFeed -AzureChannel $AzureChannel -CLIArchitecture $CLIArchitecture -Version $Version $SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $AzureFeed -AzureChannel $AzureChannel -CLIArchitecture $CLIArchitecture -Version $Version
@ -342,7 +406,7 @@ New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null
foreach ($DownloadLink in $DownloadLinks) { foreach ($DownloadLink in $DownloadLinks) {
$ZipPath = [System.IO.Path]::GetTempFileName() $ZipPath = [System.IO.Path]::GetTempFileName()
Say "Downloading $DownloadLink" Say "Downloading $DownloadLink"
$resp = Invoke-WebRequest -UseBasicParsing $DownloadLink -OutFile $ZipPath DownloadFile -Uri $DownloadLink -OutPath $ZipPath
Say "Extracting zip from $DownloadLink" Say "Extracting zip from $DownloadLink"
Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot

110
build/dotnet/dotnet-install.sh поставляемый
Просмотреть файл

@ -27,16 +27,16 @@ if [ -t 1 ]; then
# see if it supports colors # see if it supports colors
ncolors=$(tput colors) ncolors=$(tput colors)
if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
bold="$(tput bold)" bold="$(tput bold || echo)"
normal="$(tput sgr0)" normal="$(tput sgr0 || echo)"
black="$(tput setaf 0)" black="$(tput setaf 0 || echo)"
red="$(tput setaf 1)" red="$(tput setaf 1 || echo)"
green="$(tput setaf 2)" green="$(tput setaf 2 || echo)"
yellow="$(tput setaf 3)" yellow="$(tput setaf 3 || echo)"
blue="$(tput setaf 4)" blue="$(tput setaf 4 || echo)"
magenta="$(tput setaf 5)" magenta="$(tput setaf 5 || echo)"
cyan="$(tput setaf 6)" cyan="$(tput setaf 6 || echo)"
white="$(tput setaf 7)" white="$(tput setaf 7 || echo)"
fi fi
fi fi
@ -64,23 +64,59 @@ get_current_os_name() {
echo "osx" echo "osx"
return 0 return 0
else else
# Detect Distro if [ -e /etc/os-release ]; then
if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then . /etc/os-release
echo "ubuntu"
return 0 case "$ID.$VERSION_ID" in
elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then "centos.7")
echo "centos" echo "centos"
return 0 return 0
elif [ "$(cat /etc/*-release | grep -cim1 rhel)" -eq 1 ]; then ;;
echo "rhel" "debian.8")
return 0
elif [ "$(cat /etc/*-release | grep -cim1 debian)" -eq 1 ]; then
echo "debian" echo "debian"
return 0 return 0
;;
"fedora.23")
echo "fedora.23"
return 0
;;
"fedora.24")
echo "fedora.24"
return 0
;;
"opensuse.13.2")
echo "opensuse.13.2"
return 0
;;
"opensuse.42.1")
echo "opensuse.42.1"
return 0
;;
"rhel.7.0" | "rhel.7.1" | "rhel.7.2")
echo "rhel"
return 0
;;
"ubuntu.14.04")
echo "ubuntu"
return 0
;;
"ubuntu.16.04")
echo "ubuntu.16.04"
return 0
;;
"ubuntu.16.10")
echo "ubuntu.16.10"
return 0
;;
"alpine.3.4.3")
echo "alpine"
return 0
;;
esac
fi fi
fi fi
say_err "OS name could not be detected" say_err "OS name could not be detected: $ID.$VERSION_ID"
return 1 return 1
} }
@ -267,13 +303,14 @@ get_latest_version_info() {
local azure_channel=$2 local azure_channel=$2
local normalized_architecture=$3 local normalized_architecture=$3
local osname=$(get_current_os_name) local osname
osname=$(get_current_os_name) || return 1
local version_file_url=null local version_file_url=null
if [ "$shared_runtime" = true ]; then if [ "$shared_runtime" = true ]; then
version_file_url="$azure_feed/$azure_channel/dnvm/latest.sharedfx.$osname.$normalized_architecture.version" version_file_url="$uncached_feed/$azure_channel/dnvm/latest.sharedfx.$osname.$normalized_architecture.version"
else else
version_file_url="$azure_feed/$azure_channel/dnvm/latest.$osname.$normalized_architecture.version" version_file_url="$uncached_feed/Sdk/$azure_channel/latest.version"
fi fi
say_verbose "get_latest_version_info: latest url: $version_file_url" say_verbose "get_latest_version_info: latest url: $version_file_url"
@ -292,21 +329,13 @@ get_azure_channel_from_channel() {
echo "dev" echo "dev"
return 0 return 0
;; ;;
beta)
echo "beta"
return 0
;;
preview)
echo "preview"
return 0
;;
production) production)
say_err "Production channel does not exist yet" say_err "Production channel does not exist yet"
return 1 return 1
esac esac
say_err "``$1`` is an invalid channel name. Use one of the following: ``future``, ``preview``, ``production``" echo $channel
return 1 return 0
} }
# args: # args:
@ -324,7 +353,8 @@ get_specific_version_from_version() {
case $version in case $version in
latest) latest)
local version_info="$(get_latest_version_info $azure_feed $azure_channel $normalized_architecture)" local version_info
version_info="$(get_latest_version_info $azure_feed $azure_channel $normalized_architecture)" || return 1
say_verbose "get_specific_version_from_version: version_info=$version_info" say_verbose "get_specific_version_from_version: version_info=$version_info"
echo "$version_info" | get_version_from_version_info echo "$version_info" | get_version_from_version_info
return 0 return 0
@ -353,13 +383,14 @@ construct_download_link() {
local normalized_architecture=$3 local normalized_architecture=$3
local specific_version=${4//[$'\t\r\n']} local specific_version=${4//[$'\t\r\n']}
local osname=$(get_current_os_name) local osname
osname=$(get_current_os_name) || return 1
local download_link=null local download_link=null
if [ "$shared_runtime" = true ]; then if [ "$shared_runtime" = true ]; then
download_link="$azure_feed/$azure_channel/Binaries/$specific_version/dotnet-$osname-$normalized_architecture.$specific_version.tar.gz" download_link="$azure_feed/$azure_channel/Binaries/$specific_version/dotnet-$osname-$normalized_architecture.$specific_version.tar.gz"
else else
download_link="$azure_feed/$azure_channel/Binaries/$specific_version/dotnet-dev-$osname-$normalized_architecture.$specific_version.tar.gz" download_link="$azure_feed/Sdk/$specific_version/dotnet-dev-$osname-$normalized_architecture.$specific_version.tar.gz"
fi fi
echo "$download_link" echo "$download_link"
@ -542,14 +573,15 @@ local_version_file_relative_path="/.version"
bin_folder_relative_path="" bin_folder_relative_path=""
temporary_file_template="${TMPDIR:-/tmp}/dotnet.XXXXXXXXX" temporary_file_template="${TMPDIR:-/tmp}/dotnet.XXXXXXXXX"
channel="preview" channel="rel-1.0.0"
version="Latest" version="Latest"
install_dir="<auto>" install_dir="<auto>"
architecture="<auto>" architecture="<auto>"
debug_symbols=false debug_symbols=false
dry_run=false dry_run=false
no_path=false no_path=false
azure_feed="https://dotnetcli.blob.core.windows.net/dotnet" azure_feed="https://dotnetcli.azureedge.net/dotnet"
uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
verbose=false verbose=false
shared_runtime=false shared_runtime=false
@ -653,4 +685,4 @@ else
say "Binaries of dotnet can be found in $bin_path" say "Binaries of dotnet can be found in $bin_path"
fi fi
say "Installation finished successfuly." say "Installation finished successfully."

Просмотреть файл

@ -4,6 +4,7 @@
}, },
"dependencies": { "dependencies": {
"Sake": "0.2.2", "Sake": "0.2.2",
"NuGetPackageVerifier": "1.0.0" "NuGetPackageVerifier": "1.0.1-*",
"dotnet-test-xunit": "2.2.0-preview2-build1029"
} }
} }

Просмотреть файл

@ -162,8 +162,15 @@ default SAMPLES_PROJECT_GLOB = "samples/*/project.json"
{ {
DotnetBuild(string.Join(" ", projectGlobs.ToArray()), Configuration, BuildFramework); DotnetBuild(string.Join(" ", projectGlobs.ToArray()), Configuration, BuildFramework);
} }
}
if (srcProjects != null) #build-pack .build-compile target='compile'
@{
if (Directory.Exists("src"))
{
Directory.CreateDirectory(BUILD_DIR);
var srcProjects = Files.Include(SRC_PROJECT_GLOB).ToList();
if (srcProjects != null && srcProjects.Count > 0)
{ {
srcProjects.ForEach(projectFile => srcProjects.ForEach(projectFile =>
{ {
@ -176,6 +183,7 @@ default SAMPLES_PROJECT_GLOB = "samples/*/project.json"
} }
} }
} }
}
#native-compile target='compile' if='!IsLinux && Directory.Exists(Path.Combine(BASE_DIR, "src"))' #native-compile target='compile' if='!IsLinux && Directory.Exists(Path.Combine(BASE_DIR, "src"))'
var programFilesX86 = '${Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)}' var programFilesX86 = '${Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)}'
@ -243,6 +251,28 @@ default SAMPLES_PROJECT_GLOB = "samples/*/project.json"
} }
} }
#xunit-test-msbuild
@{
var projectFiles = Files.Include(TEST_PROJECT_GLOB);
foreach (var projectFile in projectFiles)
{
var projectDir = Path.GetDirectoryName(projectFile);
var projectName = Path.GetFileName(projectDir);
var targetDir = Path.Combine(projectDir, "bin", Configuration, "netcoreapp1.0");
var depsFile = Path.Combine(targetDir, projectName + ".deps.json");
var configFile = Path.Combine(targetDir, projectName + ".runtimeconfig.json");
var assembly = Path.Combine(targetDir, projectName + ".dll");
var msbuildDotnet = Path.Combine(BASE_DIR, ".build/dotnet/dotnet");
Exec(msbuildDotnet, string.Format(
@"exec --depsfile ""{0}"" --runtimeconfig ""{1}"" ""{2}"" ""{3}"" {4}",
depsFile,
configFile,
Path.Combine(BASE_DIR, ".build/dotnet-test-xunit/2.2.0-preview2-build1029/lib/netcoreapp1.0/dotnet-test-xunit.dll"),
assembly,
E("KOREBUILD_DOTNET_TEST_OPTIONS")));
}
}
#make-roslyn-fast #make-roslyn-fast
ngen-roslyn ngen-roslyn