gws 评测:一个动态生成命令面的 Google Workspace 命令行工具
Google Workspace CLI,一款适用于云端硬盘、Gmail、日历、表格、文档、聊天、管理等的命令行工具。从 Google Discovery Service 动态构建。包括人工智能代理技能。
秒懂
- 它是什么?
- gws 是一个用 Rust 编写的 Google Workspace CLI,它不维护静态命令列表,而是运行时读取 Google Discovery Service 生成全部命令。本文评估它的安装方式、认证流程、对 AI agent 的支持,以及它当前版本的主要限制。
- 适合谁用?
- gws 适合两类人:一类是经常在终端里操作 Google Workspace 的开发者,另一类是需要给 LLM 提供结构化工具调用的 AI agent 开发者。前者能省掉查 REST 文档和写 curl 的时间,后者可以直接利用内置的 40 多个 agent skills。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 1 天前。
- 用什么语言写的?
- 主要是 Rust(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
一个不维护命令列表的 CLI
gws 的核心设计是动态命令生成。它不随版本发布一份固定的命令清单,而是在运行时读取 Google 的 Discovery Service,根据返回的 API 描述构建整个命令面。这意味着 Google 新增或修改 API 端点时,gws 会自动跟上,不需要等待新版本。这个做法在 CLI 工具里很少见,大多数同类工具都是手工维护命令映射。好处是覆盖面广,理论上所有 Workspace API 都能用;代价是命令的稳定性依赖 Discovery Service 的响应,而且 --help 的输出也是运行时生成的,不会像静态 CLI 那样有精心编写的文档。README 中给出的例子,比如 gws drive files list --params '{"pageSize": 10}',所有参数都塞进 JSON 字符串里,这是动态生成的必然结果,但对习惯了传统 CLI 参数风格的用户来说,学习曲线会更陡。
安装方式与前置条件
安装途径有四种:从 GitHub Releases 下载预编译二进制、npm 全局安装、cargo install 从源码构建、以及 Homebrew。README 明确推荐预编译二进制,npm 包实际上只是自动下载二进制的包装器。前置条件包括 Node.js 18+(仅用于 npm 方式)和一个 Google Cloud 项目,用于 OAuth 凭证。如果你没有 gcloud CLI,可以手动在 Cloud Console 创建项目,然后把客户端 JSON 保存到 ~/.config/gws/client_secret.json。Nix flake 也提供了,命令是 nix run github:googleworkspace/cli。安装本身不复杂,但要注意,gws auth setup 这个便捷命令依赖 gcloud,如果你不想装 gcloud,就得走手动流程。对于 CI 环境,README 提供了导出凭证的流程:先在本地完成交互式认证,然后运行 gws auth export --unmasked > credentials.json,再把文件放到 CI 机器上。这个流程可行,但凭证文件包含刷新令牌,必须妥善保管。
认证流程中的几个坑
认证是 gws 使用中最容易出错的部分。README 用了一个表格来区分四种场景:有 gcloud、无 gcloud、已有 access token、已有服务账号凭证。交互式登录时,凭证会用 AES-256-GCM 加密存储在本地,密钥放在系统 keyring 或 ~/.config/gws/.encryption_key,后者通过环境变量 GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND=file 启用。这里有一个明确警告:如果你的 OAuth 应用处于测试模式(未验证),Google 会把 scope 数量限制在 25 个左右,而 recommended 预设包含 85 个以上 scope,会导致登录失败,尤其是 @gmail.com 账号。解决办法是用 gws auth login -s drive,gmail,sheets 这样的参数手动选择服务。另一个坑是测试模式必须把自己添加为 Test user,否则会看到通用的 Access blocked 错误。这些细节说明 gws 的认证设计考虑到了本地桌面、CI 和服务器多种环境,但测试模式的限制会让新手措手不及。
命令面与输出格式
gws 的命令结构完全由 Discovery Service 决定,格式是 <service> <resource> <method>,比如 drive files list。所有参数都通过 --params 传入 JSON 对象,请求体则用 --json 传递。例如创建电子表格:gws sheets spreadsheets create --json '{"properties": {"title": "Q1 Budget"}}'。输出默认是结构化 JSON,这为脚本和 AI agent 提供了便利。还支持 --dry-run 预览请求,以及 --page-all 流式输出 NDJSON,配合 jq 可以处理分页结果,比如 gws drive files list --params '{"pageSize": 100}' --page-all | jq -r '.files[].name'。此外,gws schema drive.files.list 可以查看任意方法的请求和响应 schema,这在调试时很有用。这套设计的优点是统一,所有 API 都遵循同一套参数和输出约定;缺点是参数必须写成 JSON 字符串,无法享受传统 CLI 的 tab 补全和类型提示。
AI agent skills 的实际含义
README 宣称内置 40 多个 agent skills,这是 gws 区别于普通 CLI 的地方。所谓 skills,本质上是一组预定义的工具调用模板,让 LLM 可以直接操作 Workspace,而不需要为每个 API 写自定义工具。由于命令面是动态生成的,这些 skills 也必须跟随 Discovery Service 的变化。但 README 没有给出这些 skills 的具体列表或使用示例,只提到它们包含在项目中。这意味着如果你想在 LangChain 或其他 agent 框架中使用 gws,需要自己探索 skills 的格式和调用方式。从仓库布局来看,skills 很可能是以某种声明式文件存在,但具体机制需要查看源码。对于 AI agent 开发者来说,这是一个值得关注的功能,但文档的缺乏会让初次集成变得困难。
维护成本与许可
gws 采用 Apache-2.0 许可,这是宽松许可证,允许商业使用和修改,但要注意项目不是 Google 官方支持的产品,README 明确写了 This is not an officially supported Google product。项目处于 active development,v0.22.x 系列,README 警告 v1.0 之前会有破坏性变更。这意味着升级到新版本时,命令语法或输出格式可能变化,你的脚本需要跟着调整。另外,由于命令面是动态生成的,即使 gws 版本不变,Google 侧 API 的变化也可能影响行为。维护成本集中在两点:一是跟踪 gws 的版本更新,二是处理认证配置的变化,尤其是 OAuth 测试模式的限制。如果你在多个机器上使用,还需要管理凭证文件的同步和更新。
与 gcloud 的对比
最直接的替代方案是 Google 官方的 gcloud CLI,它也能访问部分 Workspace API,但覆盖面远不如 gws。gcloud 的命令是静态定义的,由 Google 团队手工维护,对于 Drive、Sheets 等 API 的支持不完整,通常需要配合 curl 或编写脚本。gws 的优势在于全覆盖和统一输出,但 gcloud 的优势是稳定性、官方支持和更成熟的认证集成。另一个替代方案是直接用 REST API 加 curl,这是 gws 想要取代的痛点,但如果你只需要一两个 API,curl 可能更简单。还有一个思路是使用 Google API 客户端库(如 Python 或 Node.js),但那样需要写代码,而不是命令行。gws 的定位是介于 gcloud 和完整客户端库之间,它牺牲了部分稳定性换取了灵活性。
编辑结论
gws 适合两类人:一类是经常在终端里操作 Google Workspace 的开发者,另一类是需要给 LLM 提供结构化工具调用的 AI agent 开发者。前者能省掉查 REST 文档和写 curl 的时间,后者可以直接利用内置的 40 多个 agent skills。不适合的人包括:只用 Gmail 或 Drive 单一功能的用户,他们用官方客户端或 gcloud 就够了;还有对稳定性要求极高的生产环境用户,因为项目明确标注 under active development,v1.0 之前会有破坏性变更。在采用之前,先确认你的 Google 账号能通过 OAuth 认证,特别是如果你用的是 @gmail.com 账号,测试模式的 25 个 scope 限制会让 recommended 预设失败,必须用 -s 参数选择具体服务。还要检查你需要的 API 是否在 Discovery Service 中暴露,因为 gws 不提供任何本地缓存,离线时完全不可用。最后,如果你计划在 CI 中使用,先跑一次 gws auth export 并验证导出的 credentials.json 能否在无浏览器环境正常工作。
社区笔记