fix: recursively search for package_config.json to support workspace resolution

This commit is contained in:
Max 2025-12-12 10:49:21 +08:00
parent a4e7a7453e
commit ceb91a0ea3
1 changed files with 35 additions and 8 deletions

View File

@ -87,9 +87,27 @@ class TemplateLoader {
final dirs = <String>[];
try {
// .dart_tool/package_config.json
final packageConfigFile = File('.dart_tool/package_config.json');
if (!packageConfigFile.existsSync()) {
// .dart_tool/package_config.json
File? packageConfigFile;
var currentDir = Directory.current;
const maxDepth = 6; // monorepo
var depth = 0;
while (depth < maxDepth) {
final checkFile =
File(p.join(currentDir.path, '.dart_tool', 'package_config.json'));
if (checkFile.existsSync()) {
packageConfigFile = checkFile;
break;
}
final parent = currentDir.parent;
if (parent.path == currentDir.path) break;
currentDir = parent;
depth++;
}
if (packageConfigFile == null) {
return dirs;
}
@ -103,7 +121,7 @@ class TemplateLoader {
);
if (package != null) {
final rootUri = package['rootUri'] as String;
var rootUri = package['rootUri'] as String;
String packagePath;
// file://
@ -117,18 +135,27 @@ class TemplateLoader {
// .dart_tool/package_config.json
if (!p.isAbsolute(packagePath)) {
// package_config.json .dart_tool
packagePath = p.normalize(p.join('.dart_tool', packagePath));
// package_config.json packageConfigFile.parent (.dart_tool)
packagePath =
p.normalize(p.join(packageConfigFile.parent.path, packagePath));
}
//
final templateDir = p.join(packagePath, 'lib', 'templates');
// 1. lib/templates ()
var templateDir = p.join(packagePath, 'lib', 'templates');
if (Directory(templateDir).existsSync()) {
dirs.add(templateDir);
} else {
// 2. templates ()
templateDir = p.join(packagePath, 'templates');
if (Directory(templateDir).existsSync()) {
dirs.add(templateDir);
}
}
}
} catch (_) {
} catch (e) {
//
print('Warning: Failed to load package templates: $e');
}
return dirs;