user_messages.dart 18.7 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
import 'package:platform/platform.dart';

7 8
import 'context.dart';

9
UserMessages get userMessages => context.get<UserMessages>();
10 11 12 13 14

/// Class containing message strings that can be produced by Flutter tools.
class UserMessages {
  // Messages used in FlutterValidator
  String flutterStatusInfo(String channel, String version, String os, String locale) =>
15
      'Channel ${channel ?? 'unknown'}, v${version ?? 'Unknown'}, on $os, locale $locale';
16 17 18 19 20 21 22 23 24 25 26 27
  String flutterVersion(String version, String flutterRoot) =>
      'Flutter version $version at $flutterRoot';
  String flutterRevision(String revision, String age, String date) =>
      'Framework revision $revision ($age), $date';
  String engineRevision(String revision) => 'Engine revision $revision';
  String dartRevision(String revision) => 'Dart version $revision';
  String get flutterBinariesDoNotRun =>
      'Downloaded executables cannot execute on host.\n'
      'See https://github.com/flutter/flutter/issues/6207 for more information';
  String get flutterBinariesLinuxRepairCommands =>
      'On Debian/Ubuntu/Mint: sudo apt-get install lib32stdc++6\n'
      'On Fedora: dnf install libstdc++.i686\n'
28
      'On Arch: pacman -S lib32-gcc-libs';
29 30 31 32 33 34 35 36 37

  // Messages used in NoIdeValidator
  String get noIdeStatusInfo => 'No supported IDEs installed';
  String get noIdeInstallationInfo => 'IntelliJ - https://www.jetbrains.com/idea/';

  // Messages used in IntellijValidator
  String intellijStatusInfo(String version) => 'version $version';
  String get intellijPluginInfo =>
      'For information about installing plugins, see\n'
38
      'https://flutter.dev/intellij-setup/#installing-the-plugins';
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
  String intellijMinimumVersion(String minVersion) =>
      'This install is older than the minimum recommended version of $minVersion.';
  String intellijLocation(String installPath) => 'IntelliJ at $installPath';

  // Message used in IntellijValidatorOnMac
  String get intellijMacUnknownResult => 'Cannot determine if IntelliJ is installed';

  // Messages used in DeviceValidator
  String get devicesMissing => 'No devices available';
  String devicesAvailable(int devices) => '$devices available';

  // Messages used in AndroidValidator
  String androidCantRunJavaBinary(String javaBinary) => 'Cannot execute $javaBinary to determine the version';
  String get androidUnknownJavaVersion => 'Could not determine java version';
  String androidJavaVersion(String javaVersion) => 'Java version $javaVersion';
54
  String androidJavaMinimumVersion(String javaVersion) => 'Java version $javaVersion is older than the minimum recommended version of 1.8';
55 56 57 58 59 60 61 62 63
  String androidSdkLicenseOnly(String envKey) =>
      'Android SDK contains licenses only.\n'
      'Your first build of an Android application will take longer than usual, '
      'while gradle downloads the missing components. This functionality will '
      'only work if the licenses in the licenses folder in $envKey are valid.\n'
      'If the Android SDK has been installed to another location, set $envKey to that location.\n'
      'You may also want to add it to your PATH environment variable.\n\n'
      'Certain features, such as `flutter emulators` and `flutter devices`, will '
      'not work without the currently missing SDK components.';
64 65 66
  String androidBadSdkDir(String envKey, String homeDir) =>
      '$envKey = $homeDir\n'
      'but Android SDK not found at this location.';
67
  String androidMissingSdkInstructions(String envKey, Platform platform) =>
68 69 70
      'Unable to locate Android SDK.\n'
      'Install Android Studio from: https://developer.android.com/studio/index.html\n'
      'On first launch it will assist you in installing the Android SDK components.\n'
71
      '(or visit ${_androidSdkInstallUrl(platform)} for detailed instructions).\n'
72
      'If the Android SDK has been installed to a custom location, set $envKey to that location.\n'
73 74 75 76
      'You may also want to add it to your PATH environment variable.\n';
  String androidSdkLocation(String directory) => 'Android SDK at $directory';
  String androidSdkPlatformToolsVersion(String platform, String tools) =>
      'Platform $platform, build-tools $tools';
77
  String androidSdkInstallHelp(Platform platform) =>
78
      'Try re-installing or updating your Android SDK,\n'
79
      'visit ${_androidSdkInstallUrl(platform)} for detailed instructions.';
80 81 82 83 84 85 86 87 88 89 90 91
  // Also occurs in AndroidLicenseValidator
  String androidStatusInfo(String version) => 'Android SDK version $version';

