qshell 是七牛云官方命令行工具,模块路径 github.com/qiniu/qshell/v2,Go 1.24+,基于 Cobra 框架构建。
本文档面向维护者和贡献者,帮助理解项目结构、架构模式和开发流程。
命令使用说明请参考 docs/ 目录和 README.md。
| 目录/文件 | 说明 |
|---|---|
main/ |
程序入口,调用 cmd.Execute() |
cmd/ |
Cobra 命令定义(每个文件对应一组命令) |
cmd_test/ |
命令层集成/单元测试 |
iqshell/ |
核心业务逻辑 |
docs/ |
命令文档(.md 文件)和文档注册(docs.go) |
examples/ |
使用示例脚本 |
.github/ |
Issue/PR 模板、CI 工作流 |
| 文件 | 职责 |
|---|---|
root.go |
根命令定义、全局 flag |
user.go |
账号管理(account、user) |
bucket.go |
Bucket 管理 |
rs.go |
单文件操作(stat、delete、move、copy、rename 等) |
rsbatch.go |
批量文件操作 |
upload.go |
文件上传(表单上传、分片上传) |
download.go |
文件下载 |
cdn.go |
CDN 操作(刷新、预取) |
fop.go |
数据处理(pfop、prefop) |
asyncfetch.go |
异步抓取 |
sandbox.go |
沙箱环境管理 |
sandbox_template.go |
沙箱模板管理 |
ali.go |
阿里云 OSS 数据迁移 |
aws.go |
AWS S3 数据迁移 |
tools.go |
工具命令(base64、urlencode、token 等) |
match.go |
文件匹配测试 |
servers.go |
文件服务 |
share.go |
文件分享 |
m3u8.go |
M3U8 操作 |
version.go |
版本信息 |
autocompletion.go |
Shell 自动补全 |
| 包 | 职责 |
|---|---|
iqshell/common/ |
通用工具(版本、配置、日志、账号、数据结构等) |
iqshell/storage/ |
七牛对象存储操作实现 |
iqshell/cdn/ |
CDN 操作实现 |
iqshell/sandbox/ |
沙箱环境操作实现(基于七牛 Go SDK sandbox 包) |
iqshell/ali/ |
阿里云 OSS 迁移实现 |
iqshell/aws/ |
AWS S3 迁移实现 |
| 文件 | 说明 |
|---|---|
iqshell/load.go |
命令加载器接口定义 |
iqshell/common/version/version.go |
版本号(通过 ldflags 注入) |
readme.go |
通过 go:embed 嵌入 README.md |
CHANGELOG.md |
变更日志 |
Makefile |
构建、测试、发布目标 |
所有命令基于 spf13/cobra 框架:
main/main.go → cmd.Execute() → cmd/root.go(根命令)→ 各子命令
命令注册流程:
- 每个
cmd/*.go文件定义命令加载函数 cmd/root.go中注册所有命令加载器- 命令执行时调用
iqshell/中的业务逻辑
cmd/(命令定义层)→ iqshell/(业务逻辑层)→ go-sdk/(SDK 层)
cmd/:参数解析、flag 定义、命令注册iqshell/:业务逻辑实现、配置管理、输出格式化go-sdk/:底层 API 调用、认证、HTTP 请求
- 使用 spf13/viper 管理配置
- 账号信息存储在
~/.qshell/目录(LevelDB) - 支持多账号管理
版本号通过 ldflags 在构建时注入:
go build -ldflags '-X github.com/qiniu/qshell/v2/iqshell/common/version.version=vX.Y.Z' ./main/- 使用
gofmt -s格式化代码(CI 强制检查) - 提交前确保
gofmt -s -l .无输出
- 使用
make lint运行go vet+staticcheck - 注意:
vet和staticcheck目前不在 CI 中运行,仅作为本地提交前检查 - CI 仅强制检查
gofmt和单元测试
- 注释默认使用中文
- 导出的 API、函数、类型、常量必须添加注释
- 注释以被注释的标识符名称开头(符合 Go 官方 godoc 规范)
- 命令文件按功能命名:
cmd/<功能>.go - 业务逻辑按模块组织:
iqshell/<模块>/ - 测试文件放在
cmd_test/或对应包内
- 错误使用 Go 标准的
fmt.Errorf("context: %w", err)包装 - 使用
errors.Is()/errors.As()判断错误类型 - 命令层统一处理错误输出
测试文件可选添加 build tag:
//go:build unit
package xxx_testunit— 单元测试,不依赖外部服务integration— 集成测试,需要七牛账号和凭证
| 命令 | 说明 |
|---|---|
make test |
运行所有测试(无 build tag) |
make test-unit |
运行 unit 标签测试 |
make test-integration |
运行集成测试(需要凭证,超时 600s) |
make test-sandbox-unit |
Sandbox 单元测试 |
make test-sandbox-integration |
Sandbox 集成测试(需要 QINIU_API_KEY) |
make test-sandbox |
所有 Sandbox 测试 |
- 使用
testify/assert进行断言 - 推荐使用表驱动测试
- 集成测试需要配置环境变量(七牛 AK/SK 等)
CI 在 push 和 pull_request 时触发(.github/workflows/ut-check.yml):
- gofmt 检查:
gofmt -s -l .检查未格式化文件 - 单元测试:
go test -coverprofile=coverage.txt ./... - 代码覆盖率:上传至 Codecov
Go 版本矩阵:1.24.x
发布通过 GitHub Release 触发(.github/workflows/release.yaml):
- 构建 16 个平台二进制文件(darwin/linux/windows × 多架构)
- 上传至 GitHub Releases
- 上传至七牛云 devtools 存储
# 验证当前状态
make test
make lint- 修改代码前先运行
make test确认当前状态 - 新增命令时在
cmd/创建命令定义,在iqshell/实现业务逻辑 - 提交前运行
make test和make lint确保通过 - 代码格式化:
gofmt -s -w . - 同步更新
docs/中的命令文档
- 在
cmd/<功能>.go中定义 Cobra 命令和 flag - 在
iqshell/<模块>/中实现业务逻辑 - 在
cmd/root.go中注册命令加载器 - 在
docs/中添加命令文档(.md文件),并在docs/docs.go中添加 embed 声明和注册 - 在
cmd_test/中添加测试 - 更新
CHANGELOG.md
- 入口在
./main/— 构建时使用go build ./main/,不是go build . - 版本号通过 ldflags 注入 — 不要硬编码版本号,通过
-ldflags设置version.version - 文档同步 — 新增或修改命令时必须同步更新
docs/目录 - 依赖七牛 Go SDK — 核心存储和沙箱功能依赖
github.com/qiniu/go-sdk/v7 - 跨平台兼容 — 支持 16 个平台,使用
filepath.Join等跨平台写法 - 保持向后兼容 — 命令行接口变更需要考虑用户兼容性
- CHANGELOG 更新 — 功能变更必须记录在
CHANGELOG.md中