gws 快速上手:基于 Google Discovery Service 动态生成命令面的 Workspace 全能 CLI
【免费下载链接】cliGoogle Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.项目地址: https://gitcode.com/gh_mirrors/cli413/cli
gws(Google Workspace CLI)是一款为人类与 AI Agent 打造的单一命令行工具,它的独特之处在于:不内置静态命令列表,而是在运行时读取 Google 官方的 Discovery Service 文档,动态生成覆盖 Drive、Gmail、Calendar 及所有 Workspace API 的命令面。读完本文,你将掌握gws的安装方式、三分钟快速上手流程,以及其"零样板代码 + 结构化 JSON 输出"背后两阶段解析的架构原理,并能立即用它完成列文件、读邮件等真实操作。
设计理念:零样板代码,命令面由 Discovery 文档动态生成
传统 REST 调用需要对着 API 文档手写curl,而gws走了一条完全不同的路线:它把 Google 官方的 Discovery Service 当作唯一的"命令说明书",在每次运行时动态构建 CLI 结构。这意味着当 Google 为某个 Workspace API 新增端点或方法时,gws会自动感知并支持,无需升级二进制文件。
从源码结构看,这一机制由三部分组成:
- Discovery 文档的抓取与解析:discovery.rs 定义了
RestDescription、RestResource、RestMethod等数据结构,将 Discovery JSON 反序列化为内存模型; - 命令树的动态构建:commands.rs 的
build_cli把文档中的 resources/methods 递归映射为clap::Command子命令树; - 两阶段参数解析:main.rs 先读取第一个非标志参数识别服务名,再用构建好的
clap命令树重新解析剩余参数。
以gws drive files list为例,调用链是:drive→ 解析为 Discovery API 名drive、版本v3(见 services.rs)→ 抓取并缓存 Discovery 文档 →build_cli生成files资源下的list方法 → 校验参数、鉴权、执行 HTTP 请求。
安装方式
gws提供多种安装途径,你可以按环境选择。
方式一:下载预编译二进制(推荐)
从 GitHub Releases 页面下载对应操作系统与架构的预编译二进制,解压后将gws(Windows 下为gws.exe)放入$PATH即可。当前仓库在 npm/package.json 中声明的支持平台包括:
| 平台 | 目标三元组 |
|---|---|
| macOS(Apple Silicon / Intel) | aarch64-apple-darwin/x86_64-apple-darwin |
| Linux(glibc) | aarch64-unknown-linux-gnu/x86_64-unknown-linux-gnu |
| Linux(musl) | aarch64-unknown-linux-musl/x86_64-unknown-linux-musl |
| Windows | x86_64-pc-windows-msvc |
方式二:npm(便捷层)
npm 包本质上是下载 GitHub Release 二进制的自动化包装器,需要 Node.js 18+:
npm install -g @googleworkspace/cli方式三:从源码构建
cargo install google-workspace-cli # crates.io # 或直接构建仓库 cargo build # 开发构建,产物在 target/debug/gws方式四:Nix
仓库提供 Nix flake(见 flake.nix):
nix run github:googleworkspace/cli快速开始
安装完成后,三条命令即可完成首次验证:
gws auth login # OAuth 登录 gws drive files list --params '{"pageSize": 5}' # 列出最近 5 个 Drive 文件 gws gmail users.messages list --params '{"maxResults": 3}' # 读取收件箱前 3 封邮件--params接收 JSON 字符串形式的 URL/查询参数,--json则用于 POST/PATCH/PUT 的请求体。所有命令的输出默认都是结构化 JSON,方便脚本与 AI Agent 直接消费。
深入:一个命令背后发生了什么
服务注册表与版本解析
gws内置了一份服务注册表(services.rs),把用户友好的别名映射到 Discovery API 名与版本号。当前支持 18 个服务,包括drive(v3)、gmail(v1)、calendar(v3)、sheets(v4)、docs(v1)、chat(v1)、classroom(v1)、forms(v1)、keep(v1)、meet(v2)、tasks(v1)、people(v1)、script(v1)、slides(v1)、admin-reports(reports_v1)、events(workspaceevents v1)、modelarmor(v1)、workflow(v1) 等。对于未收录的 API,还支持<api>:<version>语法直接指定。
Discovery 文档抓取与 24 小时缓存
discovery.rs 展示了两级 URL 策略:先请求标准的https://www.googleapis.com/discovery/v1/apis/{service}/{version}/rest,失败时回退到https://{service}.googleapis.com/$discovery/rest(Forms、Keep、Meet 等新 API 使用该模式)。文档会缓存到~/.config/gws/cache/目录(由 google-workspace-cli 的 discovery.rs 封装),TTL 为 24 小时,命中缓存时直接反序列化返回,避免重复网络请求。
校验、鉴权与执行
executor.rs 的execute_method是核心执行函数,按顺序完成:
- 参数校验:解析
--params/--json的 JSON,按 Discovery 文档 schema 校验请求体,并检查必填参数(如 path 参数缺失会立即报 Validation 错误); - URL 构建:把 path 模板中的
{param}占位符替换为实际值,查询参数按 repeated 标记展开为多个 query 项; - 鉴权:从方法 scopes 列表中选取第一个(通常是最宽的)scope 换取 token;
- 请求发送与响应处理:支持 JSON、二进制(
--output落盘)两种响应,二进制响应会流式写入文件并输出含saved_file、mimeType、bytes的 JSON 元数据。
分页:NDJSON 流式输出
列表类方法常用分页,gws提供三个标志(默认值可参见 main.rs 与对应单测):
| 标志 | 作用 | 默认值 |
|---|---|---|
--page-all | 自动翻页,每页一行 JSON(NDJSON) | 关闭 |
--page-limit <N> | 最大翻页数 | 10 |
--page-delay <MS> | 页间延迟 | 100 ms |
gws drive files list --params '{"pageSize": 100}' --page-all | jq -r '.files[].name'翻页循环由nextPageToken驱动(executor.rs),并遵守--page-limit与--page-delay约束。
安全辅助:--dry-run 与路径校验
--dry-run会在不发送真实请求的前提下,本地校验参数并输出将发出的 URL、method、query 参数与 body。此外,--upload与--output指定的文件路径会先经过路径穿越校验(main.rs),确认安全后才执行 I/O。
常用标志速查
| 标志 | 说明 |
|---|---|
--params <JSON> | URL/查询参数(JSON 字符串) |
--json <JSON> | 请求体(POST/PATCH/PUT) |
--upload <PATH> | 以 multipart 方式上传本地文件作为媒体内容 |
--upload-content-type <MIME> | 上传文件 MIME 类型(省略时按扩展名自动推断) |
--output <PATH> | 二进制响应的输出文件路径 |
--format <FMT> | 输出格式:json(默认)、table、yaml、csv |
--api-version <VER> | 覆盖 API 版本(如 v2、v3) |
--dry-run | 本地校验请求,不真正发送 |
结构化退出码
脚本可以根据退出码分支处理而无需解析错误文本。退出码定义在 error.rs:
| 退出码 | 含义 | 典型场景 |
|---|---|---|
0 | 成功 | 命令正常完成 |
1 | API 错误 | Google 返回 4xx/5xx |
2 | 鉴权错误 | 凭据缺失、过期或无效 |
3 | 校验错误 | 参数错误、未知服务、非法标志 |
4 | Discovery 错误 | 无法获取 API schema 文档 |
5 | 内部错误 | 意外失败 |
环境变量与配置文件
gws全部环境变量均为可选:
GOOGLE_WORKSPACE_CLI_TOKEN:预获取的 OAuth2 访问令牌(优先级最高);GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE:OAuth 凭据 JSON 路径(用户或服务账号);GOOGLE_WORKSPACE_CLI_CLIENT_ID/GOOGLE_WORKSPACE_CLI_CLIENT_SECRET:OAuth 客户端 ID 与密钥;GOOGLE_WORKSPACE_CLI_CONFIG_DIR:覆盖配置目录(默认~/.config/gws);GOOGLE_WORKSPACE_CLI_LOG:stderr 日志级别(如gws=debug),默认关闭;GOOGLE_WORKSPACE_PROJECT_ID:覆盖 GCP 项目 ID,用于配额计费。
环境变量也可写入.env文件,入口在 main.rs 通过dotenvy自动加载。
在仓库中继续深入
- 根 README.md 提供了完整的鉴权流程、Agent Skills 索引与高级用法;
- crates/google-workspace/src/services.rs 查看全部服务注册表;
- crates/google-workspace/src/discovery.rs 查看 Discovery 文档解析与缓存实现;
- crates/google-workspace-cli/src/commands.rs 查看命令树构建逻辑;
- crates/google-workspace-cli/src/executor.rs 查看请求执行、multipart 上传与分页实现;
- crates/google-workspace-cli/src/main.rs 查看两阶段解析的完整入口流程。
开发者模式下可用cargo test运行单元测试(覆盖分页默认值、服务解析、scope 选择、命令树构建等关键逻辑),用./scripts/coverage.sh生成 HTML 覆盖率报告。
提示:本工具并非 Google 官方支持的产品(Apache-2.0 许可,见 LICENSE),且处于活跃开发期,v1.0 之前可能发生破坏性变更。
【免费下载链接】cliGoogle Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.项目地址: https://gitcode.com/gh_mirrors/cli413/cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考