106 lines
2.9 KiB
Go
106 lines
2.9 KiB
Go
package deps
|
|
|
|
import (
|
|
"encoding/json"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/engigu/baihu-panel/internal/models"
|
|
)
|
|
|
|
// ParseManifest 根据语言解析依赖清单文件内容
|
|
func ParseManifest(language, content string) ([]models.Dependency, error) {
|
|
lang := strings.ToLower(language)
|
|
if strings.Contains(lang, "python") {
|
|
return ParseRequirements(content), nil
|
|
}
|
|
if strings.Contains(lang, "node") {
|
|
return ParsePackageJson(content)
|
|
}
|
|
return []models.Dependency{}, nil
|
|
}
|
|
|
|
// ParseRequirements 解析 Python requirements.txt
|
|
func ParseRequirements(content string) []models.Dependency {
|
|
var deps []models.Dependency
|
|
// 使用正则表达式按行分割,兼容 Windows 和 Linux 的换行符
|
|
lines := regexp.MustCompile(`\r?\n`).Split(content, -1)
|
|
|
|
// 用于分割包名和版本的正则 (支持 ==, >=, <=, ~=, >, <, @)
|
|
versionRegex := regexp.MustCompile(`[=><~@]+`)
|
|
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
// 忽略空行、注释行以及参数行 (以 - 开头的行如 -i, -r)
|
|
if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, "-") {
|
|
continue
|
|
}
|
|
|
|
// 分割名称与版本
|
|
parts := versionRegex.Split(line, 2)
|
|
name := strings.TrimSpace(parts[0])
|
|
version := ""
|
|
if len(parts) > 1 {
|
|
// 清除可能存在的后续参数,比如 requests==2.31.0 --hash=sha256:...
|
|
versionPart := strings.TrimSpace(parts[1])
|
|
|
|
// 如果有逗号分隔的多个范围限制,比如 >=1.20,<2.0,只取第一个范围作为参考版本号
|
|
if idx := strings.Index(versionPart, ","); idx != -1 {
|
|
versionPart = versionPart[:idx]
|
|
}
|
|
|
|
versionFields := strings.Fields(versionPart)
|
|
if len(versionFields) > 0 {
|
|
version = strings.TrimSpace(versionFields[0])
|
|
// 清除可能残留的首部版本符号
|
|
version = strings.TrimLeft(version, "=><~@ ")
|
|
}
|
|
}
|
|
|
|
if name != "" {
|
|
deps = append(deps, models.Dependency{
|
|
Name: name,
|
|
Version: version,
|
|
Language: "python3",
|
|
})
|
|
}
|
|
}
|
|
return deps
|
|
}
|
|
|
|
// PackageJson 代表 package.json 的结构定义
|
|
type PackageJson struct {
|
|
Dependencies map[string]string `json:"dependencies"`
|
|
DevDependencies map[string]string `json:"devDependencies"`
|
|
}
|
|
|
|
// ParsePackageJson 解析 Node.js package.json
|
|
func ParsePackageJson(content string) ([]models.Dependency, error) {
|
|
var pkg PackageJson
|
|
if err := json.Unmarshal([]byte(content), &pkg); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var deps []models.Dependency
|
|
collect := func(m map[string]string, isDev bool) {
|
|
for name, versionRange := range m {
|
|
// 移除 npm 常见版本范围修饰符(如 ^1.2.3 或 ~2.3.0,保留底线版本号)
|
|
version := strings.TrimLeft(versionRange, "^~>=<* ")
|
|
remark := ""
|
|
if isDev {
|
|
remark = "devDependencies"
|
|
}
|
|
deps = append(deps, models.Dependency{
|
|
Name: name,
|
|
Version: version,
|
|
Language: "node",
|
|
Remark: remark,
|
|
})
|
|
}
|
|
}
|
|
|
|
collect(pkg.Dependencies, false)
|
|
collect(pkg.DevDependencies, true)
|
|
return deps, nil
|
|
}
|