  // Messages used in AndroidLicenseValidator
  String get androidMissingJdk =>
      'No Java Development Kit (JDK) found; You must have the environment '
      'variable JAVA_HOME set and the java binary in your PATH. '
      'You can download the JDK from https://www.oracle.com/technetwork/java/javase/downloads/.';
  String androidJdkLocation(String location) => 'Java binary at: $location';
  String get androidLicensesAll => 'All Android licenses accepted.';
  String get androidLicensesSome => 'Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses';
  String get androidLicensesNone => 'Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses';
92
  String androidLicensesUnknown(Platform platform) =>
93 94 95
      'Android license status unknown.\n'
      'Try re-installing or updating your Android SDK Manager.\n'
      'See https://developer.android.com/studio/#downloads or visit '
96
      'visit ${_androidSdkInstallUrl(platform)} for detailed instructions.';
97
  String androidSdkManagerOutdated(String managerPath) =>
98 99 100 101
      'A newer version of the Android SDK is required. To update, run:\n'
      '$managerPath --update\n';
  String androidLicensesTimeout(String managerPath) => 'Intentionally killing $managerPath';
  String get androidSdkShort => 'Unable to locate Android SDK.';
102
  String androidMissingSdkManager(String sdkManagerPath, Platform platform) =>
103 104
      'Android sdkmanager tool not found ($sdkManagerPath).\n'
      'Try re-installing or updating your Android SDK,\n'
105 106
      'visit ${_androidSdkInstallUrl(platform)} for detailed instructions.';
  String androidCannotRunSdkManager(String sdkManagerPath, String error, Platform platform) =>
107 108
      'Android sdkmanager tool was found, but failed to run ($sdkManagerPath): "$error".\n'
      'Try re-installing or updating your Android SDK,\n'
109 110
      'visit ${_androidSdkInstallUrl(platform)} for detailed instructions.';
  String androidSdkBuildToolsOutdated(String managerPath, int sdkMinVersion, String buildToolsMinVersion, Platform platform) =>
111 112
      'Flutter requires Android SDK $sdkMinVersion and the Android BuildTools $buildToolsMinVersion\n'
      'To update using sdkmanager, run:\n'
113
      '  "$managerPath" "platforms;android-$sdkMinVersion" "build-tools;$buildToolsMinVersion"\n'
114
      'or visit ${_androidSdkInstallUrl(platform)} for detailed instructions.';
115 116 117 118 119 120 121 122

  // Messages used in AndroidStudioValidator
  String androidStudioVersion(String version) => 'version $version';
  String androidStudioLocation(String location) => 'Android Studio at $location';
  String get androidStudioNeedsUpdate => 'Try updating or re-installing Android Studio.';
  String get androidStudioResetDir =>
      'Consider removing your android-studio-dir setting by running:\n'
      'flutter config --android-studio-dir=';
123 124
  String get aaptNotFound =>
      'Could not locate aapt. Please ensure you have the Android buildtools installed.';
125 126 127 128 129

  // Messages used in NoAndroidStudioValidator
  String androidStudioMissing(String location) =>
      'android-studio-dir = $location\n'
      'but Android Studio not found at this location.';
130
  String androidStudioInstallation(Platform platform) =>
131
      'Android Studio not found; download from https://developer.android.com/studio/index.html\n'
132
      '(or visit ${_androidSdkInstallUrl(platform)} for detailed instructions).';
133

134 135 136
  // Messages used in XcodeValidator
  String xcodeLocation(String location) => 'Xcode at $location';
  String xcodeOutdated(int versionMajor, int versionMinor) =>
137 138
      'Flutter requires a minimum Xcode version of $versionMajor.$versionMinor.0.\n'
      'Download the latest version or update via the Mac App Store.';
139
  String get xcodeEula => "Xcode end user license agreement not signed; open Xcode or run the command 'sudo xcodebuild -license'.";
140
  String get xcodeMissingSimct =>
141
      'Xcode requires additional components to be installed in order to run.\n'
142 143
      'Launch Xcode and install additional required components when prompted or run:\n'
      '  sudo xcodebuild -runFirstLaunch';
144
  String get xcodeMissing =>
145 146
      'Xcode not installed; this is necessary for iOS development.\n'
      'Download at https://developer.apple.com/xcode/download/.';
147
  String get xcodeIncomplete =>
148 149 150 151
      'Xcode installation is incomplete; a full installation is necessary for iOS development.\n'
      'Download at: https://developer.apple.com/xcode/download/\n'
      'Or install Xcode via the App Store.\n'
      'Once installed, run:\n'
152 153
      '  sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer\n'
      '  sudo xcodebuild -runFirstLaunch';
154

155 156 157 158 159 160 161
  // Messages used in CocoaPodsValidator
  String cocoaPodsVersion(String version) => 'CocoaPods version $version';
  String cocoaPodsUninitialized(String consequence) =>
      'CocoaPods installed but not initialized.\n'
      '$consequence\n'
      'To initialize CocoaPods, run:\n'
      '  pod setup\n'
162
      "once to finalize CocoaPods' installation.";
163 164 165 166 167
  String cocoaPodsMissing(String consequence, String installInstructions) =>
      'CocoaPods not installed.\n'
      '$consequence\n'
      'To install:\n'
      '$installInstructions';
168 169 170 171 172
  String cocoaPodsUnknownVersion(String consequence, String upgradeInstructions) =>
      'Unknown CocoaPods version installed.\n'
      '$consequence\n'
      'To upgrade:\n'
      '$upgradeInstructions';
173 174
  String cocoaPodsOutdated(String currentVersion, String recVersion, String consequence, String upgradeInstructions) =>
      'CocoaPods $currentVersion out of date ($recVersion is recommended).\n'
175 176 177
      '$consequence\n'
      'To upgrade:\n'
      '$upgradeInstructions';
178 179 180 181 182
  String cocoaPodsBrokenInstall(String consequence, String reinstallInstructions) =>
      'CocoaPods installed but not working.\n'
      '$consequence\n'
      'To re-install CocoaPods, run:\n'
      '$reinstallInstructions';
183 184 185 186 187

