Skip to content

🏗️ 项目管理

Composer SDK 的项目管理模块覆盖项目从创建、初始化、脚本执行到打包归档的完整生命周期。所有方法都挂在核心类型 Composer 上,定义在 pkg/composer/project.go

包路径:github.com/scagogogo/composer-skills/pkg/composer

能力一览 🏗️

方法作用返回值
CreateProject基于骨架包创建新项目error
CreateProjectWithOptions创建项目并附带额外选项error
InitProject交互式初始化 composer.jsonerror
InitProjectWithOptions非交互式初始化并指定名称/描述/作者error
RunScript执行 composer.json 中定义的脚本,可传参(string, error)
ExecuteScriptcomposer run 执行自定义脚本(string, error)
ArchiveProject把当前项目打包成 zip/tar 归档error
GetProjectInfo解析当前项目基本信息(名称、描述、类型、依赖)(*ComposerJsonInfo, error)
ListScripts列出 composer.json 中定义的全部脚本(string, error)

关键类型

ComposerJsonInfoGetProjectInfo 的结构化返回,定义在本文件中,仅包含项目最常被读取的几个字段。


🏗️ CreateProject

基于指定包名创建一个新项目,等价于 composer create-project package/name directory version

何时使用

需要从某个骨架包(如 laravel/laravelsymfony/website-skeleton)拉起一个全新工程时使用。

签名

go
func (c *Composer) CreateProject(packageName string, directory string, version string) error

参数

参数类型说明
packageNamestring包名,例如 laravel/laravel
directorystring项目落地目录
versionstring版本约束,空字符串表示最新版本

返回值

  • error:创建过程中发生的错误。

示例

go
package main

