Update dependencies from https://github.com/dotnet/arcade build 20201026.10 (#2989)
[master] Update dependencies from dotnet/arcade
This commit is contained in:
Родитель
5075a6e0a8
Коммит
e09e53dfed
|
@ -3,17 +3,17 @@
|
||||||
<ProductDependencies>
|
<ProductDependencies>
|
||||||
</ProductDependencies>
|
</ProductDependencies>
|
||||||
<ToolsetDependencies>
|
<ToolsetDependencies>
|
||||||
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="6.0.0-beta.20525.1">
|
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="6.0.0-beta.20526.10">
|
||||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||||
<Sha>a77062f9cdaf07cbaf8d19941d079837844f69ca</Sha>
|
<Sha>c0f916d7f45834c080bf6cce60cf2bcfa00bc0a7</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="6.0.0-beta.20525.1">
|
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="6.0.0-beta.20526.10">
|
||||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||||
<Sha>a77062f9cdaf07cbaf8d19941d079837844f69ca</Sha>
|
<Sha>c0f916d7f45834c080bf6cce60cf2bcfa00bc0a7</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.DotNet.GenAPI" Version="6.0.0-beta.20525.1">
|
<Dependency Name="Microsoft.DotNet.GenAPI" Version="6.0.0-beta.20526.10">
|
||||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||||
<Sha>a77062f9cdaf07cbaf8d19941d079837844f69ca</Sha>
|
<Sha>c0f916d7f45834c080bf6cce60cf2bcfa00bc0a7</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
</ToolsetDependencies>
|
</ToolsetDependencies>
|
||||||
</Dependencies>
|
</Dependencies>
|
||||||
|
|
|
@ -18,6 +18,6 @@
|
||||||
<SnVersion>1.0.0</SnVersion>
|
<SnVersion>1.0.0</SnVersion>
|
||||||
<VSWhereVersion>2.5.2</VSWhereVersion>
|
<VSWhereVersion>2.5.2</VSWhereVersion>
|
||||||
<MicroBuildCoreVersion>0.2.0</MicroBuildCoreVersion>
|
<MicroBuildCoreVersion>0.2.0</MicroBuildCoreVersion>
|
||||||
<MicrosoftDotNetGenAPIVersion>6.0.0-beta.20525.1</MicrosoftDotNetGenAPIVersion>
|
<MicrosoftDotNetGenAPIVersion>6.0.0-beta.20526.10</MicrosoftDotNetGenAPIVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -7,7 +7,6 @@ Param(
|
||||||
[string] $msbuildEngine = $null,
|
[string] $msbuildEngine = $null,
|
||||||
[bool] $warnAsError = $true,
|
[bool] $warnAsError = $true,
|
||||||
[bool] $nodeReuse = $true,
|
[bool] $nodeReuse = $true,
|
||||||
[bool] $useDefaultDotnetInstall = $false,
|
|
||||||
[switch][Alias('r')]$restore,
|
[switch][Alias('r')]$restore,
|
||||||
[switch] $deployDeps,
|
[switch] $deployDeps,
|
||||||
[switch][Alias('b')]$build,
|
[switch][Alias('b')]$build,
|
||||||
|
@ -66,7 +65,6 @@ function Print-Usage() {
|
||||||
Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build"
|
Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build"
|
||||||
Write-Host " -warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
Write-Host " -warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
||||||
Write-Host " -msbuildEngine <value> Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)."
|
Write-Host " -msbuildEngine <value> Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)."
|
||||||
Write-Host " -useDefaultDotnetInstall <value> Use dotnet-install.* scripts from public location as opposed to from eng common folder"
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
Write-Host "Command line arguments not listed above are passed thru to msbuild."
|
Write-Host "Command line arguments not listed above are passed thru to msbuild."
|
||||||
|
|
|
@ -36,8 +36,6 @@ usage()
|
||||||
echo " --prepareMachine Prepare machine for CI run, clean up processes after build"
|
echo " --prepareMachine Prepare machine for CI run, clean up processes after build"
|
||||||
echo " --nodeReuse <value> Sets nodereuse msbuild parameter ('true' or 'false')"
|
echo " --nodeReuse <value> Sets nodereuse msbuild parameter ('true' or 'false')"
|
||||||
echo " --warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
echo " --warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
||||||
echo " --useDefaultDotnetInstall <value> Use dotnet-install.* scripts from public location as opposed to from eng common folder"
|
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Command line arguments not listed above are passed thru to msbuild."
|
echo "Command line arguments not listed above are passed thru to msbuild."
|
||||||
echo "Arguments can also be passed in with a single hyphen."
|
echo "Arguments can also be passed in with a single hyphen."
|
||||||
|
@ -80,7 +78,6 @@ prepare_machine=false
|
||||||
verbosity='minimal'
|
verbosity='minimal'
|
||||||
runtime_source_feed=''
|
runtime_source_feed=''
|
||||||
runtime_source_feed_key=''
|
runtime_source_feed_key=''
|
||||||
use_default_dotnet_install=false
|
|
||||||
|
|
||||||
properties=''
|
properties=''
|
||||||
while [[ $# > 0 ]]; do
|
while [[ $# > 0 ]]; do
|
||||||
|
@ -159,14 +156,10 @@ while [[ $# > 0 ]]; do
|
||||||
runtime_source_feed=$2
|
runtime_source_feed=$2
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
-runtimesourcefeedkey)
|
-runtimesourcefeedkey)
|
||||||
runtime_source_feed_key=$2
|
runtime_source_feed_key=$2
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
-usedefaultdotnetinstall)
|
|
||||||
use_default_dotnet_install=$2
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
properties="$properties $1"
|
properties="$properties $1"
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -1,774 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
||||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Copied from https://dot.net/v1/dotnet-install.ps1 on 8/26/2020
|
|
||||||
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Installs dotnet cli
|
|
||||||
.DESCRIPTION
|
|
||||||
Installs dotnet cli. If dotnet installation already exists in the given directory
|
|
||||||
it will update it only if the requested version differs from the one already installed.
|
|
||||||
.PARAMETER Channel
|
|
||||||
Default: LTS
|
|
||||||
Download from the Channel specified. Possible values:
|
|
||||||
- Current - most current release
|
|
||||||
- LTS - most current supported release
|
|
||||||
- 2-part version in a format A.B - represents a specific release
|
|
||||||
examples: 2.0, 1.0
|
|
||||||
- Branch name
|
|
||||||
examples: release/2.0.0, Master
|
|
||||||
Note: The version parameter overrides the channel parameter.
|
|
||||||
.PARAMETER Version
|
|
||||||
Default: latest
|
|
||||||
Represents a build version on specific channel. Possible values:
|
|
||||||
- latest - most latest build on specific channel
|
|
||||||
- coherent - most latest coherent build on specific channel
|
|
||||||
coherent applies only to SDK downloads
|
|
||||||
- 3-part version in a format A.B.C - represents specific version of build
|
|
||||||
examples: 2.0.0-preview2-006120, 1.1.0
|
|
||||||
.PARAMETER InstallDir
|
|
||||||
Default: %LocalAppData%\Microsoft\dotnet
|
|
||||||
Path to where to install dotnet. Note that binaries will be placed directly in a given directory.
|
|
||||||
.PARAMETER Architecture
|
|
||||||
Default: <auto> - this value represents currently running OS architecture
|
|
||||||
Architecture of dotnet binaries to be installed.
|
|
||||||
Possible values are: <auto>, amd64, x64, x86, arm64, arm
|
|
||||||
.PARAMETER SharedRuntime
|
|
||||||
This parameter is obsolete and may be removed in a future version of this script.
|
|
||||||
The recommended alternative is '-Runtime dotnet'.
|
|
||||||
Installs just the shared runtime bits, not the entire SDK.
|
|
||||||
.PARAMETER Runtime
|
|
||||||
Installs just a shared runtime, not the entire SDK.
|
|
||||||
Possible values:
|
|
||||||
- dotnet - the Microsoft.NETCore.App shared runtime
|
|
||||||
- aspnetcore - the Microsoft.AspNetCore.App shared runtime
|
|
||||||
- windowsdesktop - the Microsoft.WindowsDesktop.App shared runtime
|
|
||||||
.PARAMETER DryRun
|
|
||||||
If set it will not perform installation but instead display what command line to use to consistently install
|
|
||||||
currently requested version of dotnet cli. In example if you specify version 'latest' it will display a link
|
|
||||||
with specific version so that this command can be used deterministicly in a build script.
|
|
||||||
It also displays binaries location if you prefer to install or download it yourself.
|
|
||||||
.PARAMETER NoPath
|
|
||||||
By default this script will set environment variable PATH for the current process to the binaries folder inside installation folder.
|
|
||||||
If set it will display binaries location but not set any environment variable.
|
|
||||||
.PARAMETER Verbose
|
|
||||||
Displays diagnostics information.
|
|
||||||
.PARAMETER AzureFeed
|
|
||||||
Default: https://dotnetcli.azureedge.net/dotnet
|
|
||||||
This parameter typically is not changed by the user.
|
|
||||||
It allows changing the URL for the Azure feed used by this installer.
|
|
||||||
.PARAMETER UncachedFeed
|
|
||||||
This parameter typically is not changed by the user.
|
|
||||||
It allows changing the URL for the Uncached feed used by this installer.
|
|
||||||
.PARAMETER FeedCredential
|
|
||||||
Used as a query string to append to the Azure feed.
|
|
||||||
It allows changing the URL to use non-public blob storage accounts.
|
|
||||||
.PARAMETER ProxyAddress
|
|
||||||
If set, the installer will use the proxy when making web requests
|
|
||||||
.PARAMETER ProxyUseDefaultCredentials
|
|
||||||
Default: false
|
|
||||||
Use default credentials, when using proxy address.
|
|
||||||
.PARAMETER ProxyBypassList
|
|
||||||
If set with ProxyAddress, will provide the list of comma separated urls that will bypass the proxy
|
|
||||||
.PARAMETER SkipNonVersionedFiles
|
|
||||||
Default: false
|
|
||||||
Skips installing non-versioned files if they already exist, such as dotnet.exe.
|
|
||||||
.PARAMETER NoCdn
|
|
||||||
Disable downloading from the Azure CDN, and use the uncached feed directly.
|
|
||||||
.PARAMETER JSonFile
|
|
||||||
Determines the SDK version from a user specified global.json file
|
|
||||||
Note: global.json must have a value for 'SDK:Version'
|
|
||||||
#>
|
|
||||||
[cmdletbinding()]
|
|
||||||
param(
|
|
||||||
[string]$Channel="LTS",
|
|
||||||
[string]$Version="Latest",
|
|
||||||
[string]$JSonFile,
|
|
||||||
[string]$InstallDir="<auto>",
|
|
||||||
[string]$Architecture="<auto>",
|
|
||||||
[ValidateSet("dotnet", "aspnetcore", "windowsdesktop", IgnoreCase = $false)]
|
|
||||||
[string]$Runtime,
|
|
||||||
[Obsolete("This parameter may be removed in a future version of this script. The recommended alternative is '-Runtime dotnet'.")]
|
|
||||||
[switch]$SharedRuntime,
|
|
||||||
[switch]$DryRun,
|
|
||||||
[switch]$NoPath,
|
|
||||||
[string]$AzureFeed="https://dotnetcli.azureedge.net/dotnet",
|
|
||||||
[string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet",
|
|
||||||
[string]$FeedCredential,
|
|
||||||
[string]$ProxyAddress,
|
|
||||||
[switch]$ProxyUseDefaultCredentials,
|
|
||||||
[string[]]$ProxyBypassList=@(),
|
|
||||||
[switch]$SkipNonVersionedFiles,
|
|
||||||
[switch]$NoCdn
|
|
||||||
)
|
|
||||||
|
|
||||||
Set-StrictMode -Version Latest
|
|
||||||
$ErrorActionPreference="Stop"
|
|
||||||
$ProgressPreference="SilentlyContinue"
|
|
||||||
|
|
||||||
if ($NoCdn) {
|
|
||||||
$AzureFeed = $UncachedFeed
|
|
||||||
}
|
|
||||||
|
|
||||||
$BinFolderRelativePath=""
|
|
||||||
|
|
||||||
if ($SharedRuntime -and (-not $Runtime)) {
|
|
||||||
$Runtime = "dotnet"
|
|
||||||
}
|
|
||||||
|
|
||||||
# example path with regex: shared/1.0.0-beta-12345/somepath
|
|
||||||
$VersionRegEx="/\d+\.\d+[^/]+/"
|
|
||||||
$OverrideNonVersionedFiles = !$SkipNonVersionedFiles
|
|
||||||
|
|
||||||
function Say($str) {
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Write-Host "dotnet-install: $str"
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
# Some platforms cannot utilize Write-Host (Azure Functions, for instance). Fall back to Write-Output
|
|
||||||
Write-Output "dotnet-install: $str"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Say-Verbose($str) {
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Write-Verbose "dotnet-install: $str"
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
# Some platforms cannot utilize Write-Verbose (Azure Functions, for instance). Fall back to Write-Output
|
|
||||||
Write-Output "dotnet-install: $str"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Say-Invocation($Invocation) {
|
|
||||||
$command = $Invocation.MyCommand;
|
|
||||||
$args = (($Invocation.BoundParameters.Keys | foreach { "-$_ `"$($Invocation.BoundParameters[$_])`"" }) -join " ")
|
|
||||||
Say-Verbose "$command $args"
|
|
||||||
}
|
|
||||||
|
|
||||||
function Invoke-With-Retry([ScriptBlock]$ScriptBlock, [int]$MaxAttempts = 3, [int]$SecondsBetweenAttempts = 1) {
|
|
||||||
$Attempts = 0
|
|
||||||
|
|
||||||
while ($true) {
|
|
||||||
try {
|
|
||||||
return $ScriptBlock.Invoke()
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
$Attempts++
|
|
||||||
if ($Attempts -lt $MaxAttempts) {
|
|
||||||
Start-Sleep $SecondsBetweenAttempts
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-Machine-Architecture() {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
# On PS x86, PROCESSOR_ARCHITECTURE reports x86 even on x64 systems.
|
|
||||||
# To get the correct architecture, we need to use PROCESSOR_ARCHITEW6432.
|
|
||||||
# PS x64 doesn't define this, so we fall back to PROCESSOR_ARCHITECTURE.
|
|
||||||
# Possible values: amd64, x64, x86, arm64, arm
|
|
||||||
|
|
||||||
if( $ENV:PROCESSOR_ARCHITEW6432 -ne $null )
|
|
||||||
{
|
|
||||||
return $ENV:PROCESSOR_ARCHITEW6432
|
|
||||||
}
|
|
||||||
|
|
||||||
return $ENV:PROCESSOR_ARCHITECTURE
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-CLIArchitecture-From-Architecture([string]$Architecture) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
switch ($Architecture.ToLower()) {
|
|
||||||
{ $_ -eq "<auto>" } { return Get-CLIArchitecture-From-Architecture $(Get-Machine-Architecture) }
|
|
||||||
{ ($_ -eq "amd64") -or ($_ -eq "x64") } { return "x64" }
|
|
||||||
{ $_ -eq "x86" } { return "x86" }
|
|
||||||
{ $_ -eq "arm" } { return "arm" }
|
|
||||||
{ $_ -eq "arm64" } { return "arm64" }
|
|
||||||
default { throw "Architecture not supported. If you think this is a bug, report it at https://github.com/dotnet/sdk/issues" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# The version text returned from the feeds is a 1-line or 2-line string:
|
|
||||||
# For the SDK and the dotnet runtime (2 lines):
|
|
||||||
# Line 1: # commit_hash
|
|
||||||
# Line 2: # 4-part version
|
|
||||||
# For the aspnetcore runtime (1 line):
|
|
||||||
# Line 1: # 4-part version
|
|
||||||
function Get-Version-Info-From-Version-Text([string]$VersionText) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
$Data = -split $VersionText
|
|
||||||
|
|
||||||
$VersionInfo = @{
|
|
||||||
CommitHash = $(if ($Data.Count -gt 1) { $Data[0] })
|
|
||||||
Version = $Data[-1] # last line is always the version number.
|
|
||||||
}
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
Invoke-With-Retry(
|
|
||||||
{
|
|
||||||
|
|
||||||
$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(-not $ProxyAddress) {
|
|
||||||
try {
|
|
||||||
# Despite no proxy being explicitly specified, we may still be behind a default proxy
|
|
||||||
$DefaultProxy = [System.Net.WebRequest]::DefaultWebProxy;
|
|
||||||
if($DefaultProxy -and (-not $DefaultProxy.IsBypassed($Uri))) {
|
|
||||||
$ProxyAddress = $DefaultProxy.GetProxy($Uri).OriginalString
|
|
||||||
$ProxyUseDefaultCredentials = $true
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
# Eat the exception and move forward as the above code is an attempt
|
|
||||||
# at resolving the DefaultProxy that may not have been a problem.
|
|
||||||
$ProxyAddress = $null
|
|
||||||
Say-Verbose("Exception ignored: $_.Exception.Message - moving forward...")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($ProxyAddress) {
|
|
||||||
$HttpClientHandler = New-Object System.Net.Http.HttpClientHandler
|
|
||||||
$HttpClientHandler.Proxy = New-Object System.Net.WebProxy -Property @{
|
|
||||||
Address=$ProxyAddress;
|
|
||||||
UseDefaultCredentials=$ProxyUseDefaultCredentials;
|
|
||||||
BypassList = $ProxyBypassList;
|
|
||||||
}
|
|
||||||
$HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
$HttpClient = New-Object System.Net.Http.HttpClient
|
|
||||||
}
|
|
||||||
# Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out
|
|
||||||
# 20 minutes allows it to work over much slower connections.
|
|
||||||
$HttpClient.Timeout = New-TimeSpan -Minutes 20
|
|
||||||
$Response = $HttpClient.GetAsync("${Uri}${FeedCredential}").Result
|
|
||||||
if (($Response -eq $null) -or (-not ($Response.IsSuccessStatusCode))) {
|
|
||||||
# The feed credential is potentially sensitive info. Do not log FeedCredential to console output.
|
|
||||||
$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]$Channel, [bool]$Coherent) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
$VersionFileUrl = $null
|
|
||||||
if ($Runtime -eq "dotnet") {
|
|
||||||
$VersionFileUrl = "$UncachedFeed/Runtime/$Channel/latest.version"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "aspnetcore") {
|
|
||||||
$VersionFileUrl = "$UncachedFeed/aspnetcore/Runtime/$Channel/latest.version"
|
|
||||||
}
|
|
||||||
# Currently, the WindowsDesktop runtime is manufactured with the .Net core runtime
|
|
||||||
elseif ($Runtime -eq "windowsdesktop") {
|
|
||||||
$VersionFileUrl = "$UncachedFeed/Runtime/$Channel/latest.version"
|
|
||||||
}
|
|
||||||
elseif (-not $Runtime) {
|
|
||||||
if ($Coherent) {
|
|
||||||
$VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.coherent.version"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.version"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Invalid value for `$Runtime"
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$Response = GetHTTPResponse -Uri $VersionFileUrl
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw "Could not resolve version information."
|
|
||||||
}
|
|
||||||
$StringContent = $Response.Content.ReadAsStringAsync().Result
|
|
||||||
|
|
||||||
switch ($Response.Content.Headers.ContentType) {
|
|
||||||
{ ($_ -eq "application/octet-stream") } { $VersionText = $StringContent }
|
|
||||||
{ ($_ -eq "text/plain") } { $VersionText = $StringContent }
|
|
||||||
{ ($_ -eq "text/plain; charset=UTF-8") } { $VersionText = $StringContent }
|
|
||||||
default { throw "``$Response.Content.Headers.ContentType`` is an unknown .version file content type." }
|
|
||||||
}
|
|
||||||
|
|
||||||
$VersionInfo = Get-Version-Info-From-Version-Text $VersionText
|
|
||||||
|
|
||||||
return $VersionInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
function Parse-Jsonfile-For-Version([string]$JSonFile) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
If (-Not (Test-Path $JSonFile)) {
|
|
||||||
throw "Unable to find '$JSonFile'"
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$JSonContent = Get-Content($JSonFile) -Raw | ConvertFrom-Json | Select-Object -expand "sdk" -ErrorAction SilentlyContinue
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw "Json file unreadable: '$JSonFile'"
|
|
||||||
}
|
|
||||||
if ($JSonContent) {
|
|
||||||
try {
|
|
||||||
$JSonContent.PSObject.Properties | ForEach-Object {
|
|
||||||
$PropertyName = $_.Name
|
|
||||||
if ($PropertyName -eq "version") {
|
|
||||||
$Version = $_.Value
|
|
||||||
Say-Verbose "Version = $Version"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw "Unable to parse the SDK node in '$JSonFile'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Unable to find the SDK node in '$JSonFile'"
|
|
||||||
}
|
|
||||||
If ($Version -eq $null) {
|
|
||||||
throw "Unable to find the SDK:version node in '$JSonFile'"
|
|
||||||
}
|
|
||||||
return $Version
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-Specific-Version-From-Version([string]$AzureFeed, [string]$Channel, [string]$Version, [string]$JSonFile) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
if (-not $JSonFile) {
|
|
||||||
switch ($Version.ToLower()) {
|
|
||||||
{ $_ -eq "latest" } {
|
|
||||||
$LatestVersionInfo = Get-Latest-Version-Info -AzureFeed $AzureFeed -Channel $Channel -Coherent $False
|
|
||||||
return $LatestVersionInfo.Version
|
|
||||||
}
|
|
||||||
{ $_ -eq "coherent" } {
|
|
||||||
$LatestVersionInfo = Get-Latest-Version-Info -AzureFeed $AzureFeed -Channel $Channel -Coherent $True
|
|
||||||
return $LatestVersionInfo.Version
|
|
||||||
}
|
|
||||||
default { return $Version }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Parse-Jsonfile-For-Version $JSonFile
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-Download-Link([string]$AzureFeed, [string]$SpecificVersion, [string]$CLIArchitecture) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
# If anything fails in this lookup it will default to $SpecificVersion
|
|
||||||
$SpecificProductVersion = Get-Product-Version -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion
|
|
||||||
|
|
||||||
if ($Runtime -eq "dotnet") {
|
|
||||||
$PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/dotnet-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "aspnetcore") {
|
|
||||||
$PayloadURL = "$AzureFeed/aspnetcore/Runtime/$SpecificVersion/aspnetcore-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "windowsdesktop") {
|
|
||||||
$PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/windowsdesktop-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
|
||||||
}
|
|
||||||
elseif (-not $Runtime) {
|
|
||||||
$PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-sdk-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Invalid value for `$Runtime"
|
|
||||||
}
|
|
||||||
|
|
||||||
Say-Verbose "Constructed primary named payload URL: $PayloadURL"
|
|
||||||
|
|
||||||
return $PayloadURL, $SpecificProductVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-LegacyDownload-Link([string]$AzureFeed, [string]$SpecificVersion, [string]$CLIArchitecture) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
if (-not $Runtime) {
|
|
||||||
$PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-dev-win-$CLIArchitecture.$SpecificVersion.zip"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "dotnet") {
|
|
||||||
$PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/dotnet-win-$CLIArchitecture.$SpecificVersion.zip"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
|
|
||||||
Say-Verbose "Constructed legacy named payload URL: $PayloadURL"
|
|
||||||
|
|
||||||
return $PayloadURL
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-Product-Version([string]$AzureFeed, [string]$SpecificVersion) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
if ($Runtime -eq "dotnet") {
|
|
||||||
$ProductVersionTxtURL = "$AzureFeed/Runtime/$SpecificVersion/productVersion.txt"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "aspnetcore") {
|
|
||||||
$ProductVersionTxtURL = "$AzureFeed/aspnetcore/Runtime/$SpecificVersion/productVersion.txt"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "windowsdesktop") {
|
|
||||||
$ProductVersionTxtURL = "$AzureFeed/Runtime/$SpecificVersion/productVersion.txt"
|
|
||||||
}
|
|
||||||
elseif (-not $Runtime) {
|
|
||||||
$ProductVersionTxtURL = "$AzureFeed/Sdk/$SpecificVersion/productVersion.txt"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Invalid value specified for `$Runtime"
|
|
||||||
}
|
|
||||||
|
|
||||||
Say-Verbose "Checking for existence of $ProductVersionTxtURL"
|
|
||||||
|
|
||||||
try {
|
|
||||||
$productVersionResponse = GetHTTPResponse($productVersionTxtUrl)
|
|
||||||
|
|
||||||
if ($productVersionResponse.StatusCode -eq 200) {
|
|
||||||
$productVersion = $productVersionResponse.Content.ReadAsStringAsync().Result.Trim()
|
|
||||||
if ($productVersion -ne $SpecificVersion)
|
|
||||||
{
|
|
||||||
Say "Using alternate version $productVersion found in $ProductVersionTxtURL"
|
|
||||||
}
|
|
||||||
|
|
||||||
return $productVersion
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Say-Verbose "Got StatusCode $($productVersionResponse.StatusCode) trying to get productVersion.txt at $productVersionTxtUrl, so using default value of $SpecificVersion"
|
|
||||||
$productVersion = $SpecificVersion
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
Say-Verbose "Could not read productVersion.txt at $productVersionTxtUrl, so using default value of $SpecificVersion"
|
|
||||||
$productVersion = $SpecificVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
return $productVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-User-Share-Path() {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
$InstallRoot = $env:DOTNET_INSTALL_DIR
|
|
||||||
if (!$InstallRoot) {
|
|
||||||
$InstallRoot = "$env:LocalAppData\Microsoft\dotnet"
|
|
||||||
}
|
|
||||||
return $InstallRoot
|
|
||||||
}
|
|
||||||
|
|
||||||
function Resolve-Installation-Path([string]$InstallDir) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
if ($InstallDir -eq "<auto>") {
|
|
||||||
return Get-User-Share-Path
|
|
||||||
}
|
|
||||||
return $InstallDir
|
|
||||||
}
|
|
||||||
|
|
||||||
function Is-Dotnet-Package-Installed([string]$InstallRoot, [string]$RelativePathToPackage, [string]$SpecificVersion) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
$DotnetPackagePath = Join-Path -Path $InstallRoot -ChildPath $RelativePathToPackage | Join-Path -ChildPath $SpecificVersion
|
|
||||||
Say-Verbose "Is-Dotnet-Package-Installed: DotnetPackagePath=$DotnetPackagePath"
|
|
||||||
return Test-Path $DotnetPackagePath -PathType Container
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-Absolute-Path([string]$RelativeOrAbsolutePath) {
|
|
||||||
# Too much spam
|
|
||||||
# Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
return $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($RelativeOrAbsolutePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-Path-Prefix-With-Version($path) {
|
|
||||||
$match = [regex]::match($path, $VersionRegEx)
|
|
||||||
if ($match.Success) {
|
|
||||||
return $entry.FullName.Substring(0, $match.Index + $match.Length)
|
|
||||||
}
|
|
||||||
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package([System.IO.Compression.ZipArchive]$Zip, [string]$OutPath) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
$ret = @()
|
|
||||||
foreach ($entry in $Zip.Entries) {
|
|
||||||
$dir = Get-Path-Prefix-With-Version $entry.FullName
|
|
||||||
if ($dir -ne $null) {
|
|
||||||
$path = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $dir)
|
|
||||||
if (-Not (Test-Path $path -PathType Container)) {
|
|
||||||
$ret += $dir
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ret = $ret | Sort-Object | Get-Unique
|
|
||||||
|
|
||||||
$values = ($ret | foreach { "$_" }) -join ";"
|
|
||||||
Say-Verbose "Directories to unpack: $values"
|
|
||||||
|
|
||||||
return $ret
|
|
||||||
}
|
|
||||||
|
|
||||||
# Example zip content and extraction algorithm:
|
|
||||||
# Rule: files if extracted are always being extracted to the same relative path locally
|
|
||||||
# .\
|
|
||||||
# a.exe # file does not exist locally, extract
|
|
||||||
# b.dll # file exists locally, override only if $OverrideFiles set
|
|
||||||
# aaa\ # same rules as for files
|
|
||||||
# ...
|
|
||||||
# abc\1.0.0\ # directory contains version and exists locally
|
|
||||||
# ... # do not extract content under versioned part
|
|
||||||
# abc\asd\ # same rules as for files
|
|
||||||
# ...
|
|
||||||
# def\ghi\1.0.1\ # directory contains version and does not exist locally
|
|
||||||
# ... # extract content
|
|
||||||
function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
|
|
||||||
Say-Invocation $MyInvocation
|
|
||||||
|
|
||||||
Load-Assembly -Assembly System.IO.Compression.FileSystem
|
|
||||||
Set-Variable -Name Zip
|
|
||||||
try {
|
|
||||||
$Zip = [System.IO.Compression.ZipFile]::OpenRead($ZipPath)
|
|
||||||
|
|
||||||
$DirectoriesToUnpack = Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package -Zip $Zip -OutPath $OutPath
|
|
||||||
|
|
||||||
foreach ($entry in $Zip.Entries) {
|
|
||||||
$PathWithVersion = Get-Path-Prefix-With-Version $entry.FullName
|
|
||||||
if (($PathWithVersion -eq $null) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) {
|
|
||||||
$DestinationPath = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $entry.FullName)
|
|
||||||
$DestinationDir = Split-Path -Parent $DestinationPath
|
|
||||||
$OverrideFiles=$OverrideNonVersionedFiles -Or (-Not (Test-Path $DestinationPath))
|
|
||||||
if ((-Not $DestinationPath.EndsWith("\")) -And $OverrideFiles) {
|
|
||||||
New-Item -ItemType Directory -Force -Path $DestinationDir | Out-Null
|
|
||||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $DestinationPath, $OverrideNonVersionedFiles)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ($Zip -ne $null) {
|
|
||||||
$Zip.Dispose()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function DownloadFile($Source, [string]$OutPath) {
|
|
||||||
if ($Source -notlike "http*") {
|
|
||||||
# Using System.IO.Path.GetFullPath to get the current directory
|
|
||||||
# does not work in this context - $pwd gives the current directory
|
|
||||||
if (![System.IO.Path]::IsPathRooted($Source)) {
|
|
||||||
$Source = $(Join-Path -Path $pwd -ChildPath $Source)
|
|
||||||
}
|
|
||||||
$Source = Get-Absolute-Path $Source
|
|
||||||
Say "Copying file from $Source to $OutPath"
|
|
||||||
Copy-Item $Source $OutPath
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$Stream = $null
|
|
||||||
|
|
||||||
try {
|
|
||||||
$Response = GetHTTPResponse -Uri $Source
|
|
||||||
$Stream = $Response.Content.ReadAsStreamAsync().Result
|
|
||||||
$File = [System.IO.File]::Create($OutPath)
|
|
||||||
$Stream.CopyTo($File)
|
|
||||||
$File.Close()
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ($Stream -ne $null) {
|
|
||||||
$Stream.Dispose()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot, [string]$BinFolderRelativePath) {
|
|
||||||
$BinPath = Get-Absolute-Path $(Join-Path -Path $InstallRoot -ChildPath $BinFolderRelativePath)
|
|
||||||
if (-Not $NoPath) {
|
|
||||||
$SuffixedBinPath = "$BinPath;"
|
|
||||||
if (-Not $env:path.Contains($SuffixedBinPath)) {
|
|
||||||
Say "Adding to current process PATH: `"$BinPath`". Note: This change will not be visible if PowerShell was run as a child process."
|
|
||||||
$env:path = $SuffixedBinPath + $env:path
|
|
||||||
} else {
|
|
||||||
Say-Verbose "Current process PATH already contains `"$BinPath`""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Say "Binaries of dotnet can be found in $BinPath"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture
|
|
||||||
$SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $AzureFeed -Channel $Channel -Version $Version -JSonFile $JSonFile
|
|
||||||
$DownloadLink, $EffectiveVersion = Get-Download-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
|
|
||||||
$LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
|
|
||||||
|
|
||||||
$InstallRoot = Resolve-Installation-Path $InstallDir
|
|
||||||
Say-Verbose "InstallRoot: $InstallRoot"
|
|
||||||
$ScriptName = $MyInvocation.MyCommand.Name
|
|
||||||
|
|
||||||
if ($DryRun) {
|
|
||||||
Say "Payload URLs:"
|
|
||||||
Say "Primary named payload URL: $DownloadLink"
|
|
||||||
if ($LegacyDownloadLink) {
|
|
||||||
Say "Legacy named payload URL: $LegacyDownloadLink"
|
|
||||||
}
|
|
||||||
$RepeatableCommand = ".\$ScriptName -Version `"$SpecificVersion`" -InstallDir `"$InstallRoot`" -Architecture `"$CLIArchitecture`""
|
|
||||||
if ($Runtime -eq "dotnet") {
|
|
||||||
$RepeatableCommand+=" -Runtime `"dotnet`""
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "aspnetcore") {
|
|
||||||
$RepeatableCommand+=" -Runtime `"aspnetcore`""
|
|
||||||
}
|
|
||||||
foreach ($key in $MyInvocation.BoundParameters.Keys) {
|
|
||||||
if (-not (@("Architecture","Channel","DryRun","InstallDir","Runtime","SharedRuntime","Version") -contains $key)) {
|
|
||||||
$RepeatableCommand+=" -$key `"$($MyInvocation.BoundParameters[$key])`""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Say "Repeatable invocation: $RepeatableCommand"
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Runtime -eq "dotnet") {
|
|
||||||
$assetName = ".NET Core Runtime"
|
|
||||||
$dotnetPackageRelativePath = "shared\Microsoft.NETCore.App"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "aspnetcore") {
|
|
||||||
$assetName = "ASP.NET Core Runtime"
|
|
||||||
$dotnetPackageRelativePath = "shared\Microsoft.AspNetCore.App"
|
|
||||||
}
|
|
||||||
elseif ($Runtime -eq "windowsdesktop") {
|
|
||||||
$assetName = ".NET Core Windows Desktop Runtime"
|
|
||||||
$dotnetPackageRelativePath = "shared\Microsoft.WindowsDesktop.App"
|
|
||||||
}
|
|
||||||
elseif (-not $Runtime) {
|
|
||||||
$assetName = ".NET Core SDK"
|
|
||||||
$dotnetPackageRelativePath = "sdk"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Invalid value for `$Runtime"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($SpecificVersion -ne $EffectiveVersion)
|
|
||||||
{
|
|
||||||
Say "Performing installation checks for effective version: $EffectiveVersion"
|
|
||||||
$SpecificVersion = $EffectiveVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if the SDK version is already installed.
|
|
||||||
$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
|
|
||||||
if ($isAssetInstalled) {
|
|
||||||
Say "$assetName version $SpecificVersion is already installed."
|
|
||||||
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null
|
|
||||||
|
|
||||||
$installDrive = $((Get-Item $InstallRoot).PSDrive.Name);
|
|
||||||
$diskInfo = Get-PSDrive -Name $installDrive
|
|
||||||
if ($diskInfo.Free / 1MB -le 100) {
|
|
||||||
Say "There is not enough disk space on drive ${installDrive}:"
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
$ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
|
|
||||||
Say-Verbose "Zip path: $ZipPath"
|
|
||||||
|
|
||||||
$DownloadFailed = $false
|
|
||||||
Say "Downloading link: $DownloadLink"
|
|
||||||
try {
|
|
||||||
DownloadFile -Source $DownloadLink -OutPath $ZipPath
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Say "Cannot download: $DownloadLink"
|
|
||||||
if ($LegacyDownloadLink) {
|
|
||||||
$DownloadLink = $LegacyDownloadLink
|
|
||||||
$ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
|
|
||||||
Say-Verbose "Legacy zip path: $ZipPath"
|
|
||||||
Say "Downloading legacy link: $DownloadLink"
|
|
||||||
try {
|
|
||||||
DownloadFile -Source $DownloadLink -OutPath $ZipPath
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Say "Cannot download: $DownloadLink"
|
|
||||||
$DownloadFailed = $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$DownloadFailed = $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($DownloadFailed) {
|
|
||||||
throw "Could not find/download: `"$assetName`" with version = $SpecificVersion`nRefer to: https://aka.ms/dotnet-os-lifecycle for information on .NET Core support"
|
|
||||||
}
|
|
||||||
|
|
||||||
Say "Extracting zip from $DownloadLink"
|
|
||||||
Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot
|
|
||||||
|
|
||||||
# Check if the SDK version is installed; if not, fail the installation.
|
|
||||||
$isAssetInstalled = $false
|
|
||||||
|
|
||||||
# if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed.
|
|
||||||
if ($SpecificVersion -Match "rtm" -or $SpecificVersion -Match "servicing") {
|
|
||||||
$ReleaseVersion = $SpecificVersion.Split("-")[0]
|
|
||||||
Say-Verbose "Checking installation: version = $ReleaseVersion"
|
|
||||||
$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $ReleaseVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if the SDK version is installed.
|
|
||||||
if (!$isAssetInstalled) {
|
|
||||||
Say-Verbose "Checking installation: version = $SpecificVersion"
|
|
||||||
$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$isAssetInstalled) {
|
|
||||||
throw "`"$assetName`" with version = $SpecificVersion failed to install with an unknown error."
|
|
||||||
}
|
|
||||||
|
|
||||||
Remove-Item $ZipPath
|
|
||||||
|
|
||||||
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath
|
|
||||||
|
|
||||||
Say "Installation finished"
|
|
||||||
exit 0
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -57,15 +57,11 @@ set-strictmode -version 2.0
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
|
|
||||||
# If specified, provides an alternate path for getting .NET Core SDKs and Runtimes. This script will still try public sources first.
|
# If specifies, provides an alternate path for getting .NET Core SDKs and Runtimes. This script will still try public sources first.
|
||||||
[string]$runtimeSourceFeed = if (Test-Path variable:runtimeSourceFeed) { $runtimeSourceFeed } else { $null }
|
[string]$runtimeSourceFeed = if (Test-Path variable:runtimeSourceFeed) { $runtimeSourceFeed } else { $null }
|
||||||
# Base-64 encoded SAS token that has permission to storage container described by $runtimeSourceFeed
|
# Base-64 encoded SAS token that has permission to storage container described by $runtimeSourceFeed
|
||||||
[string]$runtimeSourceFeedKey = if (Test-Path variable:runtimeSourceFeedKey) { $runtimeSourceFeedKey } else { $null }
|
[string]$runtimeSourceFeedKey = if (Test-Path variable:runtimeSourceFeedKey) { $runtimeSourceFeedKey } else { $null }
|
||||||
|
|
||||||
# If false, use copy of dotnet-install from /eng/common/dotnet-install-scripts (for custom behaviors).
|
|
||||||
# otherwise will fetch from public location.
|
|
||||||
[bool]$useDefaultDotnetInstall = if (Test-Path variable:useDefaultDotnetInstall) { $useDefaultDotnetInstall } else { $false }
|
|
||||||
|
|
||||||
function Create-Directory ([string[]] $path) {
|
function Create-Directory ([string[]] $path) {
|
||||||
New-Item -Path $path -Force -ItemType 'Directory' | Out-Null
|
New-Item -Path $path -Force -ItemType 'Directory' | Out-Null
|
||||||
}
|
}
|
||||||
|
@ -197,46 +193,37 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) {
|
||||||
function GetDotNetInstallScript([string] $dotnetRoot) {
|
function GetDotNetInstallScript([string] $dotnetRoot) {
|
||||||
$installScript = Join-Path $dotnetRoot 'dotnet-install.ps1'
|
$installScript = Join-Path $dotnetRoot 'dotnet-install.ps1'
|
||||||
if (!(Test-Path $installScript)) {
|
if (!(Test-Path $installScript)) {
|
||||||
create-directory $dotnetroot
|
Create-Directory $dotnetRoot
|
||||||
|
$ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit
|
||||||
|
|
||||||
if ($useDefaultDotnetInstall)
|
$maxRetries = 5
|
||||||
{
|
$retries = 1
|
||||||
$progresspreference = 'silentlycontinue' # don't display the console progress ui - it's a huge perf hit
|
|
||||||
|
|
||||||
$maxretries = 5
|
$uri = "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1"
|
||||||
$retries = 1
|
|
||||||
|
|
||||||
$uri = "https://dot.net/$dotnetinstallscriptversion/dotnet-install.ps1"
|
while($true) {
|
||||||
|
try {
|
||||||
while($true) {
|
Write-Host "GET $uri"
|
||||||
try {
|
Invoke-WebRequest $uri -OutFile $installScript
|
||||||
write-host "get $uri"
|
break
|
||||||
invoke-webrequest $uri -outfile $installscript
|
|
||||||
break
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
write-host "failed to download '$uri'"
|
|
||||||
write-error $_.exception.message -erroraction continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (++$retries -le $maxretries) {
|
|
||||||
$delayinseconds = [math]::pow(2, $retries) - 1 # exponential backoff
|
|
||||||
write-host "retrying. waiting for $delayinseconds seconds before next attempt ($retries of $maxretries)."
|
|
||||||
start-sleep -seconds $delayinseconds
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "unable to download file in $maxretries attempts."
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
catch {
|
||||||
else
|
Write-Host "Failed to download '$uri'"
|
||||||
{
|
Write-Error $_.Exception.Message -ErrorAction Continue
|
||||||
# Use a special version of the script from eng/common that understands the existence of a "productVersion.txt" in a dotnet path.
|
}
|
||||||
# See https://github.com/dotnet/arcade/issues/6047 for details
|
|
||||||
$engCommonCopy = Resolve-Path (Join-Path $PSScriptRoot 'dotnet-install-scripts\dotnet-install.ps1')
|
if (++$retries -le $maxRetries) {
|
||||||
Copy-Item $engCommonCopy -Destination $installScript -Force
|
$delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff
|
||||||
|
Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)."
|
||||||
|
Start-Sleep -Seconds $delayInSeconds
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw "Unable to download file in $maxRetries attempts."
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $installScript
|
return $installScript
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,10 +68,6 @@ fi
|
||||||
runtime_source_feed=${runtime_source_feed:-''}
|
runtime_source_feed=${runtime_source_feed:-''}
|
||||||
runtime_source_feed_key=${runtime_source_feed_key:-''}
|
runtime_source_feed_key=${runtime_source_feed_key:-''}
|
||||||
|
|
||||||
# Determines if dotnet-install.sh comes from the eng/common folder or the internet
|
|
||||||
# (default = public version)
|
|
||||||
use_default_dotnet_install=${use_default_dotnet_install:-false}
|
|
||||||
|
|
||||||
# Resolve any symlinks in the given path.
|
# Resolve any symlinks in the given path.
|
||||||
function ResolvePath {
|
function ResolvePath {
|
||||||
local path=$1
|
local path=$1
|
||||||
|
@ -271,30 +267,23 @@ function GetDotNetInstallScript {
|
||||||
if [[ ! -a "$install_script" ]]; then
|
if [[ ! -a "$install_script" ]]; then
|
||||||
mkdir -p "$root"
|
mkdir -p "$root"
|
||||||
|
|
||||||
if [[ "$use_default_dotnet_install" == true ]]; then
|
echo "Downloading '$install_script_url'"
|
||||||
echo "Downloading '$install_script_url'"
|
|
||||||
|
|
||||||
# Use curl if available, otherwise use wget
|
# Use curl if available, otherwise use wget
|
||||||
if command -v curl > /dev/null; then
|
if command -v curl > /dev/null; then
|
||||||
with_retries curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || {
|
with_retries curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || {
|
||||||
local exit_code=$?
|
local exit_code=$?
|
||||||
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
|
||||||
ExitWithExitCode $exit_code
|
ExitWithExitCode $exit_code
|
||||||
}
|
}
|
||||||
else
|
|
||||||
with_retries wget -v -O "$install_script" "$install_script_url" || {
|
|
||||||
local exit_code=$?
|
|
||||||
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
|
|
||||||
ExitWithExitCode $exit_code
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
# Use a special version of the script from eng/common that understands the existence of a "productVersion.txt" in a dotnet path.
|
with_retries wget -v -O "$install_script" "$install_script_url" || {
|
||||||
# See https://github.com/dotnet/arcade/issues/6047 for details
|
local exit_code=$?
|
||||||
cp $repo_root/eng/common/dotnet-install-scripts/dotnet-install.sh $install_script
|
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
|
||||||
|
ExitWithExitCode $exit_code
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# return value
|
# return value
|
||||||
_GetDotNetInstallScript="$install_script"
|
_GetDotNetInstallScript="$install_script"
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"msbuild-sdks": {
|
"msbuild-sdks": {
|
||||||
"Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.20525.1",
|
"Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.20526.10",
|
||||||
"Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.20525.1"
|
"Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.20526.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче