Skip to content

🔢 版本

获取 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 解析为结构化字段。

go
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"`
}
字段类型说明
Versionstring完整版本号,如 2.6.6
FullOutputstring原始命令输出
Major / Minor / Patchint主/次/补丁号
ReleaseDatetime.Time发布日期(解析失败则零值)

VersionConstraint

version_constraints.go 中定义的版本约束类型常量,用于 FormatVersionConstraint / UpdatePackageVersion

go
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.*
)

方法签名

方法签名说明
🔢 GetVersionfunc (c *Composer) GetVersion() (string, error)解析出 Composer 版本号字符串
📊 GetVersionInfofunc (c *Composer) GetVersionInfo() (*VersionInfo, error)结构化版本信息
⬆️ SelfUpdatefunc (c *Composer) SelfUpdate() errorcomposer self-update
🧩 FormatVersionConstraintfunc FormatVersionConstraint(version string, constraintType VersionConstraint) string按类型生成约束字符串
🎚️ UpdatePackageVersionfunc (c *Composer) UpdatePackageVersion(packageName string, version string, constraintType VersionConstraint) error用指定约束更新包版本
🔒 LockPackageVersionfunc (c *Composer) LockPackageVersion(packageName string, version string) error锁定到精确版本
📋 GetPackageVersionsfunc (c *Composer) GetPackageVersions(packageName string) (string, error)composer show --all <pkg> 文本输出
🔧 ParseVersionOutputfunc ParseVersionOutput(output string) (*VersionInfo, error)解析 --version 输出

参数说明

FormatVersionConstraint / UpdatePackageVersion

参数类型说明
versionstring基础版本号,如 1.21.2.3
constraintTypeVersionConstraint约束类型常量

示例

自检 Composer 版本

go
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)
		}
	}
}

程序化生成版本约束

go
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 约束更新依赖

go
if err := comp.UpdatePackageVersion("symfony/console", "5.4", composer.CaretVersion); err != nil {
	log.Fatal(err)
}
// 等价于 composer require symfony/console ^5.4

锁定关键依赖到精确版本

go
// 部署前冻结版本,保证可复现
if err := comp.LockPackageVersion("symfony/console", "5.4.20"); err != nil {
	log.Fatal(err)
}
// 等价于 composer require symfony/console 5.4.20

列出某包所有可用版本

go
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

基于 MIT 许可证发布