📦 依赖管理
本页讲解 pkg/composer 中与项目依赖安装、更新、自动加载相关的方法,定义在 dependencies.go 与 additional_methods.go。它们对应 composer 的 install、update、dump-autoload、suggests、fund、audit 等子命令。
🎯 何时使用
- 📥 克隆项目后第一次安装依赖 →
Install - 🔄 把依赖升级到最新版本 →
Update - ⚡ 重新生成自动加载器(新增类后) →
DumpAutoload - 🧪 想预演一次安装/更新而不真正改动 →
InstallDryRun/UpdateDryRun - 🏭 生产部署需要极致优化 →
InstallWithClassmapAuthoritative/InstallWithAPCu - 🔒 只修复
composer.lock哈希而不动包版本 →UpdateWithLock
📋 方法总览
下表列出依赖管理相关的全部方法。带 WithOptions 的变体接受 map[string]string 自定义 composer 长选项;带 DryRun 的变体只模拟不真正执行。
| 方法 | 签名概要 | 等价命令 |
|---|---|---|
📥 Install | Install(noDev bool, optimize bool) error | composer install [--no-dev] [--optimize-autoloader] |
InstallWithOptions | InstallWithOptions(options map[string]string) error | composer install [options] |
InstallWithPreferSource | InstallWithPreferSource() error | composer install --prefer-source |
InstallWithPreferDist | InstallWithPreferDist() error | composer install --prefer-dist |
InstallNoScripts | InstallNoScripts() error | composer install --no-scripts |
InstallWithClassmapAuthoritative | InstallWithClassmapAuthoritative() error | composer install --classmap-authoritative |
InstallWithAPCu | InstallWithAPCu() error | composer install --apcu-autoloader |
InstallNoDev | InstallNoDev() error | composer install --no-dev |
InstallWithWorkingDir | InstallWithWorkingDir(workingDir string, noDev bool, optimize bool) error | 在指定目录执行 install |
🧪 InstallDryRun | InstallDryRun() (string, error) | composer install --dry-run |
🔄 Update | Update(packages []string, noDev bool) error | composer update [--no-dev] [packages...] |
UpdateWithOptions | UpdateWithOptions(packages []string, options map[string]string) error | composer update [options] [packages...] |
UpdateWithPreferSource | UpdateWithPreferSource(packages []string) error | composer update --prefer-source [packages...] |
UpdateWithPreferDist | UpdateWithPreferDist(packages []string) error | composer update --prefer-dist [packages...] |
UpdateNoScripts | UpdateNoScripts(packages []string) error | composer update --no-scripts [packages...] |
UpdateNoDev | UpdateNoDev(packages []string) error | composer update --no-dev [packages...] |
UpdateWithDependencies | UpdateWithDependencies(packages []string) error | composer update --with-dependencies [packages...] |
UpdateWithAllDependencies | UpdateWithAllDependencies(packages []string) error | composer update --with-all-dependencies [packages...] |
UpdateWithLock | UpdateWithLock() error | composer update --lock |
🧪 UpdateDryRun | UpdateDryRun(packages []string) (string, error) | composer update --dry-run [packages...] |
⚡ DumpAutoload | DumpAutoload(optimize bool) error | composer dump-autoload [--optimize] |
DumpAutoloadWithOptions | DumpAutoloadWithOptions(options map[string]string) error | composer dump-autoload [options] |
🔍 CheckDependencies | CheckDependencies() (string, error) | composer check |
💡 Suggests | Suggests() error | composer suggests |
💰 FundPackages | FundPackages() (string, error) | composer fund |
🔒 RunAudit | RunAudit() (string, error) | composer audit |
选项 map 的约定
*WithOptions 接收的 map[string]string,键是 composer 长选项名(不含 --),值若为空串 "" 则视为纯开关选项(只加 --key),否则生成 --key=value。例如 {"no-dev": "", "prefer-dist": ""} 会拼成 --no-dev --prefer-dist。
📥 Install
安装项目的所有依赖,基于 composer.json。这是最常用的方法。
签名
func (c *Composer) Install(noDev bool, optimize bool) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
noDev | bool | true 则加 --no-dev,不安装 require-dev 中的开发依赖 |
optimize | bool | true 则加 --optimize-autoloader,优化自动加载器 |
返回值
| 类型 | 说明 |
|---|---|
error | 失败时返回包裹了 ErrInstallFailed 的错误 |
示例
// 安装所有依赖(包括开发依赖)
err := comp.Install(false, false)
if err != nil {
log.Fatalf("安装依赖失败: %v", err)
}
// 只安装生产依赖并优化自动加载(生产部署常用)
err = comp.Install(true, true)进阶
- 需要更多选项时用
InstallWithOptions。 - 想预演而不真正安装用
InstallDryRun。
⚙️ InstallWithOptions
使用自定义选项安装依赖,支持任意 composer 长选项组合。
签名
func (c *Composer) InstallWithOptions(options map[string]string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
options | map[string]string | 安装选项映射,键为选项名,值为选项值(空串表示开关) |
示例
options := map[string]string{
"no-dev": "",
"optimize-autoloader": "",
"prefer-dist": "",
"no-progress": "",
}
err := comp.InstallWithOptions(options)
if err != nil {
log.Fatalf("安装依赖失败: %v", err)
}🔄 Update
更新项目依赖到最新版本,可指定包名或更新全部。
签名
func (c *Composer) Update(packages []string, noDev bool) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packages | []string | 要更新的包名列表,为空切片则更新所有包 |
noDev | bool | true 则加 --no-dev |
示例
// 更新所有依赖(包括开发依赖)
err := comp.Update([]string{}, false)
// 只更新指定的包
err = comp.Update([]string{"symfony/console", "symfony/process"}, false)
// 只更新生产依赖
err = comp.Update([]string{}, true)进阶
- 想连带更新间接依赖用
UpdateWithDependencies或UpdateWithAllDependencies。 - 只刷新 lock 哈希用
UpdateWithLock。
⚙️ UpdateWithOptions
使用自定义选项更新依赖。
签名
func (c *Composer) UpdateWithOptions(packages []string, options map[string]string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packages | []string | 要更新的包名列表 |
options | map[string]string | 更新选项映射 |
示例
options := map[string]string{
"no-dev": "",
"prefer-dist": "",
"with-dependencies": "",
"no-progress": "",
}
err := comp.UpdateWithOptions([]string{"symfony/console"}, options)⚡ DumpAutoload
生成 Composer 的自动加载文件,可选择是否优化。
签名
func (c *Composer) DumpAutoload(optimize bool) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
optimize | bool | true 则加 --optimize,生成类映射(生产环境推荐) |
示例
// 生成标准自动加载文件(开发环境)
err := comp.DumpAutoload(false)
// 生成优化的自动加载文件(生产部署)
err = comp.DumpAutoload(true)进阶
- 需要更多选项(如
--classmap-authoritative、--apcu、--no-dev)用DumpAutoloadWithOptions。
⚙️ DumpAutoloadWithOptions
使用自定义选项生成自动加载文件。
签名
func (c *Composer) DumpAutoloadWithOptions(options map[string]string) error示例
options := map[string]string{
"optimize": "",
"classmap-authoritative": "",
"apcu": "",
"no-dev": "",
}
err := comp.DumpAutoloadWithOptions(options)🔒 UpdateWithLock
仅更新 composer.lock 文件的哈希值,不实际更新任何包版本。当 composer.lock 哈希与 composer.json 不同步时用来修复。
签名
func (c *Composer) UpdateWithLock() error示例
err := comp.UpdateWithLock()
if err != nil {
log.Fatalf("更新 lock 文件失败: %v", err)
}🧪 InstallDryRun / UpdateDryRun
模拟执行安装/更新,不真正改动文件系统,常用于 CI 预演或检查会变更哪些包。
签名
func (c *Composer) InstallDryRun() (string, error)
func (c *Composer) UpdateDryRun(packages []string) (string, error)参数(UpdateDryRun)
| 参数 | 类型 | 说明 |
|---|---|---|
packages | []string | 要模拟更新的包名列表,为空则模拟更新所有包 |
返回值
| 类型 | 说明 |
|---|---|
string | 模拟执行的输出结果 |
error | 执行错误 |
示例
output, err := comp.InstallDryRun()
if err != nil {
log.Fatalf("模拟安装失败: %v", err)
}
fmt.Println(output)
output, err = comp.UpdateDryRun([]string{"symfony/console"})🏭 单选项快捷方法
以下方法各自只附加一个固定选项,签名简单、语义清晰:
| 方法 | 等价命令 | 说明 |
|---|---|---|
InstallWithPreferSource() error | install --prefer-source | 强制从源码(Git)安装,便于调试/改源码 |
InstallWithPreferDist() error | install --prefer-dist | 强制从分发包(zip)安装,速度快,适合生产 |
InstallNoScripts() error | install --no-scripts | 跳过脚本执行,CI/CD 常用 |
InstallWithClassmapAuthoritative() error | install --classmap-authoritative | 权威类映射,仅从类映射加载,提升生产性能 |
InstallWithAPCu() error | install --apcu-autoloader | 启用 APCu 缓存自动加载,需 PHP APCu 扩展 |
InstallNoDev() error | install --no-dev | 不安装开发依赖 |
UpdateWithPreferSource(packages []string) error | update --prefer-source [packages...] | 从源码更新 |
UpdateWithPreferDist(packages []string) error | update --prefer-dist [packages...] | 从分发包更新 |
UpdateNoScripts(packages []string) error | update --no-scripts [packages...] | 跳过脚本更新 |
UpdateNoDev(packages []string) error | update --no-dev [packages...] | 不更新开发依赖 |
UpdateWithDependencies(packages []string) error | update --with-dependencies [packages...] | 连带更新依赖 |
UpdateWithAllDependencies(packages []string) error | update --with-all-dependencies [packages...] | 递归更新所有依赖 |
示例
// 生产部署:分发包 + 不跑脚本 + 权威类映射
_ = comp.InstallWithPreferDist()
_ = comp.InstallNoScripts()
_ = comp.InstallWithClassmapAuthoritative()
// 连带依赖更新指定包
_ = comp.UpdateWithDependencies([]string{"symfony/console"})
_ = comp.UpdateWithAllDependencies([]string{"symfony/console"})APCu 前置条件
InstallWithAPCu 需要 PHP 安装并启用 APCu 扩展,否则 composer 会报错。
📁 InstallWithWorkingDir
在指定工作目录执行 install,执行完毕后恢复原工作目录。适合一次性操作别的项目而不影响实例默认目录。
签名
func (c *Composer) InstallWithWorkingDir(workingDir string, noDev bool, optimize bool) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
workingDir | string | 工作目录路径 |
noDev | bool | 是否跳过开发依赖 |
optimize | bool | 是否优化自动加载器 |
示例
err := comp.InstallWithWorkingDir("/srv/other-app", true, true)
if err != nil {
log.Fatalf("安装失败: %v", err)
}进阶
- 实现上临时修改
c.workingDir,用defer恢复原值;若执行过程中发生 panic 也能恢复。 - 更通用的"在别的目录跑任意命令"可用
ExecWithWorkingDir(见 exec)。
🔍 CheckDependencies
检查 composer.json 与 composer.lock 是否同步、依赖是否有冲突。
签名
func (c *Composer) CheckDependencies() (string, error)示例
output, err := comp.CheckDependencies()
if err != nil {
log.Fatalf("检查依赖失败: %v", err)
}
fmt.Println("依赖检查结果:", output)💡 Suggests
查看并安装建议的软件包(composer suggests)。
签名
func (c *Composer) Suggests() error进阶
- 想带选项用
SuggestsWithOptions(options map[string]string) (string, error)。 - 想查某个特定包的建议用
SuggestsForPackage(packageName string) (string, error)。
💰 FundPackages / 🔒 RunAudit
| 方法 | 签名 | 等价命令 |
|---|---|---|
FundPackages | FundPackages() (string, error) | composer fund — 列出可捐赠的包 |
RunAudit | RunAudit() (string, error) | composer audit — 查找已知安全漏洞 |
fundOutput, _ := comp.FundPackages()
auditOutput, _ := comp.RunAudit()更强的审计能力
RunAudit 返回原始文本。想要结构化漏洞列表、按严重级别筛选,请用 安全审计 模块的 GetAuditInfo()、HasVulnerabilities()、GetHighSeverityVulnerabilities()。