diff --git a/lib/pipeline/render/impl/template/template_loader.dart b/lib/pipeline/render/impl/template/template_loader.dart index 86bca7a..644721f 100644 --- a/lib/pipeline/render/impl/template/template_loader.dart +++ b/lib/pipeline/render/impl/template/template_loader.dart @@ -94,25 +94,35 @@ class TemplateLoader { } final configContent = packageConfigFile.readAsStringSync(); + final config = jsonDecode(configContent) as Map; + final packages = config['packages'] as List; - // 简单的正则匹配提取 swagger_generator_flutter 的 rootUri - // 格式示例: "name": "swagger_generator_flutter", ... "rootUri": "file:///path/to/package" - final pattern = RegExp( - r'"name"\s*:\s*"swagger_generator_flutter"[^}]*"rootUri"\s*:\s*"([^"]+)"', - multiLine: true, + final package = packages.firstWhere( + (p) => p['name'] == 'swagger_generator_flutter', + orElse: () => null, ); - final match = pattern.firstMatch(configContent); - if (match != null) { - var rootUri = match.group(1)!; + if (package != null) { + final rootUri = package['rootUri'] as String; + String packagePath; - // 移除 file:// 前缀 + // 处理 file:// 协议 if (rootUri.startsWith('file://')) { - rootUri = rootUri.substring(7); + packagePath = Uri.parse(rootUri).toFilePath(); + } else { + // 处理相对路径 (相对于 .dart_tool/) + // package_config.json 中的相对路径通常是 ../ + packagePath = rootUri; + } + + // 如果不是绝对路径,需要相对于 .dart_tool/package_config.json 所在目录解析 + if (!p.isAbsolute(packagePath)) { + // package_config.json 在 .dart_tool 目录下 + packagePath = p.normalize(p.join('.dart_tool', packagePath)); } // 添加模板目录路径 - final templateDir = p.join(rootUri, 'lib', 'templates'); + final templateDir = p.join(packagePath, 'lib', 'templates'); if (Directory(templateDir).existsSync()) { dirs.add(templateDir); } diff --git a/lib/pipeline/render/impl/template_renderer.dart b/lib/pipeline/render/impl/template_renderer.dart index 5500229..06a0c57 100644 --- a/lib/pipeline/render/impl/template_renderer.dart +++ b/lib/pipeline/render/impl/template_renderer.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'package:mustache_template/mustache_template.dart';