import (
	"log"

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

func main() {
	comp, err := composer.New(composer.DefaultOptions())
	if err != nil {
		log.Fatalf("初始化 Composer 失败: %v", err)
	}

	// 创建最新版本的 Laravel 项目
	if err := comp.CreateProject("laravel/laravel", "my-project", ""); err != nil {
		log.Fatalf("创建项目失败: %v", err)
	}

	// 创建指定版本的 Symfony 项目
	if err := comp.CreateProject("symfony/website-skeleton", "symfony-project", "^5.0"); err != nil {
		log.Fatalf("创建项目失败: %v", err)
	}
}

进阶

需要 --no-dev--prefer-dist、自定义仓库等额外参数时,使用 CreateProjectWithOptions


🏗️ CreateProjectWithOptions

带额外选项创建项目,等价于 composer create-project [options] package/name[:version] directory

何时使用

默认 CreateProject 不够用、需要控制安装方式(无开发依赖、镜像源、稳定性等)时使用。

签名

go
func (c *Composer) CreateProjectWithOptions(packageName string, directory string, version string, options map[string]string) error

参数

参数类型说明
packageNamestring包名
directorystring项目落地目录
versionstring版本约束,空字符串表示最新版本
optionsmap[string]string额外选项,键为选项名,值为选项值(值空字符串表示开关型选项)

选项构造规则

options 经内部 buildOptionsArgs 处理:键按字典序排序后,值为空则生成 --key,否则生成 --key=value,保证命令构造确定性。

返回值

  • error:创建过程中发生的错误。

示例

go
// 创建无开发依赖的 Laravel 项目
options := map[string]string{
	"no-dev":      "",
	"prefer-dist": "",
}
if err := comp.CreateProjectWithOptions("laravel/laravel", "my-project", "", options); err != nil {
	log.Fatalf("创建项目失败: %v", err)
}

// 从私有仓库创建指定稳定性的 Symfony 项目
options = map[string]string{
	"stability":   "dev",
	"repository":  "https://example.org/private-repo",
}
if err := comp.CreateProjectWithOptions("symfony/website-skeleton", "symfony-project", "^5.0", options); err != nil {
	log.Fatalf("创建项目失败: %v", err)
}

🏗️ InitProject

交互式初始化一个新项目,等价于 composer init

何时使用

在空目录里手搓一个 composer.json 时使用。命令会以交互方式询问项目信息。

签名

go
func (c *Composer) InitProject() error

返回值

  • error:初始化过程中发生的错误。

示例

go
if err := comp.InitProject(); err != nil {
	log.Fatalf("初始化项目失败: %v", err)
}

进阶

在自动化脚本/CI 中无法交互时,改用 InitProjectWithOptions 一次性传入项目元信息。


🏗️ InitProjectWithOptions

非交互式初始化项目,等价于 composer init --name=... --description=... --author=... [options]

何时使用

需要在 CI、脚手架、容器等无 TTY 的环境里生成 composer.json 时使用。

签名

go
func (c *Composer) InitProjectWithOptions(name string, description string, author string, options map[string]string) error

参数

参数类型说明
namestring项目名称,格式 vendor/name
descriptionstring项目描述
authorstring作者信息,格式 Name <email>
optionsmap[string]string额外选项,如 typelicenseno-interaction

返回值

  • error:初始化过程中发生的错误。

示例

go
options := map[string]string{
	"type":           "library",
	"license":        "MIT",
	"no-interaction": "",
}
if err := comp.InitProjectWithOptions(
	"myvendor/awesome-lib",
	"一个很棒的PHP库",
	"张三 <zhangsan@example.com>",
	options,
); err != nil {
	log.Fatalf("初始化项目失败: %v", err)
}

🏗️ RunScript

执行 composer.json 中定义的脚本并传参,等价于 composer run-script script-name -- arg1 arg2

何时使用

在程序里触发 testbuilddeploy 等已定义脚本,且需要向脚本透传额外参数时使用。

签名

go
func (c *Composer) RunScript(scriptName string, args ...string) (string, error)

参数

参数类型说明
scriptNamestring要执行的脚本名称
args...string透传给脚本的额外参数

返回值

  • string:命令执行的输出结果。
  • error:执行过程中发生的错误。

示例

go
output, err := comp.RunScript("test", "--filter=UserTest")
if err != nil {
	log.Fatalf("执行脚本失败: %v", err)
}
fmt.Println(output)

🏗️ ExecuteScript

composer run 执行 composer.json 中定义的自定义脚本,等价于 composer run script-name

何时使用

执行自定义脚本(非 Composer 内置脚本事件)时使用。与 RunScript 的区别在于它走 composer run 命令,且不接受透传参数。

签名

go
func (c *Composer) ExecuteScript(scriptName string) (string, error)

参数

参数类型说明
scriptNamestring要执行的脚本名称

返回值

  • string:命令执行的输出结果。
  • error:执行过程中发生的错误。

示例

go
output, err := comp.ExecuteScript("deploy")
if err != nil {
	log.Fatalf("执行脚本失败: %v", err)
}
fmt.Println(output)

🏗️ ArchiveProject

把当前项目打包成归档文件,等价于 composer archive --dir=directory --format=format

何时使用

需要把项目分发给离线环境或归档备份时使用。

签名

go
func (c *Composer) ArchiveProject(directory string, format string) error

参数

参数类型说明
directorystring归档输出目录,空字符串则使用默认目录
formatstring归档格式,如 ziptar,空字符串则使用默认格式

返回值

  • error:创建存档过程中发生的错误。

示例

go
// 创建 ZIP 格式的存档
if err := comp.ArchiveProject("./dist", "zip"); err != nil {
	log.Fatalf("创建存档失败: %v", err)
}

进阶

archive.go 中还有更细粒度的归档方法:ArchiveArchiveWithFormatArchiveWithOptionsArchivePackageArchivePackageWithOptions,可对任意包/版本单独归档。


🏗️ ComposerJsonInfo 类型

GetProjectInfo 返回的结构体,表示 composer.json 的部分信息。

go
type ComposerJsonInfo struct {
	Name        string            `json:"name"`
	Description string            `json:"description"`
	Type        string            `json:"type"`
	Require     map[string]string `json:"require"`
	RequireDev  map[string]string `json:"require-dev"`
}
字段类型说明
Namestring项目名称
Descriptionstring项目描述
Typestring项目类型
Requiremap[string]string生产依赖
RequireDevmap[string]string开发依赖

字段范围

ComposerJsonInfo 只覆盖最常被读取的字段。需要完整 composer.json 结构时,请使用 配置模块 中的 ReadComposerJSON(返回完整的 ComposerJSON 结构)。


🏗️ GetProjectInfo

获取当前项目基本信息,等价于执行 composer config --list --json 并解析结果。

何时使用

需要在程序里读取项目名称、描述、类型和依赖清单时使用。

签名

go
func (c *Composer) GetProjectInfo() (*ComposerJsonInfo, error)

返回值

  • *ComposerJsonInfo:包含项目基本信息的结构体指针。
  • error:获取或解析过程中发生的错误。

示例

go
info, err := comp.GetProjectInfo()
if err != nil {
	log.Fatalf("获取项目信息失败: %v", err)
}
fmt.Printf("项目名称: %s\n", info.Name)
fmt.Printf("项目描述: %s\n", info.Description)
fmt.Printf("依赖数量: %d\n", len(info.Require))

🏗️ ListScripts

列出 composer.json 中定义的所有脚本,等价于 composer run-script --list

何时使用

需要枚举当前项目可用的脚本清单(常用于脚手架、CLI 提示)时使用。

签名

go
func (c *Composer) ListScripts() (string, error)

返回值

  • string:包含所有脚本列表的输出结果。
  • error:列出脚本过程中发生的错误。

示例

go
output, err := comp.ListScripts()
if err != nil {
	log.Fatalf("列出脚本失败: %v", err)
}
fmt.Println("可用脚本:")
fmt.Println(output)

进阶

需要以结构化方式读取脚本时,可使用 便捷方法模块 中的 GetScripts,返回 map[string]interface{}

基于 MIT 许可证发布