🔢 版本
获取 Composer 自身版本、自我升级,以及管理项目里包的版本约束(caret / tilde / 锁定 / 范围)。
版本相关能力分布在三个文件里:version.go(GetVersion / SelfUpdate)、result_types.go(GetVersionInfo + VersionInfo + ParseVersionOutput)、version_constraints.go(VersionConstraint 常量、FormatVersionConstraint、UpdatePackageVersion、LockPackageVersion、GetPackageVersions)。本文档统一汇总。
何时使用
- 🩺 启动自检:确认 Composer 版本是否满足最低要求,过低则提示升级。
- ⬆️ 运维脚本里调用
SelfUpdate把 Composer 升到最新。 - 📌 部署前用
LockPackageVersion把关键依赖锁定到精确版本,保证可复现。 - 🎚️ 程序化生成版本约束字符串(
^1.2、~1.2.3、>=1.2 <2.0)写回composer.json。 - 🔍 列出某包所有可用版本,做兼容性矩阵分析。
结构化类型
VersionInfo
GetVersionInfo / ParseVersionOutput 返回,把 Composer version 2.6.6 2024-02-22 15:37:50 解析为结构化字段。
type VersionInfo struct {
Version string `json:"version"`
FullOutput string `json:"full_output"`
Major int `json:"major"`
Minor int `json:"minor"`
Patch int `json:"patch"`
ReleaseDate time.Time `json:"release_date,omitempty"`
}| 字段 | 类型 | 说明 |
|---|---|---|
Version | string | 完整版本号,如 2.6.6 |
FullOutput | string | 原始命令输出 |
Major / Minor / Patch | int | 主/次/补丁号 |
ReleaseDate | time.Time | 发布日期(解析失败则零值) |
VersionConstraint
version_constraints.go 中定义的版本约束类型常量,用于 FormatVersionConstraint / UpdatePackageVersion。
type VersionConstraint string
const (
ExactVersion VersionConstraint = "exact" // 1.2.3
CaretVersion VersionConstraint = "caret" // ^1.2.3
TildeVersion VersionConstraint = "tilde" // ~1.2.3
RangeVersion VersionConstraint = "range" // >=1.2.0 <2.0.0
WildcardVersion VersionConstraint = "wildcard" // 1.2.*
)方法签名
| 方法 | 签名 | 说明 |
|---|---|---|
| 🔢 GetVersion | func (c *Composer) GetVersion() (string, error) | 解析出 Composer 版本号字符串 |
| 📊 GetVersionInfo | func (c *Composer) GetVersionInfo() (*VersionInfo, error) | 结构化版本信息 |
| ⬆️ SelfUpdate | func (c *Composer) SelfUpdate() error | composer self-update |
| 🧩 FormatVersionConstraint | func FormatVersionConstraint(version string, constraintType VersionConstraint) string | 按类型生成约束字符串 |
| 🎚️ UpdatePackageVersion | func (c *Composer) UpdatePackageVersion(packageName string, version string, constraintType VersionConstraint) error | 用指定约束更新包版本 |
| 🔒 LockPackageVersion | func (c *Composer) LockPackageVersion(packageName string, version string) error | 锁定到精确版本 |
| 📋 GetPackageVersions | func (c *Composer) GetPackageVersions(packageName string) (string, error) | composer show --all <pkg> 文本输出 |
| 🔧 ParseVersionOutput | func ParseVersionOutput(output string) (*VersionInfo, error) | 解析 --version 输出 |
参数说明
FormatVersionConstraint / UpdatePackageVersion
| 参数 | 类型 | 说明 |
|---|---|---|
version | string | 基础版本号,如 1.2 或 1.2.3 |
constraintType | VersionConstraint | 约束类型常量 |
示例
自检 Composer 版本
package main
import (
"fmt"
"log"
"github.com/scagogogo/composer-skills/pkg/composer"
)
func main() {
comp, err := composer.New(composer.DefaultOptions())
if err != nil {
log.Fatalf("初始化失败: %v", err)
}
info, err := comp.GetVersionInfo()
if err != nil {
log.Fatalf("获取版本失败: %v", err)
}
fmt.Printf("Composer %d.%d.%d (发布于 %s)\n",
info.Major, info.Minor, info.Patch, info.ReleaseDate.Format("2006-01-02"))
if info.Major < 2 {
fmt.Println("⬆️ Composer 版本过低,正在升级...")
if err := comp.SelfUpdate(); err != nil {
log.Fatal(err)
}
}
}程序化生成版本约束
fmt.Println(composer.FormatVersionConstraint("1.2.3", composer.ExactVersion)) // 1.2.3
fmt.Println(composer.FormatVersionConstraint("1.2.3", composer.CaretVersion)) // ^1.2.3
fmt.Println(composer.FormatVersionConstraint("1.2.3", composer.TildeVersion)) // ~1.2.3
fmt.Println(composer.FormatVersionConstraint("1.2", composer.WildcardVersion)) // 1.2.*
fmt.Println(composer.FormatVersionConstraint("1.2", composer.RangeVersion)) // >=1.2.0 <2.0.0用 caret 约束更新依赖
if err := comp.UpdatePackageVersion("symfony/console", "5.4", composer.CaretVersion); err != nil {
log.Fatal(err)
}
// 等价于 composer require symfony/console ^5.4锁定关键依赖到精确版本
// 部署前冻结版本,保证可复现
if err := comp.LockPackageVersion("symfony/console", "5.4.20"); err != nil {
log.Fatal(err)
}
// 等价于 composer require symfony/console 5.4.20列出某包所有可用版本
out, err := comp.GetPackageVersions("symfony/console")
if err != nil {
log.Fatal(err)
}
fmt.Println(out)想要结构化的版本列表
GetPackageVersions 返回原始文本。若要 []string 列表,用便捷方法 GetPackageVersionsList(见 便捷方法)。
进阶
RangeVersion 的简化处理
RangeVersion 假定输入形如 1.2,输出 >=1.2.0 <2.0.0(主版本号 +1)。它只提取第一个数字段做增量,对复杂版本(如 1.2.3)会产出 >=1.2.3.0 <2.0.0 这种不够精确的结果——复杂场景请手写约束字符串。
UpdatePackageVersion 复用 Require
UpdatePackageVersion 内部调用 RequirePackage,即对已存在的依赖重新 composer require 一次以改写版本约束。新增依赖请直接用 RequirePackage。