update_dart_sdk.ps1 5.36 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
# Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12 13 14 15
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


# ---------------------------------- NOTE ---------------------------------- #
#
# Please keep the logic in this file consistent with the logic in the
# `update_dart_sdk.sh` script in the same directory to ensure that Flutter
# continues to work across all platforms!
#
# -------------------------------------------------------------------------- #

$ErrorActionPreference = "Stop"

16
$progName = Split-Path -parent $MyInvocation.MyCommand.Definition
17
$flutterRoot = (Get-Item $progName).parent.parent.FullName
18

19 20
$cachePath = "$flutterRoot\bin\cache"
$dartSdkPath = "$cachePath\dart-sdk"
21
$dartSdkLicense = "$cachePath\LICENSE.dart_sdk_archive.md"
22 23
$engineStamp = "$cachePath\engine-dart-sdk.stamp"
$engineVersion = (Get-Content "$flutterRoot\bin\internal\engine.version")
24
$engineRealm = (Get-Content "$flutterRoot\bin\internal\engine.realm")
25

26 27
$oldDartSdkPrefix = "dart-sdk.old"

28 29 30 31 32
# Make sure that PowerShell has expected version.
$psMajorVersionRequired = 5
$psMajorVersionLocal = $PSVersionTable.PSVersion.Major
if ($psMajorVersionLocal -lt $psMajorVersionRequired) {
    Write-Host "Flutter requires PowerShell $psMajorVersionRequired.0 or newer."
33
    Write-Host "See https://flutter.dev/docs/get-started/install/windows for more."
34 35 36
    Write-Host "Current version is $psMajorVersionLocal."
    # Use exit code 2 to signal that shared.bat should exit immediately instead of retrying.
    exit 2
37 38
}

39
if ((Test-Path $engineStamp) -and ($engineVersion -eq (Get-Content $engineStamp))) {
40 41 42
    return
}

43 44 45 46
$dartSdkBaseUrl = $Env:FLUTTER_STORAGE_BASE_URL
if (-not $dartSdkBaseUrl) {
    $dartSdkBaseUrl = "https://storage.googleapis.com"
}
47 48 49
if ($engineRealm) {
    $dartSdkBaseUrl = "$dartSdkBaseUrl/$engineRealm"
}
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

# It's important to use the native Dart SDK as the default target architecture
# for Flutter Windows builds depend on the Dart executable's architecture.
$dartZipNameX64 = "dart-sdk-windows-x64.zip"
$dartZipNameArm64 = "dart-sdk-windows-arm64.zip"
$dartZipName = $dartZipNameX64
if ($env:PROCESSOR_ARCHITECTURE -eq "ARM64") {
    $dartSdkArm64Url = "$dartSdkBaseUrl/flutter_infra_release/flutter/$engineVersion/$dartZipNameArm64"
    Try {
        Invoke-WebRequest -Uri $dartSdkArm64Url -UseBasicParsing -Method Head | Out-Null
        $dartZipName = $dartZipNameArm64
    }
    Catch {
        Write-Host "The current channel's Dart SDK does not support Windows Arm64, falling back to Windows x64..."
    }
}
66
$dartSdkUrl = "$dartSdkBaseUrl/flutter_infra_release/flutter/$engineVersion/$dartZipName"
67

68
if ((Test-Path $dartSdkPath) -or (Test-Path $dartSdkLicense)) {
69 70 71
    # Move old SDK to a new location instead of deleting it in case it is still in use (e.g. by IntelliJ).
    $oldDartSdkSuffix = 1
    while (Test-Path "$cachePath\$oldDartSdkPrefix$oldDartSdkSuffix") { $oldDartSdkSuffix++ }
72 73 74 75 76 77 78 79

    if (Test-Path $dartSdkPath) {
        Rename-Item $dartSdkPath "$oldDartSdkPrefix$oldDartSdkSuffix"
    }

    if (Test-Path $dartSdkLicense) {
        Rename-Item $dartSdkLicense "$oldDartSdkPrefix$oldDartSdkSuffix.LICENSE.md"
    }
80
}
81
New-Item $dartSdkPath -force -type directory | Out-Null
82
$dartSdkZip = "$cachePath\$dartZipName"
83 84 85

Try {
    Import-Module BitsTransfer
86
    $ProgressPreference = 'SilentlyContinue'
87
    Start-BitsTransfer -Source $dartSdkUrl -Destination $dartSdkZip -ErrorAction Stop
88 89 90
}
Catch {
    Write-Host "Downloading the Dart SDK using the BITS service failed, retrying with WebRequest..."
91 92 93 94 95 96
    # Invoke-WebRequest is very slow when the progress bar is visible - a 28
    # second download can become a 33 minute download. Disable it with
    # $ProgressPreference and then restore the original value afterwards.
    # https://github.com/flutter/flutter/issues/37789
    $OriginalProgressPreference = $ProgressPreference
    $ProgressPreference = 'SilentlyContinue'
97
    Invoke-WebRequest -Uri $dartSdkUrl -OutFile $dartSdkZip
98
    $ProgressPreference = $OriginalProgressPreference
99
}
100

101
If (Get-Command 7z -errorAction SilentlyContinue) {
102
    Write-Host "Expanding downloaded archive with 7z..."
103
    # The built-in unzippers are painfully slow. Use 7-Zip, if available.
104
    & 7z x $dartSdkZip "-o$cachePath" -bd | Out-Null
105
} ElseIf (Get-Command 7za -errorAction SilentlyContinue) {
106
    Write-Host "Expanding downloaded archive with 7za..."
107
    # Use 7-Zip's standalone version 7za.exe, if available.
108
    & 7za x $dartSdkZip "-o$cachePath" -bd | Out-Null
109
} ElseIf (Get-Command Microsoft.PowerShell.Archive\Expand-Archive -errorAction SilentlyContinue) {
110
    Write-Host "Expanding downloaded archive with PowerShell..."
111
    # Use PowerShell's built-in unzipper, if available (requires PowerShell 5+).
112
    $global:ProgressPreference='SilentlyContinue'
113
    Microsoft.PowerShell.Archive\Expand-Archive $dartSdkZip -DestinationPath $cachePath
114
} Else {
115
    Write-Host "Expanding downloaded archive with Windows..."
116
    # As last resort: fall back to the Windows GUI.
117 118 119 120 121 122
    $shell = New-Object -com shell.application
    $zip = $shell.NameSpace($dartSdkZip)
    foreach($item in $zip.items()) {
        $shell.Namespace($cachePath).copyhere($item)
    }
}
123

124
Remove-Item $dartSdkZip
125
$engineVersion | Out-File $engineStamp -Encoding ASCII
126

127
# Try to delete all old SDKs and license files.
128
Get-ChildItem -Path $cachePath | Where {$_.BaseName.StartsWith($oldDartSdkPrefix)} | Remove-Item -Recurse -ErrorAction SilentlyContinue