in lib/src/sdk_env.dart [95:155]
static Future<ToolEnvironment> create({
String? dartSdkDir,
String? flutterSdkDir,
String? pubCacheDir,
Map<String, String>? environment,
bool useGlobalDartdoc = false,
}) async {
Future<String?> resolve(String? dir) async {
if (dir == null) return null;
return Directory(dir).resolveSymbolicLinks();
}
dartSdkDir ??= cli.getSdkPath();
final resolvedDartSdk = await resolve(dartSdkDir);
final resolvedFlutterSdk = await resolve(flutterSdkDir);
final resolvedPubCache = await resolve(pubCacheDir);
final env = <String, String>{};
env.addAll(environment ?? const {});
if (resolvedPubCache != null) {
env[_pubCacheKey] = resolvedPubCache;
}
final pubEnvValues = <String>[];
final origPubEnvValue = Platform.environment[_pubEnvironmentKey] ?? '';
pubEnvValues.addAll(origPubEnvValue
.split(':')
.map((s) => s.trim())
.where((s) => s.isNotEmpty));
pubEnvValues.add('bot.pkg_pana');
env[_pubEnvironmentKey] = pubEnvValues.join(':');
// Flutter stores its internal SDK in its bin/cache/dart-sdk directory.
// We can use that directory only if Flutter SDK path was specified,
// TODO: remove this after flutter analyze gets machine-readable output.
// https://github.com/flutter/flutter/issues/23664
final flutterDartSdkDir = resolvedFlutterSdk == null
? resolvedDartSdk
: p.join(resolvedFlutterSdk, 'bin', 'cache', 'dart-sdk');
if (flutterDartSdkDir == null) {
log.warning(
'Flutter SDK path was not specified, pana will use the default '
'Dart SDK to run `dart analyze` on Flutter packages.');
}
final toolEnv = ToolEnvironment._(
resolvedDartSdk,
resolvedFlutterSdk,
resolvedPubCache,
[_join(resolvedDartSdk, 'bin', 'dart')],
[_join(resolvedDartSdk, 'bin', 'dart'), 'pub'],
[_join(resolvedDartSdk, 'bin', 'dart'), 'analyze'],
[_join(resolvedDartSdk, 'bin', 'dartdoc')],
[_join(resolvedFlutterSdk, 'bin', 'flutter'), '--no-version-check'],
[_join(flutterDartSdkDir, 'bin', 'dart'), 'analyze'],
env,
useGlobalDartdoc,
);
await toolEnv._init();
return toolEnv;
}