Skip to content

📦 ExtractPackageNamesFromOutput

从任意文本输出中提取所有形如 vendor/package 的 Composer 包名,去重后返回列表。

何时使用

当你拿到一段日志或命令输出(如 install/require 的多行输出),需要快速收集其中提到的所有包名时使用。它用正则匹配 Composer 包名规范并自动去重。

签名

go
func ExtractPackageNamesFromOutput(output string) []string

参数

参数类型说明
outputstring任意命令输出文本

返回值

  • []string:提取到的去重包名列表,保持首次出现的顺序;无匹配时为 nil

示例

go
package main

import (
	"fmt"

	"github.com/scagogogo/composer-skills/pkg/composer"
)

func main() {
	output := `Installing symfony/console (v5.4.0)
Loading from cache monolog/monolog (2.9.1)
Downloading psr/log (1.1.4)
symfony/console already installed`

	names := composer.ExtractPackageNamesFromOutput(output)
	fmt.Printf("提取到 %d 个包名:\n", len(names))
	for _, n := range names {
		fmt.Println("  -", n)
	}
	// 输出: symfony/console, monolog/monolog, psr/log(重复的 symfony/console 已去重)
}

进阶

  • 🔍 使用的正则为 ([a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*),符合 Composer 包名规范(小写字母/数字/连字符/下划线/点,vendor/package 形式)。FindAllString 后用 map 去重。
  • ⚠️ 正则不区分大小写敏感(仅匹配小写),输出含大写包名时会漏匹配;Composer 包名规范本身要求小写,通常不影响。
  • 🔗 只需提取版本号请用 ExtractVersionFromOutput
  • 📋 解析 composer show 的包列表输出还可用 ParsePackageList(output)(返回 []string,定义于 convenience.go)。

基于 MIT 许可证发布