  // Messages used in VsCodeValidator
  String vsCodeVersion(String version) => 'version $version';
  String vsCodeLocation(String location) => 'VS Code at $location';
  String vsCodeFlutterExtensionMissing(String url) => 'Flutter extension not installed; install from\n$url';
188

189 190 191 192 193 194 195
  // Messages used in VisualStudioValidator
  String visualStudioVersion(String name, String version) => '$name version $version';
  String visualStudioLocation(String location) => 'Visual Studio at $location';
  String visualStudioMissingComponents(String workload, List<String> components) =>
      'Visual Studio is missing necessary components. Please re-run the '
      'Visual Studio installer for the "$workload" workload, and include these components:\n'
      '  ${components.join('\n  ')}';
196
  String visualStudioMissing(String workload, List<String> components) =>
197
      'Visual Studio not installed; this is necessary for Windows development.\n'
198
      'Download at https://visualstudio.microsoft.com/downloads/.\n'
199 200 201 202 203
      'Please install the "$workload" workload, including the following components:\n  ${components.join('\n  ')}';
  String visualStudioTooOld(String minimumVersion, String workload, List<String> components) =>
      'Visual Studio $minimumVersion or later is required.\n'
      'Download at https://visualstudio.microsoft.com/downloads/.\n'
      'Please install the "$workload" workload, including the following components:\n  ${components.join('\n  ')}';
204 205 206 207 208 209
  String get visualStudioIsPrerelease => 'The current Visual Studio installation is a pre-release version. It may not be '
      'supported by Flutter yet.';
  String get visualStudioNotLaunchable =>
      'The current Visual Studio installation is not launchable. Please reinstall Visual Studio.';
  String get visualStudioIsIncomplete => 'The current Visual Studio installation is incomplete. Please reinstall Visual Studio.';
  String get visualStudioRebootRequired => 'Visual Studio requires a reboot of your system to complete installation.';
210

211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
  // Messages used in FlutterCommand
  String flutterElapsedTime(String name, String elapsedTime) => '"flutter $name" took $elapsedTime.';
  String get flutterNoDevelopmentDevice =>
      "Unable to locate a development device; please run 'flutter doctor' "
      'for information about installing additional components.';
  String flutterNoMatchingDevice(String deviceId) => 'No devices found with name or id '
      "matching '$deviceId'";
  String get flutterNoDevicesFound => 'No devices found';
  String get flutterNoSupportedDevices => 'No supported devices connected.';
  String flutterFoundSpecifiedDevices(int count, String deviceId) =>
      'Found $count devices with name or id matching $deviceId:';
  String get flutterSpecifyDeviceWithAllOption =>
      'More than one device connected; please specify a device with '
      "the '-d <deviceId>' flag, or use '-d all' to act on all devices.";
  String get flutterSpecifyDevice =>
      'More than one device connected; please specify a device with '
      "the '-d <deviceId>' flag.";
  String get flutterNoConnectedDevices => 'No connected devices.';
  String get flutterNoPubspec =>
      'Error: No pubspec.yaml file found.\n'
      'This command should be run from the root of your Flutter project.\n'
      'Do not run this command from the root of your git clone of Flutter.';
  String flutterTargetFileMissing(String path) => 'Target file "$path" not found.';
  String get flutterBasePatchFlagsExclusive => 'Error: Only one of --baseline, --patch is allowed.';
  String get flutterBaselineRequiresTraceFile => 'Error: --baseline requires --compilation-trace-file to be specified.';
  String get flutterPatchRequiresTraceFile => 'Error: --patch requires --compilation-trace-file to be specified.';

