diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml
index 45d7bc6184..6004bc15a8 100644
--- a/.azure/pipelines/jobs/default-build.yml
+++ b/.azure/pipelines/jobs/default-build.yml
@@ -55,6 +55,7 @@ parameters:
artifacts: []
buildDirectory: ''
buildScript: ''
+ installTar: true
installNodeJs: true
installJdk: true
timeoutInMinutes: 180
@@ -146,6 +147,9 @@ jobs:
Write-Host "##vso[task.setvariable variable=SeleniumProcessTrackingFolder]$(BuildDirectory)\artifacts\tmp\selenium\"
./eng/scripts/InstallGoogleChrome.ps1
displayName: Install Chrome
+ - ${{ if and(eq(parameters.installTar, 'true'), eq(parameters.agentOs, 'Windows')) }}:
+ - powershell: ./eng/scripts/InstallTar.ps1
+ displayName: Find or install Tar
- ${{ parameters.beforeBuild }}
diff --git a/build.ps1 b/build.ps1
index 17020044ed..c515a84af5 100644
--- a/build.ps1
+++ b/build.ps1
@@ -307,6 +307,8 @@ if (-not $foundJdk -and $RunBuild -and ($All -or $BuildJava) -and -not $NoBuildJ
# Initialize global variables need to be set before the import of Arcade is imported
$restore = $RunRestore
+# Though VS Code may indicate $nodeReuse, $warnAsError and $msbuildEngine are unused, tools.ps1 uses them.
+
# Disable node reuse - Workaround perpetual issues in node reuse and custom task assemblies
$nodeReuse = $false
$env:MSBUILDDISABLENODEREUSE=1
@@ -328,10 +330,10 @@ if ($CI) {
}
# tools.ps1 corrupts global state, so reset these values in case they carried over from a previous build
-rm variable:global:_BuildTool -ea Ignore
-rm variable:global:_DotNetInstallDir -ea Ignore
-rm variable:global:_ToolsetBuildProj -ea Ignore
-rm variable:global:_MSBuildExe -ea Ignore
+Remove-Item variable:global:_BuildTool -ea Ignore
+Remove-Item variable:global:_DotNetInstallDir -ea Ignore
+Remove-Item variable:global:_ToolsetBuildProj -ea Ignore
+Remove-Item variable:global:_MSBuildExe -ea Ignore
# Import Arcade
. "$PSScriptRoot/eng/common/tools.ps1"
@@ -391,10 +393,10 @@ finally {
}
# tools.ps1 corrupts global state, so reset these values so they don't carry between invocations of build.ps1
- rm variable:global:_BuildTool -ea Ignore
- rm variable:global:_DotNetInstallDir -ea Ignore
- rm variable:global:_ToolsetBuildProj -ea Ignore
- rm variable:global:_MSBuildExe -ea Ignore
+ Remove-Item variable:global:_BuildTool -ea Ignore
+ Remove-Item variable:global:_DotNetInstallDir -ea Ignore
+ Remove-Item variable:global:_ToolsetBuildProj -ea Ignore
+ Remove-Item variable:global:_MSBuildExe -ea Ignore
if ($DumpProcesses -or $ci) {
Stop-Job -Name DumpProcesses
diff --git a/eng/scripts/InstallTar.ps1 b/eng/scripts/InstallTar.ps1
new file mode 100644
index 0000000000..93f419b213
--- /dev/null
+++ b/eng/scripts/InstallTar.ps1
@@ -0,0 +1,76 @@
+<#
+.SYNOPSIS
+ Finds or installs the Tar command on this system.
+.DESCRIPTION
+ This script searches for Tar on this system. If not found, downloads and extracts Git to use its tar.exe. Prefers
+ global installation locations even if Git has been downloaded into this repo.
+.PARAMETER GitVersion
+ The version of the Git to install. If not set, the default value is read from global.json.
+.PARAMETER Force
+ Overwrite the existing installation if one exists in this repo and Tar isn't installed globally.
+#>
+param(
+ [string]$GitVersion,
+ [switch]$Force
+)
+
+$ErrorActionPreference = 'Stop'
+$ProgressPreference = 'SilentlyContinue' # Workaround PowerShell/PowerShell#2138
+
+Set-StrictMode -Version 1
+
+# Find tar. If not found, install Git to get it.
+$repoRoot = (Join-Path $PSScriptRoot "..\.." -Resolve)
+$installDir = "$repoRoot\.tools\Git\win-x64"
+$tarCommand = "$installDir\usr\bin\tar.exe"
+$finalCommand = "$repoRoot\.tools\tar.exe"
+
+Write-Host "Windows version and other information, because who knows"
+cmd.exe /c ver
+systeminfo.exe
+
+Write-Host "Processor Architecture: $env:PROCESSOR_ARCHITECTURE"
+Write-Host "Dumping environment"
+Get-ChildItem env:\
+
+Write-Host "Checking $env:SystemRoot\System32\tar.exe"
+Get-ChildItem "$env:SystemRoot\System32\ta*.exe"
+if (Test-Path "$env:SystemRoot\System32\tar.exe") {
+ Write-Host "Found $env:SystemRoot\System32\tar.exe"
+ $tarCommand = "$env:SystemRoot\System32\tar.exe"
+}
+elseif (Test-Path "$env:ProgramFiles\Git\usr\bin\tar.exe") {
+ $tarCommand = "$env:ProgramFiles\Git\usr\bin\tar.exe"
+}
+elseif (Test-Path "${env:ProgramFiles(x86)}\Git\usr\bin\tar.exe") {
+ $tarCommand = "${env:ProgramFiles(x86)}\Git\usr\bin\tar.exe"
+}
+elseif (Test-Path "$env:AGENT_HOMEDIRECTORY\externals\git\usr\bin\tar.exe") {
+ $tarCommand = "$env:AGENT_HOMEDIRECTORY\externals\git\usr\bin\tar.exe"
+}
+elseif ((Test-Path $tarCommand) -And (-Not $Force)) {
+ Write-Verbose "Repo-local Git installation and $tarCommand already exist, skipping Git install."
+}
+else {
+ if (-not $GitVersion) {
+ $globalJson = Get-Content "$repoRoot\global.json" | ConvertFrom-Json
+ $GitVersion = $globalJson.tools.Git
+ }
+
+ $Uri = "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/git/Git-${GitVersion}-64-bit.zip"
+
+ Import-Module -Name (Join-Path $PSScriptRoot "..\common\native\CommonLibrary.psm1" -Resolve)
+ $InstallStatus = CommonLibrary\DownloadAndExtract -Uri $Uri -InstallDirectory "$installDir\" -Force:$Force -Verbose
+
+ if ($InstallStatus -Eq $False) {
+ Write-Error "Installation failed"
+ exit 1
+ }
+}
+
+Copy-Item "$tarCommand" "$finalCommand" -Verbose
+Write-Host "Tar now available at '$finalCommand'"
+
+if ($tarCommand -like '*\Git\*') {
+ $null >.\.tools\tar.fromGit
+}
diff --git a/global.json b/global.json
index dcba24801f..e02636c9c6 100644
--- a/global.json
+++ b/global.json
@@ -12,6 +12,7 @@
"$(MicrosoftNETCoreAppRuntimeVersion)"
]
},
+ "Git": "2.22.0",
"jdk": "11.0.3",
"vs": {
"version": "16.0",
diff --git a/src/Framework/ref/Microsoft.AspNetCore.App.Ref.csproj b/src/Framework/ref/Microsoft.AspNetCore.App.Ref.csproj
index fafdf9a39a..f1a73df741 100644
--- a/src/Framework/ref/Microsoft.AspNetCore.App.Ref.csproj
+++ b/src/Framework/ref/Microsoft.AspNetCore.App.Ref.csproj
@@ -169,14 +169,34 @@ This package is an internal implementation of the .NET Core SDK and is not meant
Inputs="@(RefPackContent)"
Outputs="$(ZipArchiveOutputPath);$(TarArchiveOutputPath)"
Condition="'$(IsPackable)' == 'true'">
+
+ <_TarCommand Condition="Exists('$(RepoRoot).tools\tar.exe')">$(RepoRoot).tools\tar.exe
+ <_TarCommand Condition="'$(_TarCommand)' == ''">tar
+
+
+ <_TarArchiveOutputPath>$(TarArchiveOutputPath)
+ <_TarArchiveOutputPath
+ Condition="Exists('$(repoRoot)\.tools\tar.fromGit')">/$(TarArchiveOutputPath.Replace('\','/').Replace(':',''))
+
+
+
-
+
+
+
+
+
+