@@ -91,20 +91,18 @@ func parsePoetry(input []byte) (*Manifest, error) {
9191 return nil , errors .WithMessage (ErrParsePoetry , "Parse toml failed" )
9292 }
9393 var m = make (map [string ]any )
94+
95+ // 解析 [tool.poetry.dependencies]
9496 if mm , ok := root .Get ("tool" , "poetry" , "dependencies" ).v .(map [string ]any ); ok {
95- for k , v := range mm {
96- m [k ] = v
97- }
97+ extractDependencies (mm , m )
9898 }
9999
100100 // 解析 [tool.poetry.group.<group_name>.dependencies]
101101 if groups , ok := root .Get ("tool" , "poetry" , "group" ).v .(map [string ]any ); ok {
102102 for _ , group := range groups {
103103 if groupMap , ok := group .(map [string ]any ); ok {
104104 if deps , ok := groupMap ["dependencies" ].(map [string ]any ); ok {
105- for k , v := range deps {
106- m [k ] = v
107- }
105+ extractDependencies (deps , m )
108106 }
109107 }
110108 }
@@ -124,6 +122,8 @@ func parsePoetry(input []byte) (*Manifest, error) {
124122 m [strings .TrimSpace (r [0 ])] = strings .TrimSpace (r [1 ])
125123 }
126124 }
125+
126+ // 构建依赖项列表
127127 var deps []model.DependencyItem
128128 for k , v := range m {
129129 v := strings .Trim (fmt .Sprint (v ), "~^* " )
@@ -142,6 +142,25 @@ func parsePoetry(input []byte) (*Manifest, error) {
142142 }, nil
143143}
144144
145+ // 提取依赖项的通用逻辑
146+ func extractDependencies (source map [string ]any , target map [string ]any ) {
147+ for k , v := range source {
148+ switch dep := v .(type ) {
149+ case string :
150+ // 直接是版本号
151+ target [k ] = dep
152+ case map [string ]any :
153+ // 处理带有 extras 的依赖项 如:vanna = { version = "0.7.9", extras = ["postgres", "mysql", "clickhouse", "duckdb"] }
154+ if version , ok := dep ["version" ].(string ); ok {
155+ target [k ] = version
156+ }
157+ default :
158+ // 其他情况,忽略
159+ continue
160+ }
161+ }
162+ }
163+
145164type tomlTree struct {
146165 v any
147166}
0 commit comments