You've already forked setup-dotnet
mirror of
https://github.com/actions/setup-dotnet.git
synced 2025-07-11 01:20:33 +07:00
Compare commits
11 Commits
v2.0.0
...
add-publis
Author | SHA1 | Date | |
---|---|---|---|
27dbb7f407 | |||
9c99f11032 | |||
871f041373 | |||
67cd79ce76 | |||
b3da5ab48f | |||
65c71668de | |||
f2d774a272 | |||
8f3cbf74e2 | |||
e31c9045e5 | |||
0d16f91084 | |||
71a4fd9b27 |
6
.github/workflows/check-dist.yml
vendored
6
.github/workflows/check-dist.yml
vendored
@ -23,10 +23,10 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set Node.js 16
|
- name: Set Node.js 12.x
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: 16.x
|
node-version: 12.x
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
@ -44,7 +44,7 @@ jobs:
|
|||||||
id: diff
|
id: diff
|
||||||
|
|
||||||
# If index.js was different than expected, upload the expected version as an artifact
|
# If index.js was different than expected, upload the expected version as an artifact
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v4
|
||||||
if: ${{ failure() && steps.diff.conclusion == 'failure' }}
|
if: ${{ failure() && steps.diff.conclusion == 'failure' }}
|
||||||
with:
|
with:
|
||||||
name: dist
|
name: dist
|
||||||
|
2
.github/workflows/licensed.yml
vendored
2
.github/workflows/licensed.yml
vendored
@ -19,7 +19,7 @@ jobs:
|
|||||||
- name: Install licensed
|
- name: Install licensed
|
||||||
run: |
|
run: |
|
||||||
cd $RUNNER_TEMP
|
cd $RUNNER_TEMP
|
||||||
curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.4.4/licensed-3.4.4-linux-x64.tar.gz
|
curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.3.1/licensed-3.3.1-linux-x64.tar.gz
|
||||||
sudo tar -xzf licensed.tar.gz
|
sudo tar -xzf licensed.tar.gz
|
||||||
sudo mv licensed /usr/local/bin/licensed
|
sudo mv licensed /usr/local/bin/licensed
|
||||||
- run: licensed status
|
- run: licensed status
|
||||||
|
20
.github/workflows/publish-immutable-action.yml
vendored
Normal file
20
.github/workflows/publish-immutable-action.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: 'Publish Immutable Action Version'
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checking out
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Publish
|
||||||
|
id: publish
|
||||||
|
uses: actions/publish-immutable-action@v0.0.4
|
2
.github/workflows/test-dotnet.yml
vendored
2
.github/workflows/test-dotnet.yml
vendored
@ -17,7 +17,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0']
|
dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0']
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
31
.github/workflows/workflow.yml
vendored
31
.github/workflows/workflow.yml
vendored
@ -17,15 +17,14 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Set Node.js 16
|
- name: Set Node.js 12
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: 16.x
|
node-version: 12.x
|
||||||
cache: npm
|
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
- run: npm run format-check
|
- run: npm run format-check
|
||||||
@ -39,7 +38,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@ -62,7 +61,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@ -95,7 +94,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@ -120,7 +119,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@ -144,7 +143,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@ -164,18 +163,20 @@ jobs:
|
|||||||
run: __tests__/verify-dotnet.ps1 3.1 2.2
|
run: __tests__/verify-dotnet.ps1 3.1 2.2
|
||||||
|
|
||||||
test-proxy:
|
test-proxy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
container:
|
container:
|
||||||
image: mcr.microsoft.com/dotnet/core/runtime-deps:3.0-bionic
|
image: ubuntu:22.04
|
||||||
options: --dns 127.0.0.1
|
options: --dns 127.0.0.1
|
||||||
services:
|
services:
|
||||||
squid-proxy:
|
squid-proxy:
|
||||||
image: datadog/squid:latest
|
image: ubuntu/squid:latest
|
||||||
ports:
|
ports:
|
||||||
- 3128:3128
|
- 3128:3128
|
||||||
env:
|
env:
|
||||||
https_proxy: http://squid-proxy:3128
|
https_proxy: http://squid-proxy:3128
|
||||||
http_proxy: http://squid-proxy:3128
|
http_proxy: http://squid-proxy:3128
|
||||||
|
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: true
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@ -184,7 +185,7 @@ jobs:
|
|||||||
- name: Install curl
|
- name: Install curl
|
||||||
run: |
|
run: |
|
||||||
apt update
|
apt update
|
||||||
apt -y install curl
|
apt -y install curl libssl-dev
|
||||||
- name: Setup dotnet 3.1.201
|
- name: Setup dotnet 3.1.201
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
@ -196,10 +197,10 @@ jobs:
|
|||||||
run: __tests__/verify-dotnet.sh 3.1.201
|
run: __tests__/verify-dotnet.sh 3.1.201
|
||||||
|
|
||||||
test-bypass-proxy:
|
test-bypass-proxy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
https_proxy: http://no-such-proxy:3128
|
https_proxy: http://no-such-proxy:3128
|
||||||
no_proxy: github.com,dotnetcli.blob.core.windows.net,download.visualstudio.microsoft.com,api.nuget.org,dotnetcli.azureedge.net
|
no_proxy: github.com,download.visualstudio.microsoft.com,api.nuget.org,builds.dotnet.microsoft.com,ci.dot.net
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
2
.licenses/npm/node-fetch.dep.yml
generated
2
.licenses/npm/node-fetch.dep.yml
generated
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: node-fetch
|
name: node-fetch
|
||||||
version: 2.6.7
|
version: 2.6.1
|
||||||
type: npm
|
type: npm
|
||||||
summary: A light-weight module that brings window.fetch to node.js
|
summary: A light-weight module that brings window.fetch to node.js
|
||||||
homepage: https://github.com/bitinn/node-fetch
|
homepage: https://github.com/bitinn/node-fetch
|
||||||
|
30
.licenses/npm/tr46.dep.yml
generated
30
.licenses/npm/tr46.dep.yml
generated
@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
name: tr46
|
|
||||||
version: 0.0.3
|
|
||||||
type: npm
|
|
||||||
summary: An implementation of the Unicode TR46 spec
|
|
||||||
homepage: https://github.com/Sebmaster/tr46.js#readme
|
|
||||||
license: mit
|
|
||||||
licenses:
|
|
||||||
- sources: Auto-generated MIT license text
|
|
||||||
text: |
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
notices: []
|
|
23
.licenses/npm/webidl-conversions.dep.yml
generated
23
.licenses/npm/webidl-conversions.dep.yml
generated
@ -1,23 +0,0 @@
|
|||||||
---
|
|
||||||
name: webidl-conversions
|
|
||||||
version: 3.0.1
|
|
||||||
type: npm
|
|
||||||
summary: Implements the WebIDL algorithms for converting to and from JavaScript values
|
|
||||||
homepage:
|
|
||||||
license: bsd-2-clause
|
|
||||||
licenses:
|
|
||||||
- sources: LICENSE.md
|
|
||||||
text: |
|
|
||||||
# The BSD 2-Clause License
|
|
||||||
|
|
||||||
Copyright (c) 2014, Domenic Denicola
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
notices: []
|
|
32
.licenses/npm/whatwg-url.dep.yml
generated
32
.licenses/npm/whatwg-url.dep.yml
generated
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
name: whatwg-url
|
|
||||||
version: 5.0.0
|
|
||||||
type: npm
|
|
||||||
summary: An implementation of the WHATWG URL Standard's URL API and parsing machinery
|
|
||||||
homepage:
|
|
||||||
license: mit
|
|
||||||
licenses:
|
|
||||||
- sources: LICENSE.txt
|
|
||||||
text: |
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015–2016 Sebastian Mayr
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
notices: []
|
|
@ -17,5 +17,5 @@ inputs:
|
|||||||
description: 'Whether prerelease versions should be matched with non-exact versions (for example 5.0.0-preview.6 being matched by 5, 5.0, 5.x or 5.0.x). Defaults to false if not provided.'
|
description: 'Whether prerelease versions should be matched with non-exact versions (for example 5.0.0-preview.6 being matched by 5, 5.0, 5.x or 5.0.x). Defaults to false if not provided.'
|
||||||
required: False
|
required: False
|
||||||
runs:
|
runs:
|
||||||
using: 'node16'
|
using: 'node12'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
|
2254
dist/index.js
vendored
2254
dist/index.js
vendored
File diff suppressed because one or more lines are too long
3071
externals/install-dotnet.ps1
vendored
3071
externals/install-dotnet.ps1
vendored
File diff suppressed because it is too large
Load Diff
473
externals/install-dotnet.sh
vendored
473
externals/install-dotnet.sh
vendored
@ -298,14 +298,43 @@ get_machine_architecture() {
|
|||||||
if command -v uname > /dev/null; then
|
if command -v uname > /dev/null; then
|
||||||
CPUName=$(uname -m)
|
CPUName=$(uname -m)
|
||||||
case $CPUName in
|
case $CPUName in
|
||||||
|
armv1*|armv2*|armv3*|armv4*|armv5*|armv6*)
|
||||||
|
echo "armv6-or-below"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
armv*l)
|
armv*l)
|
||||||
echo "arm"
|
echo "arm"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
aarch64|arm64)
|
aarch64|arm64)
|
||||||
|
if [ "$(getconf LONG_BIT)" -lt 64 ]; then
|
||||||
|
# This is 32-bit OS running on 64-bit CPU (for example Raspberry Pi OS)
|
||||||
|
echo "arm"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
echo "arm64"
|
echo "arm64"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
s390x)
|
||||||
|
echo "s390x"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
ppc64le)
|
||||||
|
echo "ppc64le"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
loongarch64)
|
||||||
|
echo "loongarch64"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
riscv64)
|
||||||
|
echo "riscv64"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
powerpc|ppc)
|
||||||
|
echo "ppc"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -322,7 +351,13 @@ get_normalized_architecture_from_architecture() {
|
|||||||
local architecture="$(to_lowercase "$1")"
|
local architecture="$(to_lowercase "$1")"
|
||||||
|
|
||||||
if [[ $architecture == \<auto\> ]]; then
|
if [[ $architecture == \<auto\> ]]; then
|
||||||
echo "$(get_machine_architecture)"
|
machine_architecture="$(get_machine_architecture)"
|
||||||
|
if [[ "$machine_architecture" == "armv6-or-below" ]]; then
|
||||||
|
say_err "Architecture \`$machine_architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $machine_architecture
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -339,12 +374,72 @@ get_normalized_architecture_from_architecture() {
|
|||||||
echo "arm64"
|
echo "arm64"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
s390x)
|
||||||
|
echo "s390x"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
ppc64le)
|
||||||
|
echo "ppc64le"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
loongarch64)
|
||||||
|
echo "loongarch64"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
say_err "Architecture \`$architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues"
|
say_err "Architecture \`$architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# args:
|
||||||
|
# version - $1
|
||||||
|
# channel - $2
|
||||||
|
# architecture - $3
|
||||||
|
get_normalized_architecture_for_specific_sdk_version() {
|
||||||
|
eval $invocation
|
||||||
|
|
||||||
|
local is_version_support_arm64="$(is_arm64_supported "$1")"
|
||||||
|
local is_channel_support_arm64="$(is_arm64_supported "$2")"
|
||||||
|
local architecture="$3";
|
||||||
|
local osname="$(get_current_os_name)"
|
||||||
|
|
||||||
|
if [ "$osname" == "osx" ] && [ "$architecture" == "arm64" ] && { [ "$is_version_support_arm64" = false ] || [ "$is_channel_support_arm64" = false ]; }; then
|
||||||
|
#check if rosetta is installed
|
||||||
|
if [ "$(/usr/bin/pgrep oahd >/dev/null 2>&1;echo $?)" -eq 0 ]; then
|
||||||
|
say_verbose "Changing user architecture from '$architecture' to 'x64' because .NET SDKs prior to version 6.0 do not support arm64."
|
||||||
|
echo "x64"
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
say_err "Architecture \`$architecture\` is not supported for .NET SDK version \`$version\`. Please install Rosetta to allow emulation of the \`$architecture\` .NET SDK on this platform"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$architecture"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# args:
|
||||||
|
# version or channel - $1
|
||||||
|
is_arm64_supported() {
|
||||||
|
# Extract the major version by splitting on the dot
|
||||||
|
major_version="${1%%.*}"
|
||||||
|
|
||||||
|
# Check if the major version is a valid number and less than 6
|
||||||
|
case "$major_version" in
|
||||||
|
[0-9]*)
|
||||||
|
if [ "$major_version" -lt 6 ]; then
|
||||||
|
echo false
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo true
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# args:
|
# args:
|
||||||
# user_defined_os - $1
|
# user_defined_os - $1
|
||||||
get_normalized_os() {
|
get_normalized_os() {
|
||||||
@ -357,8 +452,13 @@ get_normalized_os() {
|
|||||||
echo "$osname"
|
echo "$osname"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
macos)
|
||||||
|
osname='osx'
|
||||||
|
echo "$osname"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
say_err "'$user_defined_os' is not a supported value for --os option, supported values are: osx, linux, linux-musl, freebsd, rhel.6. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues."
|
say_err "'$user_defined_os' is not a supported value for --os option, supported values are: osx, macos, linux, linux-musl, freebsd, rhel.6. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues."
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@ -401,6 +501,10 @@ get_normalized_channel() {
|
|||||||
|
|
||||||
local channel="$(to_lowercase "$1")"
|
local channel="$(to_lowercase "$1")"
|
||||||
|
|
||||||
|
if [[ $channel == current ]]; then
|
||||||
|
say_warning 'Value "Current" is deprecated for -Channel option. Use "STS" instead.'
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ $channel == release/* ]]; then
|
if [[ $channel == release/* ]]; then
|
||||||
say_warning 'Using branch name with -Channel option is no longer supported with newer releases. Use -Quality option with a channel in X.Y format instead.';
|
say_warning 'Using branch name with -Channel option is no longer supported with newer releases. Use -Quality option with a channel in X.Y format instead.';
|
||||||
fi
|
fi
|
||||||
@ -411,6 +515,14 @@ get_normalized_channel() {
|
|||||||
echo "LTS"
|
echo "LTS"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
sts)
|
||||||
|
echo "STS"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
current)
|
||||||
|
echo "STS"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "$channel"
|
echo "$channel"
|
||||||
return 0
|
return 0
|
||||||
@ -476,6 +588,40 @@ is_dotnet_package_installed() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# args:
|
||||||
|
# downloaded file - $1
|
||||||
|
# remote_file_size - $2
|
||||||
|
validate_remote_local_file_sizes()
|
||||||
|
{
|
||||||
|
eval $invocation
|
||||||
|
|
||||||
|
local downloaded_file="$1"
|
||||||
|
local remote_file_size="$2"
|
||||||
|
local file_size=''
|
||||||
|
|
||||||
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||||
|
file_size="$(stat -c '%s' "$downloaded_file")"
|
||||||
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
# hardcode in order to avoid conflicts with GNU stat
|
||||||
|
file_size="$(/usr/bin/stat -f '%z' "$downloaded_file")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$file_size" ]; then
|
||||||
|
say "Downloaded file size is $file_size bytes."
|
||||||
|
|
||||||
|
if [ -n "$remote_file_size" ] && [ -n "$file_size" ]; then
|
||||||
|
if [ "$remote_file_size" -ne "$file_size" ]; then
|
||||||
|
say "The remote and local file sizes are not equal. The remote file size is $remote_file_size bytes and the local size is $file_size bytes. The local package may be corrupted."
|
||||||
|
else
|
||||||
|
say "The remote and local file sizes are equal."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
say "Either downloaded or local package size can not be measured. One of them may be corrupted."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# args:
|
# args:
|
||||||
# azure_feed - $1
|
# azure_feed - $1
|
||||||
# channel - $2
|
# channel - $2
|
||||||
@ -515,7 +661,7 @@ parse_globaljson_file_for_version() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sdk_section=$(cat $json_file | awk '/"sdk"/,/}/')
|
sdk_section=$(cat $json_file | tr -d "\r" | awk '/"sdk"/,/}/')
|
||||||
if [ -z "$sdk_section" ]; then
|
if [ -z "$sdk_section" ]; then
|
||||||
say_err "Unable to parse the SDK node in \`$json_file\`"
|
say_err "Unable to parse the SDK node in \`$json_file\`"
|
||||||
return 1
|
return 1
|
||||||
@ -637,11 +783,13 @@ get_specific_product_version() {
|
|||||||
|
|
||||||
if machine_has "curl"
|
if machine_has "curl"
|
||||||
then
|
then
|
||||||
specific_product_version=$(curl -s --fail "${download_link}${feed_credential}" 2>&1)
|
if ! specific_product_version=$(curl -s --fail "${download_link}${feed_credential}" 2>&1); then
|
||||||
if [ $? = 0 ]; then
|
continue
|
||||||
|
else
|
||||||
echo "${specific_product_version//[$'\t\r\n']}"
|
echo "${specific_product_version//[$'\t\r\n']}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
elif machine_has "wget"
|
elif machine_has "wget"
|
||||||
then
|
then
|
||||||
specific_product_version=$(wget -qO- "${download_link}${feed_credential}" 2>&1)
|
specific_product_version=$(wget -qO- "${download_link}${feed_credential}" 2>&1)
|
||||||
@ -808,6 +956,37 @@ get_absolute_path() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# args:
|
||||||
|
# override - $1 (boolean, true or false)
|
||||||
|
get_cp_options() {
|
||||||
|
eval $invocation
|
||||||
|
|
||||||
|
local override="$1"
|
||||||
|
local override_switch=""
|
||||||
|
|
||||||
|
if [ "$override" = false ]; then
|
||||||
|
override_switch="-n"
|
||||||
|
|
||||||
|
# create temporary files to check if 'cp -u' is supported
|
||||||
|
tmp_dir="$(mktemp -d)"
|
||||||
|
tmp_file="$tmp_dir/testfile"
|
||||||
|
tmp_file2="$tmp_dir/testfile2"
|
||||||
|
|
||||||
|
touch "$tmp_file"
|
||||||
|
|
||||||
|
# use -u instead of -n if it's available
|
||||||
|
if cp -u "$tmp_file" "$tmp_file2" 2>/dev/null; then
|
||||||
|
override_switch="-u"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# clean up
|
||||||
|
rm -f "$tmp_file" "$tmp_file2"
|
||||||
|
rm -rf "$tmp_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$override_switch"
|
||||||
|
}
|
||||||
|
|
||||||
# args:
|
# args:
|
||||||
# input_files - stdin
|
# input_files - stdin
|
||||||
# root_path - $1
|
# root_path - $1
|
||||||
@ -819,15 +998,7 @@ copy_files_or_dirs_from_list() {
|
|||||||
local root_path="$(remove_trailing_slash "$1")"
|
local root_path="$(remove_trailing_slash "$1")"
|
||||||
local out_path="$(remove_trailing_slash "$2")"
|
local out_path="$(remove_trailing_slash "$2")"
|
||||||
local override="$3"
|
local override="$3"
|
||||||
local osname="$(get_current_os_name)"
|
local override_switch="$(get_cp_options "$override")"
|
||||||
local override_switch=$(
|
|
||||||
if [ "$override" = false ]; then
|
|
||||||
if [ "$osname" = "linux-musl" ]; then
|
|
||||||
printf -- "-u";
|
|
||||||
else
|
|
||||||
printf -- "-n";
|
|
||||||
fi
|
|
||||||
fi)
|
|
||||||
|
|
||||||
cat | uniq | while read -r file_path; do
|
cat | uniq | while read -r file_path; do
|
||||||
local path="$(remove_beginning_slash "${file_path#$root_path}")"
|
local path="$(remove_beginning_slash "${file_path#$root_path}")"
|
||||||
@ -842,14 +1013,39 @@ copy_files_or_dirs_from_list() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# args:
|
||||||
|
# zip_uri - $1
|
||||||
|
get_remote_file_size() {
|
||||||
|
local zip_uri="$1"
|
||||||
|
|
||||||
|
if machine_has "curl"; then
|
||||||
|
file_size=$(curl -sI "$zip_uri" | grep -i content-length | awk '{ num = $2 + 0; print num }')
|
||||||
|
elif machine_has "wget"; then
|
||||||
|
file_size=$(wget --spider --server-response -O /dev/null "$zip_uri" 2>&1 | grep -i 'Content-Length:' | awk '{ num = $2 + 0; print num }')
|
||||||
|
else
|
||||||
|
say "Neither curl nor wget is available on this system."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$file_size" ]; then
|
||||||
|
say "Remote file $zip_uri size is $file_size bytes."
|
||||||
|
echo "$file_size"
|
||||||
|
else
|
||||||
|
say_verbose "Content-Length header was not extracted for $zip_uri."
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# args:
|
# args:
|
||||||
# zip_path - $1
|
# zip_path - $1
|
||||||
# out_path - $2
|
# out_path - $2
|
||||||
|
# remote_file_size - $3
|
||||||
extract_dotnet_package() {
|
extract_dotnet_package() {
|
||||||
eval $invocation
|
eval $invocation
|
||||||
|
|
||||||
local zip_path="$1"
|
local zip_path="$1"
|
||||||
local out_path="$2"
|
local out_path="$2"
|
||||||
|
local remote_file_size="$3"
|
||||||
|
|
||||||
local temp_out_path="$(mktemp -d "$temporary_file_template")"
|
local temp_out_path="$(mktemp -d "$temporary_file_template")"
|
||||||
|
|
||||||
@ -859,9 +1055,13 @@ extract_dotnet_package() {
|
|||||||
local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/'
|
local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/'
|
||||||
find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false
|
find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false
|
||||||
find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files"
|
find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files"
|
||||||
|
|
||||||
|
validate_remote_local_file_sizes "$zip_path" "$remote_file_size"
|
||||||
|
|
||||||
rm -rf "$temp_out_path"
|
rm -rf "$temp_out_path"
|
||||||
rm -f "$zip_path" && say_verbose "Temporary zip file $zip_path was removed"
|
if [ -z ${keep_zip+x} ]; then
|
||||||
|
rm -f "$zip_path" && say_verbose "Temporary archive file $zip_path was removed"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$failed" = true ]; then
|
if [ "$failed" = true ]; then
|
||||||
say_err "Extraction failed"
|
say_err "Extraction failed"
|
||||||
@ -921,9 +1121,15 @@ get_http_header_wget() {
|
|||||||
local remote_path="$1"
|
local remote_path="$1"
|
||||||
local disable_feed_credential="$2"
|
local disable_feed_credential="$2"
|
||||||
local wget_options="-q -S --spider --tries 5 "
|
local wget_options="-q -S --spider --tries 5 "
|
||||||
# Store options that aren't supported on all wget implementations separately.
|
|
||||||
local wget_options_extra="--waitretry 2 --connect-timeout 15 "
|
local wget_options_extra=''
|
||||||
local wget_result=''
|
|
||||||
|
# Test for options that aren't supported on all wget implementations.
|
||||||
|
if [[ $(wget -h 2>&1 | grep -E 'waitretry|connect-timeout') ]]; then
|
||||||
|
wget_options_extra="--waitretry 2 --connect-timeout 15 "
|
||||||
|
else
|
||||||
|
say "wget extra options are unavailable for this environment"
|
||||||
|
fi
|
||||||
|
|
||||||
remote_path_with_credential="$remote_path"
|
remote_path_with_credential="$remote_path"
|
||||||
if [ "$disable_feed_credential" = false ]; then
|
if [ "$disable_feed_credential" = false ]; then
|
||||||
@ -931,15 +1137,8 @@ get_http_header_wget() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
wget $wget_options $wget_options_extra "$remote_path_with_credential" 2>&1
|
wget $wget_options $wget_options_extra "$remote_path_with_credential" 2>&1
|
||||||
wget_result=$?
|
|
||||||
|
|
||||||
if [[ $wget_result == 2 ]]; then
|
return $?
|
||||||
# Parsing of the command has failed. Exclude potentially unrecognized options and retry.
|
|
||||||
wget $wget_options "$remote_path_with_credential" 2>&1
|
|
||||||
return $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
return $wget_result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# args:
|
# args:
|
||||||
@ -979,8 +1178,6 @@ download() {
|
|||||||
sleep $((attempts*10))
|
sleep $((attempts*10))
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$failed" = true ]; then
|
if [ "$failed" = true ]; then
|
||||||
say_verbose "Download failed: $remote_path"
|
say_verbose "Download failed: $remote_path"
|
||||||
return 1
|
return 1
|
||||||
@ -999,19 +1196,27 @@ downloadcurl() {
|
|||||||
# Avoid passing URI with credentials to functions: note, most of them echoing parameters of invocation in verbose output.
|
# Avoid passing URI with credentials to functions: note, most of them echoing parameters of invocation in verbose output.
|
||||||
local remote_path_with_credential="${remote_path}${feed_credential}"
|
local remote_path_with_credential="${remote_path}${feed_credential}"
|
||||||
local curl_options="--retry 20 --retry-delay 2 --connect-timeout 15 -sSL -f --create-dirs "
|
local curl_options="--retry 20 --retry-delay 2 --connect-timeout 15 -sSL -f --create-dirs "
|
||||||
local failed=false
|
local curl_exit_code=0;
|
||||||
if [ -z "$out_path" ]; then
|
if [ -z "$out_path" ]; then
|
||||||
curl $curl_options "$remote_path_with_credential" 2>&1 || failed=true
|
curl $curl_options "$remote_path_with_credential" 2>&1
|
||||||
|
curl_exit_code=$?
|
||||||
else
|
else
|
||||||
curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1 || failed=true
|
curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1
|
||||||
|
curl_exit_code=$?
|
||||||
fi
|
fi
|
||||||
if [ "$failed" = true ]; then
|
|
||||||
local disable_feed_credential=false
|
if [ $curl_exit_code -gt 0 ]; then
|
||||||
local response=$(get_http_header_curl $remote_path $disable_feed_credential)
|
|
||||||
http_code=$( echo "$response" | awk '/^HTTP/{print $2}' | tail -1 )
|
|
||||||
download_error_msg="Unable to download $remote_path."
|
download_error_msg="Unable to download $remote_path."
|
||||||
if [[ $http_code != 2* ]]; then
|
# Check for curl timeout codes
|
||||||
download_error_msg+=" Returned HTTP status code: $http_code."
|
if [[ $curl_exit_code == 7 || $curl_exit_code == 28 ]]; then
|
||||||
|
download_error_msg+=" Failed to reach the server: connection timeout."
|
||||||
|
else
|
||||||
|
local disable_feed_credential=false
|
||||||
|
local response=$(get_http_header_curl $remote_path $disable_feed_credential)
|
||||||
|
http_code=$( echo "$response" | awk '/^HTTP/{print $2}' | tail -1 )
|
||||||
|
if [[ ! -z $http_code && $http_code != 2* ]]; then
|
||||||
|
download_error_msg+=" Returned HTTP status code: $http_code."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
say_verbose "$download_error_msg"
|
say_verbose "$download_error_msg"
|
||||||
return 1
|
return 1
|
||||||
@ -1030,10 +1235,17 @@ downloadwget() {
|
|||||||
# Append feed_credential as late as possible before calling wget to avoid logging feed_credential
|
# Append feed_credential as late as possible before calling wget to avoid logging feed_credential
|
||||||
local remote_path_with_credential="${remote_path}${feed_credential}"
|
local remote_path_with_credential="${remote_path}${feed_credential}"
|
||||||
local wget_options="--tries 20 "
|
local wget_options="--tries 20 "
|
||||||
# Store options that aren't supported on all wget implementations separately.
|
|
||||||
local wget_options_extra="--waitretry 2 --connect-timeout 15 "
|
local wget_options_extra=''
|
||||||
local wget_result=''
|
local wget_result=''
|
||||||
|
|
||||||
|
# Test for options that aren't supported on all wget implementations.
|
||||||
|
if [[ $(wget -h 2>&1 | grep -E 'waitretry|connect-timeout') ]]; then
|
||||||
|
wget_options_extra="--waitretry 2 --connect-timeout 15 "
|
||||||
|
else
|
||||||
|
say "wget extra options are unavailable for this environment"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$out_path" ]; then
|
if [ -z "$out_path" ]; then
|
||||||
wget -q $wget_options $wget_options_extra -O - "$remote_path_with_credential" 2>&1
|
wget -q $wget_options $wget_options_extra -O - "$remote_path_with_credential" 2>&1
|
||||||
wget_result=$?
|
wget_result=$?
|
||||||
@ -1042,24 +1254,16 @@ downloadwget() {
|
|||||||
wget_result=$?
|
wget_result=$?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $wget_result == 2 ]]; then
|
|
||||||
# Parsing of the command has failed. Exclude potentially unrecognized options and retry.
|
|
||||||
if [ -z "$out_path" ]; then
|
|
||||||
wget -q $wget_options -O - "$remote_path_with_credential" 2>&1
|
|
||||||
wget_result=$?
|
|
||||||
else
|
|
||||||
wget $wget_options -O "$out_path" "$remote_path_with_credential" 2>&1
|
|
||||||
wget_result=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $wget_result != 0 ]]; then
|
if [[ $wget_result != 0 ]]; then
|
||||||
local disable_feed_credential=false
|
local disable_feed_credential=false
|
||||||
local response=$(get_http_header_wget $remote_path $disable_feed_credential)
|
local response=$(get_http_header_wget $remote_path $disable_feed_credential)
|
||||||
http_code=$( echo "$response" | awk '/^ HTTP/{print $2}' | tail -1 )
|
http_code=$( echo "$response" | awk '/^ HTTP/{print $2}' | tail -1 )
|
||||||
download_error_msg="Unable to download $remote_path."
|
download_error_msg="Unable to download $remote_path."
|
||||||
if [[ $http_code != 2* ]]; then
|
if [[ ! -z $http_code && $http_code != 2* ]]; then
|
||||||
download_error_msg+=" Returned HTTP status code: $http_code."
|
download_error_msg+=" Returned HTTP status code: $http_code."
|
||||||
|
# wget exit code 4 stands for network-issue
|
||||||
|
elif [[ $wget_result == 4 ]]; then
|
||||||
|
download_error_msg+=" Failed to reach the server: connection timeout."
|
||||||
fi
|
fi
|
||||||
say_verbose "$download_error_msg"
|
say_verbose "$download_error_msg"
|
||||||
return 1
|
return 1
|
||||||
@ -1068,13 +1272,69 @@ downloadwget() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extract_stem() {
|
||||||
|
local url="$1"
|
||||||
|
# extract the protocol
|
||||||
|
proto="$(echo $1 | grep :// | sed -e's,^\(.*://\).*,\1,g')"
|
||||||
|
# remove the protocol
|
||||||
|
url="${1/$proto/}"
|
||||||
|
# extract the path (if any) - since we know all of our feeds have a first path segment, we can skip the first one. otherwise we'd use -f2- to get the full path
|
||||||
|
full_path="$(echo $url | grep / | cut -d/ -f2-)"
|
||||||
|
path="$(echo $full_path | cut -d/ -f2-)"
|
||||||
|
echo $path
|
||||||
|
}
|
||||||
|
|
||||||
|
check_url_exists() {
|
||||||
|
eval $invocation
|
||||||
|
local url="$1"
|
||||||
|
|
||||||
|
local code=""
|
||||||
|
if machine_has "curl"
|
||||||
|
then
|
||||||
|
code=$(curl --head -o /dev/null -w "%{http_code}" -s --fail "$url");
|
||||||
|
elif machine_has "wget"
|
||||||
|
then
|
||||||
|
# get the http response, grab the status code
|
||||||
|
server_response=$(wget -qO- --method=HEAD --server-response "$url" 2>&1)
|
||||||
|
code=$(echo "$server_response" | grep "HTTP/" | awk '{print $2}')
|
||||||
|
fi
|
||||||
|
if [ $code = "200" ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitize_redirect_url() {
|
||||||
|
eval $invocation
|
||||||
|
|
||||||
|
local url_stem
|
||||||
|
url_stem=$(extract_stem "$1")
|
||||||
|
say_verbose "Checking configured feeds for the asset at ${yellow:-}$url_stem${normal:-}"
|
||||||
|
|
||||||
|
for feed in "${feeds[@]}"
|
||||||
|
do
|
||||||
|
local trial_url="$feed/$url_stem"
|
||||||
|
say_verbose "Checking ${yellow:-}$trial_url${normal:-}"
|
||||||
|
if check_url_exists "$trial_url"; then
|
||||||
|
say_verbose "Found a match at ${yellow:-}$trial_url${normal:-}"
|
||||||
|
echo "$trial_url"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
say_verbose "No match at ${yellow:-}$trial_url${normal:-}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
get_download_link_from_aka_ms() {
|
get_download_link_from_aka_ms() {
|
||||||
eval $invocation
|
eval $invocation
|
||||||
|
|
||||||
#quality is not supported for LTS or current channel
|
#quality is not supported for LTS or STS channel
|
||||||
if [[ ! -z "$normalized_quality" && ("$normalized_channel" == "LTS" || "$normalized_channel" == "current") ]]; then
|
#STS maps to current
|
||||||
|
if [[ ! -z "$normalized_quality" && ("$normalized_channel" == "LTS" || "$normalized_channel" == "STS") ]]; then
|
||||||
normalized_quality=""
|
normalized_quality=""
|
||||||
say_warning "Specifying quality for current or LTS channel is not supported, the quality will be ignored."
|
say_warning "Specifying quality for STS or LTS channel is not supported, the quality will be ignored."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
say_verbose "Retrieving primary payload URL from aka.ms for channel: '$normalized_channel', quality: '$normalized_quality', product: '$normalized_product', os: '$normalized_os', architecture: '$normalized_architecture'."
|
say_verbose "Retrieving primary payload URL from aka.ms for channel: '$normalized_channel', quality: '$normalized_quality', product: '$normalized_product', os: '$normalized_os', architecture: '$normalized_architecture'."
|
||||||
@ -1103,6 +1363,12 @@ get_download_link_from_aka_ms() {
|
|||||||
http_codes=$( echo "$response" | awk '$1 ~ /^HTTP/ {print $2}' )
|
http_codes=$( echo "$response" | awk '$1 ~ /^HTTP/ {print $2}' )
|
||||||
# They all need to be 301, otherwise some links are broken (except for the last, which is not a redirect but 200 or 404).
|
# They all need to be 301, otherwise some links are broken (except for the last, which is not a redirect but 200 or 404).
|
||||||
broken_redirects=$( echo "$http_codes" | sed '$d' | grep -v '301' )
|
broken_redirects=$( echo "$http_codes" | sed '$d' | grep -v '301' )
|
||||||
|
# The response may end without final code 2xx/4xx/5xx somehow, e.g. network restrictions on www.bing.com causes redirecting to bing.com fails with connection refused.
|
||||||
|
# In this case it should not exclude the last.
|
||||||
|
last_http_code=$( echo "$http_codes" | tail -n 1 )
|
||||||
|
if ! [[ $last_http_code =~ ^(2|4|5)[0-9][0-9]$ ]]; then
|
||||||
|
broken_redirects=$( echo "$http_codes" | grep -v '301' )
|
||||||
|
fi
|
||||||
|
|
||||||
# All HTTP codes are 301 (Moved Permanently), the redirect link exists.
|
# All HTTP codes are 301 (Moved Permanently), the redirect link exists.
|
||||||
if [[ -z "$broken_redirects" ]]; then
|
if [[ -z "$broken_redirects" ]]; then
|
||||||
@ -1113,6 +1379,11 @@ get_download_link_from_aka_ms() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
sanitized_redirect_url=$(sanitize_redirect_url "$aka_ms_download_link")
|
||||||
|
if [[ -n "$sanitized_redirect_url" ]]; then
|
||||||
|
aka_ms_download_link="$sanitized_redirect_url"
|
||||||
|
fi
|
||||||
|
|
||||||
say_verbose "The redirect location retrieved: '$aka_ms_download_link'."
|
say_verbose "The redirect location retrieved: '$aka_ms_download_link'."
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
@ -1124,23 +1395,16 @@ get_download_link_from_aka_ms() {
|
|||||||
get_feeds_to_use()
|
get_feeds_to_use()
|
||||||
{
|
{
|
||||||
feeds=(
|
feeds=(
|
||||||
"https://dotnetcli.azureedge.net/dotnet"
|
"https://builds.dotnet.microsoft.com/dotnet"
|
||||||
"https://dotnetbuilds.azureedge.net/public"
|
"https://ci.dot.net/public"
|
||||||
)
|
)
|
||||||
|
|
||||||
if [[ -n "$azure_feed" ]]; then
|
if [[ -n "$azure_feed" ]]; then
|
||||||
feeds=("$azure_feed")
|
feeds=("$azure_feed")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$no_cdn" == "true" ]]; then
|
if [[ -n "$uncached_feed" ]]; then
|
||||||
feeds=(
|
feeds=("$uncached_feed")
|
||||||
"https://dotnetcli.blob.core.windows.net/dotnet"
|
|
||||||
"https://dotnetbuilds.blob.core.windows.net/public"
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ -n "$uncached_feed" ]]; then
|
|
||||||
feeds=("$uncached_feed")
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1182,6 +1446,11 @@ generate_akams_links() {
|
|||||||
local valid_aka_ms_link=true;
|
local valid_aka_ms_link=true;
|
||||||
|
|
||||||
normalized_version="$(to_lowercase "$version")"
|
normalized_version="$(to_lowercase "$version")"
|
||||||
|
if [[ "$normalized_version" != "latest" ]] && [ -n "$normalized_quality" ]; then
|
||||||
|
say_err "Quality and Version options are not allowed to be specified simultaneously. See https://learn.microsoft.com/dotnet/core/tools/dotnet-install-script#options for details."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -n "$json_file" || "$normalized_version" != "latest" ]]; then
|
if [[ -n "$json_file" || "$normalized_version" != "latest" ]]; then
|
||||||
# aka.ms links are not needed when exact version is specified via command or json file
|
# aka.ms links are not needed when exact version is specified via command or json file
|
||||||
return
|
return
|
||||||
@ -1267,7 +1536,7 @@ generate_regular_links() {
|
|||||||
link_types+=("legacy")
|
link_types+=("legacy")
|
||||||
else
|
else
|
||||||
legacy_download_link=""
|
legacy_download_link=""
|
||||||
say_verbose "Cound not construct a legacy_download_link; omitting..."
|
say_verbose "Could not construct a legacy_download_link; omitting..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if the SDK version is already installed.
|
# Check if the SDK version is already installed.
|
||||||
@ -1325,6 +1594,8 @@ calculate_vars() {
|
|||||||
install_root="$(resolve_installation_path "$install_dir")"
|
install_root="$(resolve_installation_path "$install_dir")"
|
||||||
say_verbose "InstallRoot: '$install_root'."
|
say_verbose "InstallRoot: '$install_root'."
|
||||||
|
|
||||||
|
normalized_architecture="$(get_normalized_architecture_for_specific_sdk_version "$version" "$normalized_channel" "$normalized_architecture")"
|
||||||
|
|
||||||
if [[ "$runtime" == "dotnet" ]]; then
|
if [[ "$runtime" == "dotnet" ]]; then
|
||||||
asset_relative_path="shared/Microsoft.NETCore.App"
|
asset_relative_path="shared/Microsoft.NETCore.App"
|
||||||
asset_name=".NET Core Runtime"
|
asset_name=".NET Core Runtime"
|
||||||
@ -1343,10 +1614,11 @@ install_dotnet() {
|
|||||||
eval $invocation
|
eval $invocation
|
||||||
local download_failed=false
|
local download_failed=false
|
||||||
local download_completed=false
|
local download_completed=false
|
||||||
|
local remote_file_size=0
|
||||||
|
|
||||||
mkdir -p "$install_root"
|
mkdir -p "$install_root"
|
||||||
zip_path="$(mktemp "$temporary_file_template")"
|
zip_path="${zip_path:-$(mktemp "$temporary_file_template")}"
|
||||||
say_verbose "Zip path: $zip_path"
|
say_verbose "Archive path: $zip_path"
|
||||||
|
|
||||||
for link_index in "${!download_links[@]}"
|
for link_index in "${!download_links[@]}"
|
||||||
do
|
do
|
||||||
@ -1367,10 +1639,10 @@ install_dotnet() {
|
|||||||
say "The resource at $link_type link '$download_link' is not available."
|
say "The resource at $link_type link '$download_link' is not available."
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
say "Failed to download $link_type link '$download_link': $download_error_msg"
|
say "Failed to download $link_type link '$download_link': $http_code $download_error_msg"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
rm -f "$zip_path" 2>&1 && say_verbose "Temporary zip file $zip_path was removed"
|
rm -f "$zip_path" 2>&1 && say_verbose "Temporary archive file $zip_path was removed"
|
||||||
else
|
else
|
||||||
download_completed=true
|
download_completed=true
|
||||||
break
|
break
|
||||||
@ -1383,8 +1655,10 @@ install_dotnet() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
say "Extracting zip from $download_link"
|
remote_file_size="$(get_remote_file_size "$download_link")"
|
||||||
extract_dotnet_package "$zip_path" "$install_root" || return 1
|
|
||||||
|
say "Extracting archive from $download_link"
|
||||||
|
extract_dotnet_package "$zip_path" "$install_root" "$remote_file_size" || return 1
|
||||||
|
|
||||||
# Check if the SDK version is installed; if not, fail the installation.
|
# Check if the SDK version is installed; if not, fail the installation.
|
||||||
# if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed.
|
# if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed.
|
||||||
@ -1395,6 +1669,7 @@ install_dotnet() {
|
|||||||
unset IFS;
|
unset IFS;
|
||||||
say_verbose "Checking installation: version = $release_version"
|
say_verbose "Checking installation: version = $release_version"
|
||||||
if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$release_version"; then
|
if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$release_version"; then
|
||||||
|
say "Installed version is $effective_version"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -1402,6 +1677,7 @@ install_dotnet() {
|
|||||||
# Check if the standard SDK version is installed.
|
# Check if the standard SDK version is installed.
|
||||||
say_verbose "Checking installation: version = $effective_version"
|
say_verbose "Checking installation: version = $effective_version"
|
||||||
if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$effective_version"; then
|
if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$effective_version"; then
|
||||||
|
say "Installed version is $effective_version"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -1424,7 +1700,6 @@ install_dir="<auto>"
|
|||||||
architecture="<auto>"
|
architecture="<auto>"
|
||||||
dry_run=false
|
dry_run=false
|
||||||
no_path=false
|
no_path=false
|
||||||
no_cdn=false
|
|
||||||
azure_feed=""
|
azure_feed=""
|
||||||
uncached_feed=""
|
uncached_feed=""
|
||||||
feed_credential=""
|
feed_credential=""
|
||||||
@ -1497,10 +1772,6 @@ do
|
|||||||
verbose=true
|
verbose=true
|
||||||
non_dynamic_parameters+=" $name"
|
non_dynamic_parameters+=" $name"
|
||||||
;;
|
;;
|
||||||
--no-cdn|-[Nn]o[Cc]dn)
|
|
||||||
no_cdn=true
|
|
||||||
non_dynamic_parameters+=" $name"
|
|
||||||
;;
|
|
||||||
--azure-feed|-[Aa]zure[Ff]eed)
|
--azure-feed|-[Aa]zure[Ff]eed)
|
||||||
shift
|
shift
|
||||||
azure_feed="$1"
|
azure_feed="$1"
|
||||||
@ -1532,36 +1803,53 @@ do
|
|||||||
override_non_versioned_files=false
|
override_non_versioned_files=false
|
||||||
non_dynamic_parameters+=" $name"
|
non_dynamic_parameters+=" $name"
|
||||||
;;
|
;;
|
||||||
|
--keep-zip|-[Kk]eep[Zz]ip)
|
||||||
|
keep_zip=true
|
||||||
|
non_dynamic_parameters+=" $name"
|
||||||
|
;;
|
||||||
|
--zip-path|-[Zz]ip[Pp]ath)
|
||||||
|
shift
|
||||||
|
zip_path="$1"
|
||||||
|
;;
|
||||||
-?|--?|-h|--help|-[Hh]elp)
|
-?|--?|-h|--help|-[Hh]elp)
|
||||||
script_name="$(basename "$0")"
|
script_name="dotnet-install.sh"
|
||||||
echo ".NET Tools Installer"
|
echo ".NET Tools Installer"
|
||||||
echo "Usage: $script_name [-c|--channel <CHANNEL>] [-v|--version <VERSION>] [-p|--prefix <DESTINATION>]"
|
echo "Usage:"
|
||||||
|
echo " # Install a .NET SDK of a given Quality from a given Channel"
|
||||||
|
echo " $script_name [-c|--channel <CHANNEL>] [-q|--quality <QUALITY>]"
|
||||||
|
echo " # Install a .NET SDK of a specific public version"
|
||||||
|
echo " $script_name [-v|--version <VERSION>]"
|
||||||
echo " $script_name -h|-?|--help"
|
echo " $script_name -h|-?|--help"
|
||||||
echo ""
|
echo ""
|
||||||
echo "$script_name is a simple command line interface for obtaining dotnet cli."
|
echo "$script_name is a simple command line interface for obtaining dotnet cli."
|
||||||
|
echo " Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:"
|
||||||
|
echo " - The SDK needs to be installed without user interaction and without admin rights."
|
||||||
|
echo " - The SDK installation doesn't need to persist across multiple CI runs."
|
||||||
|
echo " To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer."
|
||||||
echo ""
|
echo ""
|
||||||
echo "Options:"
|
echo "Options:"
|
||||||
echo " -c,--channel <CHANNEL> Download from the channel specified, Defaults to \`$channel\`."
|
echo " -c,--channel <CHANNEL> Download from the channel specified, Defaults to \`$channel\`."
|
||||||
echo " -Channel"
|
echo " -Channel"
|
||||||
echo " Possible values:"
|
echo " Possible values:"
|
||||||
echo " - Current - most current release"
|
echo " - STS - the most recent Standard Term Support release"
|
||||||
echo " - LTS - most current supported release"
|
echo " - LTS - the most recent Long Term Support release"
|
||||||
echo " - 2-part version in a format A.B - represents a specific release"
|
echo " - 2-part version in a format A.B - represents a specific release"
|
||||||
echo " examples: 2.0; 1.0"
|
echo " examples: 2.0; 1.0"
|
||||||
echo " - 3-part version in a format A.B.Cxx - represents a specific SDK release"
|
echo " - 3-part version in a format A.B.Cxx - represents a specific SDK release"
|
||||||
echo " examples: 5.0.1xx, 5.0.2xx."
|
echo " examples: 5.0.1xx, 5.0.2xx."
|
||||||
echo " Supported since 5.0 release"
|
echo " Supported since 5.0 release"
|
||||||
|
echo " Warning: Value 'Current' is deprecated for the Channel parameter. Use 'STS' instead."
|
||||||
echo " Note: The version parameter overrides the channel parameter when any version other than 'latest' is used."
|
echo " Note: The version parameter overrides the channel parameter when any version other than 'latest' is used."
|
||||||
echo " -v,--version <VERSION> Use specific VERSION, Defaults to \`$version\`."
|
echo " -v,--version <VERSION> Use specific VERSION, Defaults to \`$version\`."
|
||||||
echo " -Version"
|
echo " -Version"
|
||||||
echo " Possible values:"
|
echo " Possible values:"
|
||||||
echo " - latest - most latest build on specific channel"
|
echo " - latest - the latest build on specific channel"
|
||||||
echo " - 3-part version in a format A.B.C - represents specific version of build"
|
echo " - 3-part version in a format A.B.C - represents specific version of build"
|
||||||
echo " examples: 2.0.0-preview2-006120; 1.1.0"
|
echo " examples: 2.0.0-preview2-006120; 1.1.0"
|
||||||
echo " -q,--quality <quality> Download the latest build of specified quality in the channel."
|
echo " -q,--quality <quality> Download the latest build of specified quality in the channel."
|
||||||
echo " -Quality"
|
echo " -Quality"
|
||||||
echo " The possible values are: daily, signed, validated, preview, GA."
|
echo " The possible values are: daily, signed, validated, preview, GA."
|
||||||
echo " Works only in combination with channel. Not applicable for current and LTS channels and will be ignored if those channels are used."
|
echo " Works only in combination with channel. Not applicable for STS and LTS channels and will be ignored if those channels are used."
|
||||||
echo " For SDK use channel in A.B.Cxx format. Using quality for SDK together with channel in A.B format is not supported."
|
echo " For SDK use channel in A.B.Cxx format. Using quality for SDK together with channel in A.B format is not supported."
|
||||||
echo " Supported since 5.0 release."
|
echo " Supported since 5.0 release."
|
||||||
echo " Note: The version parameter overrides the channel parameter when any version other than 'latest' is used, and therefore overrides the quality."
|
echo " Note: The version parameter overrides the channel parameter when any version other than 'latest' is used, and therefore overrides the quality."
|
||||||
@ -1572,7 +1860,7 @@ do
|
|||||||
echo " -InstallDir"
|
echo " -InstallDir"
|
||||||
echo " --architecture <ARCHITECTURE> Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`."
|
echo " --architecture <ARCHITECTURE> Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`."
|
||||||
echo " --arch,-Architecture,-Arch"
|
echo " --arch,-Architecture,-Arch"
|
||||||
echo " Possible values: x64, arm, and arm64"
|
echo " Possible values: x64, arm, arm64, s390x, ppc64le and loongarch64"
|
||||||
echo " --os <system> Specifies operating system to be used when selecting the installer."
|
echo " --os <system> Specifies operating system to be used when selecting the installer."
|
||||||
echo " Overrides the OS determination approach used by the script. Supported values: osx, linux, linux-musl, freebsd, rhel.6."
|
echo " Overrides the OS determination approach used by the script. Supported values: osx, linux, linux-musl, freebsd, rhel.6."
|
||||||
echo " In case any other value is provided, the platform will be determined by the script based on machine configuration."
|
echo " In case any other value is provided, the platform will be determined by the script based on machine configuration."
|
||||||
@ -1588,15 +1876,14 @@ do
|
|||||||
echo " --verbose,-Verbose Display diagnostics information."
|
echo " --verbose,-Verbose Display diagnostics information."
|
||||||
echo " --azure-feed,-AzureFeed For internal use only."
|
echo " --azure-feed,-AzureFeed For internal use only."
|
||||||
echo " Allows using a different storage to download SDK archives from."
|
echo " Allows using a different storage to download SDK archives from."
|
||||||
echo " This parameter is only used if --no-cdn is false."
|
|
||||||
echo " --uncached-feed,-UncachedFeed For internal use only."
|
echo " --uncached-feed,-UncachedFeed For internal use only."
|
||||||
echo " Allows using a different storage to download SDK archives from."
|
echo " Allows using a different storage to download SDK archives from."
|
||||||
echo " This parameter is only used if --no-cdn is true."
|
|
||||||
echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable."
|
echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable."
|
||||||
echo " -SkipNonVersionedFiles"
|
echo " -SkipNonVersionedFiles"
|
||||||
echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and use the uncached feed directly."
|
|
||||||
echo " --jsonfile <JSONFILE> Determines the SDK version from a user specified global.json file."
|
echo " --jsonfile <JSONFILE> Determines the SDK version from a user specified global.json file."
|
||||||
echo " Note: global.json must have a value for 'SDK:Version'"
|
echo " Note: global.json must have a value for 'SDK:Version'"
|
||||||
|
echo " --keep-zip,-KeepZip If set, downloaded file is kept."
|
||||||
|
echo " --zip-path, -ZipPath If set, downloaded file is stored at the specified path."
|
||||||
echo " -?,--?,-h,--help,-Help Shows this help message"
|
echo " -?,--?,-h,--help,-Help Shows this help message"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Install Location:"
|
echo "Install Location:"
|
||||||
@ -1615,10 +1902,10 @@ do
|
|||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
say "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:"
|
say_verbose "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:"
|
||||||
say "- The SDK needs to be installed without user interaction and without admin rights."
|
say_verbose "- The SDK needs to be installed without user interaction and without admin rights."
|
||||||
say "- The SDK installation doesn't need to persist across multiple CI runs."
|
say_verbose "- The SDK installation doesn't need to persist across multiple CI runs."
|
||||||
say "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.\n"
|
say_verbose "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.\n"
|
||||||
|
|
||||||
if [ "$internal" = true ] && [ -z "$(echo $feed_credential)" ]; then
|
if [ "$internal" = true ] && [ -z "$(echo $feed_credential)" ]; then
|
||||||
message="Provide credentials via --feed-credential parameter."
|
message="Provide credentials via --feed-credential parameter."
|
||||||
@ -1651,5 +1938,5 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
say "Note that the script does not resolve dependencies during installation."
|
say "Note that the script does not resolve dependencies during installation."
|
||||||
say "To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install, select your operating system and check the \"Dependencies\" section."
|
say "To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the \"Dependencies\" section."
|
||||||
say "Installation finished successfully."
|
say "Installation finished successfully."
|
4874
package-lock.json
generated
4874
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -41,7 +41,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.0.2",
|
"@types/jest": "^27.0.2",
|
||||||
"@types/node": "^16.11.25",
|
"@types/node": "^12.12.62",
|
||||||
"@types/semver": "^6.2.2",
|
"@types/semver": "^6.2.2",
|
||||||
"@zeit/ncc": "^0.21.1",
|
"@zeit/ncc": "^0.21.1",
|
||||||
"husky": "^7.0.2",
|
"husky": "^7.0.2",
|
||||||
|
@ -300,4 +300,4 @@ export class DotnetCoreInstaller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const DotNetCoreIndexUrl: string =
|
const DotNetCoreIndexUrl: string =
|
||||||
'https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json';
|
'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json';
|
||||||
|
Reference in New Issue
Block a user