📦 ExtractPackageNamesFromOutput
从任意文本输出中提取所有形如 vendor/package 的 Composer 包名,去重后返回列表。
何时使用
当你拿到一段日志或命令输出(如 install/require 的多行输出),需要快速收集其中提到的所有包名时使用。它用正则匹配 Composer 包名规范并自动去重。
签名
go
func ExtractPackageNamesFromOutput(output string) []string参数
| 参数 | 类型 | 说明 |
|---|---|---|
output | string | 任意命令输出文本 |
返回值
[]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)。