transferPackageConfig static method
Future
transferPackageConfig({
- required String fromPackage,
- required String toPackage,
- required StdoutSession stdoutSession,
- ({String newPackageName, String oldPackageName})? packageNameReplacementInfo,
Implementation
static Future transferPackageConfig({
required String fromPackage,
required String toPackage,
required StdoutSession stdoutSession,
({
String oldPackageName,
String newPackageName
})? packageNameReplacementInfo,
}) async {
// we need to turn relative paths into absolute paths as the
// functionality to find the package config is relying on absolute paths
if (path.isRelative(fromPackage)) {
fromPackage = path.absolute(fromPackage);
}
if (path.isRelative(toPackage)) {
toPackage = path.absolute(toPackage);
}
final packageConfig =
await package_config.findPackageConfig(Directory(fromPackage));
if (packageConfig == null) {
throw Exception('No package config found for $fromPackage');
}
await package_config.savePackageConfig(packageConfig, Directory(toPackage));
// now we need to replace all references to "fromPackage" with "toPackage"
// and apply potentially given package replacements
final packageConfigFile = File(
path.join(toPackage, '.dart_tool', 'package_config.json'),
);
if (!packageConfigFile.existsSync()) {
throw Exception('No package config file found for $toPackage');
}
final packageConfigContent = await packageConfigFile.readAsString();
final packageConfigJson = jsonDecode(packageConfigContent);
for (final packageEntry in packageConfigJson['packages']) {
final rootUri = Uri.parse(packageEntry['rootUri']);
if (rootUri.isScheme('file')) {
final rootPath = rootUri.toFilePath();
if (path.equals(fromPackage, rootPath)) {
packageEntry['rootUri'] = Uri.file(toPackage).toString();
}
}
if (packageNameReplacementInfo != null) {
// adapt rootUri of root package
if (packageConfigJson['name'] ==
packageNameReplacementInfo.newPackageName) {
packageEntry['rootUri'] = '../';
}
}
}
// remove old package
if (packageNameReplacementInfo != null) {
(packageConfigJson['packages'] as List<dynamic>).removeWhere((entry) =>
entry['name'] == packageNameReplacementInfo.oldPackageName);
}
await packageConfigFile.writeAsString(jsonEncode(packageConfigJson));
}