  // Messages used in FlutterCommandRunner
  String runnerNoRoot(String error) => 'Unable to locate flutter root: $error';
  String runnerWrapColumnInvalid(dynamic value) =>
      'Argument to --wrap-column must be a positive integer. You supplied $value.';
  String runnerWrapColumnParseError(dynamic value) =>
      'Unable to parse argument --wrap-column=$value. Must be a positive integer.';
  String runnerBugReportFinished(String zipFileName) =>
      'Bug report written to $zipFileName.\n'
      'Warning: this bug report contains local paths, device identifiers, and log snippets.';
  String get runnerNoRecordTo => 'record-to location not specified';
  String get runnerNoReplayFrom => 'replay-from location not specified';
249 250
  String runnerNoEngineSrcDir(String enginePackageName, String engineEnvVar) =>
      'Unable to detect local Flutter engine src directory.\n'
251 252 253 254 255
      'Either specify a dependency_override for the $enginePackageName package in your pubspec.yaml and '
      'ensure --package-root is set if necessary, or set the \$$engineEnvVar environment variable, or '
      'use --local-engine-src-path to specify the path to the root of your flutter/engine repository.';
  String runnerNoEngineBuildDirInPath(String engineSourcePath) =>
      'Unable to detect a Flutter engine build directory in $engineSourcePath.\n'
256 257
      "Please ensure that $engineSourcePath is a Flutter engine 'src' directory and that "
      "you have compiled the engine in that directory, which should produce an 'out' directory";
258 259 260 261 262
  String get runnerLocalEngineRequired =>
      'You must specify --local-engine if you are using a locally built engine.';
  String runnerNoEngineBuild(String engineBuildPath) =>
      'No Flutter engine build found at $engineBuildPath.';
  String runnerWrongFlutterInstance(String flutterRoot, String currentDir) =>
263
      "Warning: the 'flutter' tool you are currently running is not the one from the current directory:\n"
264 265 266
      '  running Flutter  : $flutterRoot\n'
      '  current directory: $currentDir\n'
      'This can happen when you have multiple copies of flutter installed. Please check your system path to verify '
267
      "that you're running the expected version (run 'flutter --version' to see which flutter is on your path).\n";
268 269
  String runnerRemovedFlutterRepo(String flutterRoot, String flutterPath) =>
      'Warning! This package referenced a Flutter repository via the .packages file that is '
270
      "no longer available. The repository from which the 'flutter' tool is currently "
271 272 273 274 275 276
      'executing will be used instead.\n'
      '  running Flutter tool: $flutterRoot\n'
      '  previous reference  : $flutterPath\n'
      'This can happen if you deleted or moved your copy of the Flutter repository, or '
      'if it was on a volume that is no longer mounted or has been mounted at a '
      'different location. Please check your system path to verify that you are running '
277
      "the expected version (run 'flutter --version' to see which flutter is on your path).\n";
278
  String runnerChangedFlutterRepo(String flutterRoot, String flutterPath) =>
279
      "Warning! The 'flutter' tool you are currently running is from a different Flutter "
280
      'repository than the one last used by this package. The repository from which the '
281
      "'flutter' tool is currently executing will be used instead.\n"
282 283 284 285
      '  running Flutter tool: $flutterRoot\n'
      '  previous reference  : $flutterPath\n'
      'This can happen when you have multiple copies of flutter installed. Please check '
      'your system path to verify that you are running the expected version (run '
286
      "'flutter --version' to see which flutter is on your path).\n";
287 288 289 290 291 292 293 294
  String invalidVersionSettingHintMessage(String invalidVersion) =>
      'Invalid version $invalidVersion found, default value will be used.\n'
      'In pubspec.yaml, a valid version should look like: build-name+build-number.\n'
      'In Android, build-name is used as versionName while build-number used as versionCode.\n'
      'Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n'
      'In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n'
      'Read more about iOS versioning at\n'
      'https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\n';
295 296 297 298 299 300 301 302 303 304 305 306 307 308

  String _androidSdkInstallUrl(Platform platform) {
    const String baseUrl = 'https://flutter.dev/docs/get-started/install';
    const String fragment = '#android-setup';
    if (platform.isMacOS) {
      return '$baseUrl/macos$fragment';
    } else if (platform.isLinux) {
      return '$baseUrl/linux$fragment';
    } else if (platform.isWindows) {
      return '$baseUrl/windows$fragment';
    } else {
      return baseUrl;
    }
  }
309
}