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>[]; final dirs = <String>[];
try { try {
// .dart_tool/package_config.json // .dart_tool/package_config.json
final packageConfigFile = File('.dart_tool/package_config.json'); File? packageConfigFile;
if (!packageConfigFile.existsSync()) { 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; return dirs;
} }
@ -103,7 +121,7 @@ class TemplateLoader {
); );
if (package != null) { if (package != null) {
final rootUri = package['rootUri'] as String; var rootUri = package['rootUri'] as String;
String packagePath; String packagePath;
// file:// // file://
@ -117,18 +135,27 @@ class TemplateLoader {
// .dart_tool/package_config.json // .dart_tool/package_config.json
if (!p.isAbsolute(packagePath)) { if (!p.isAbsolute(packagePath)) {
// package_config.json .dart_tool // package_config.json packageConfigFile.parent (.dart_tool)
packagePath = p.normalize(p.join('.dart_tool', packagePath)); 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()) { if (Directory(templateDir).existsSync()) {
dirs.add(templateDir); 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; return dirs;