Skip to content

🏭 Satis

用 Go 编排 Satis 私有包仓库的配置生成与构建流程——创建 satis.json、追加仓库、构建静态仓库、调整稳定性、启用归档、追加依赖。

Satis 是 Composer 官方的私有包仓库生成器,把多个 VCS 仓库打包成一个可供 composer 拉取的静态仓库。Satis 本身是独立可执行文件,本模块假定它已通过 composer global require 安装并可被 composer satis 调用。

何时使用

  • 🏢 企业内网要建一个私有 Composer 仓库镜像多个 GitLab 项目。
  • 📦 CI 里把 Satis 配置的增改纳入版本控制,每次仓库变动后自动 build
  • 🔒 离线环境预构建归档(--archive),让部署机无需访问源码仓库。
  • 🎛️ 动态切换最小稳定性(dev / RC / stable)以满足不同阶段需求。

结构化类型

SatisConfig

CreateSatisConfig 写出、AddSatisRepository 等方法读改的顶层结构。

go
type SatisConfig struct {
    Name                   string                 `json:"name"`
    Homepage               string                 `json:"homepage"`
    Repositories           []map[string]string    `json:"repositories"`
    OutputDir              string                 `json:"output-dir"`
    RequireAll             bool                   `json:"require-all,omitempty"`
    RequireDependencies    bool                   `json:"require-dependencies,omitempty"`
    RequireDevDependencies bool                   `json:"require-dev-dependencies,omitempty"`
    Require                map[string]string      `json:"require,omitempty"`
    Archive                map[string]interface{} `json:"archive,omitempty"`
    MinimumStability       string                 `json:"minimum-stability,omitempty"`
    Providers              bool                   `json:"providers,omitempty"`
    ProvidersURL           string                 `json:"providers-url,omitempty"`
    Config                 map[string]interface{} `json:"config,omitempty"`
    Notify                 map[string]interface{} `json:"notify,omitempty"`
    TwigTemplate           string                 `json:"twig-template,omitempty"`
}

方法签名

方法签名说明
🏗️ CreateSatisConfigfunc (c *Composer) CreateSatisConfig(configPath string, name string, homepage string) error写出初始 satis.json
➕ AddSatisRepositoryfunc (c *Composer) AddSatisRepository(configPath string, type_ string, url string) error追加一个仓库
🏭 BuildSatisfunc (c *Composer) BuildSatis(configPath string, outputDir string) (string, error)执行 satis build
🚀 InitSatisfunc (c *Composer) InitSatis(name string, homepage string, dir string) error创建目录并写出配置
🎚️ UpdateSatisStabilityfunc (c *Composer) UpdateSatisStability(configPath string, stability string) error更新最小稳定性
🗜️ EnableSatisArchivefunc (c *Composer) EnableSatisArchive(configPath string, format string) error启用归档功能
📌 AddSatisRequirefunc (c *Composer) AddSatisRequire(configPath string, packageName string, version string) error追加依赖并关闭 require-all

参数说明

CreateSatisConfig / InitSatis

参数类型说明
configPath / dirstring配置文件路径 / 输出目录(InitSatis 在其下创建 satis.json
namestring仓库名称,如 acme/private-packages
homepagestring仓库主页 URL,也是包被引用的根地址

AddSatisRepository

参数类型说明
type_string仓库类型,如 vcsgitcomposer
urlstring仓库地址

UpdateSatisStability

参数类型说明
stabilitystring必须是 dev / alpha / beta / RC / stable 之一

EnableSatisArchive

参数类型说明
formatstring归档格式,空则默认 zip

示例

从零初始化并构建

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

	// 初始化 satis 目录与配置
	if err := comp.InitSatis("acme/private-packages", "https://packages.acme.io", "satis"); err != nil {
		log.Fatal(err)
	}
	configPath := "satis/satis.json"

	// 追加两个 VCS 仓库
	if err := comp.AddSatisRepository(configPath, "vcs", "git@gitlab.acme.io:lib/logger.git"); err != nil {
		log.Fatal(err)
	}
	if err := comp.AddSatisRepository(configPath, "vcs", "git@gitlab.acme.io:lib/auth.git"); err != nil {
		log.Fatal(err)
	}

	// 启用归档 + 锁定稳定性
	if err := comp.EnableSatisArchive(configPath, "tar"); err != nil {
		log.Fatal(err)
	}
	if err := comp.UpdateSatisStability(configPath, "stable"); err != nil {
		log.Fatal(err)
	}

	// 构建
	out, err := comp.BuildSatis(configPath, "satis/public")
	if err != nil {
		log.Fatalf("构建失败: %v", err)
	}
	fmt.Println(out)
}

精确指定依赖(关闭 require-all)

go
// AddSatisRequire 会自动把 RequireAll 置为 false
if err := comp.AddSatisRequire(configPath, "acme/logger", "^2.0"); err != nil {
	log.Fatal(err)
}
if err := comp.AddSatisRequire(configPath, "acme/auth", "^1.5"); err != nil {
	log.Fatal(err)
}

进阶

UpdateSatisStability 的取值校验

传入非 dev/alpha/beta/RC/stable 的值会返回 invalid stability: <value> 错误,配置文件不会被修改。

AddSatisRequire 的副作用

调用一次 AddSatisRequire 就会把 RequireAll 设为 false,意味着 Satis 只构建 Require 中列出的包而非全部。如果你想要「全部 + 额外几个」,不要用这个方法,直接手工编辑 Require 并保持 RequireAll=true

BuildSatis 的 outputDir 留空

BuildSatisoutputDir 为空字符串时执行 satis build <configPath>(用配置文件里的 output-dir);非空则追加第二个参数覆盖输出目录。

基于 MIT 许可证发布