迁移到Rover
从Apollo CLI迁移到Rover CLI
关于Apollo CLI是Apollo之前的CLI工具,用于管理图形,与GraphOS结合使用。
本指南帮助您迁移到Rover,通过突出显示工具之间的关键差异,并提供使用Rover执行常见Apollo CLI工作流的示例。
先决条件
建议您首先阅读Rover约定,因为本指南是在此基础上构建的。
在阅读此指南之前,安装并配置Rover也是很实用的。
配置
Rover对于配置的方法比Apollo CLI更加明确和具体。在Rover中,大多数配置选项都是通过特定命令的标志来指定的,而不是在配置文件中。
除了config auth命令创建的隐藏配置文件外,Rover还使用了特定的YAML文件来为config auth
命令和supergraph compose
命令指定配置。
使用工作室进行身份验证
Apollo CLI通过读取环境变量来确定要使用的API密钥,与GraphOS Studio进行认证。使用Rover,设置API密钥的推荐方法是使用config auth
命令。不过该命令是交互式的,因此你仍然可以在CI/CD环境中使用环境变量。
如果你不确定你的API密钥从哪里读取,或者你在密钥上遇到问题,可以使用config whoami
命令进行调试。
替换 apollo.config.js
Apollo CLI会读取apollo.config.js
文件来加载某些配置选项。以下表格列出了apollo.config.js
中最常见的字段以及它们如何转换到Rover(也可查看示例)选项:
apollo.config.js 字段 | Rover 选项 |
---|---|
|
|
|
注意:此标志不支持多个文件。 |
|
|
|
注意:使用此标志多次以指定多个头。 |
使用代理服务器
使用Apollo CLI时,您必须配置global-agent
才能使您的流量通过HTTP代理路由:
GLOBAL_AGENT_HTTP_PROXY=http://proxy-hostname:proxy-port \npx -n '-r global-agent/bootstrap' \apollo client:download-schema …
使用Rover,您可以设置HTTP_PROXY
和/或HTTPS_PROXY
环境变量,所有Rover的流量都将通过指定的代理路由:
HTTP_PROXY=http://proxy-hostname:proxy-port rover graph fetch mygraph
有关Rover使用代理服务器信息的更多信息,请在此处
Inspector
在Apollo CLI中,当您将--endpoint选项传递给service:push、service:check和service:download等命令时,会幕后进行正在运行服务的审查。在Rover中,您将运行graph introspect命令,并将其结果传递到类似的graph/subgraph push和graph/subgraph check命令。
这种步骤分离使Rover的审查使用更加灵活和透明。此外,将审查分离成自己的步骤,如果你遇到错误,会使调试更加容易。
如果您目的是从一个运行端点下载模式,您可以将graph introspect的结果直接输出到一个文件中。有关Rover中stdin/stdout如何工作的更多信息,请点击这里。
单体与联邦图
Apollo CLI的API使用apollo service:*命令集来处理单体和联邦图。而Rover将图和联邦图视为不同的对象。
在Rover中处理联邦图时,您通常会使用subgraph命令集,因为大多数针对联邦图的操作都涉及到其中一个子图(例如检查单个子图的变化)。Rover还提供了一个supergraph命令集,用于组合和使用supergraph模式。
有关graph、subgraph和supergraph之间区别的更多信息,请查看约定。
Rover的限制
为了维持可维护性、路线图考虑和时间,Rover有意缺失了Apollo CLI的一些功能。其中一些功能可能在以后会添加,但目前还没有发布时间表。
客户端命令
Rover的关注点是提供优秀的图管理体验。因此,我们有意省略了关注客户端项目开发的命令,例如client:codegen和client:check。
通配符
虽然Apollo CLI广泛使用通配符来支持使用多个本地文件,甚至自动发现目录树中的文件,但在某些情况下这很有帮助,但Apollo CLI中的通配符策略引起了许多问题。Rover有意不在第一次发布时将通配符用于文件指定。
作为解决方案,您可能可以使用 cat
将多个文件合并并传递给带有 stdin 的 Rover。请参见 此示例。
可机器读取的输出
在 Apollo CLI 中,许多命令支持其他输出格式选项,例如 --json
和 --markdown
。目前,Rover 仅支持 --format json
,并将 Markdown 格式留给消费者。有关 Rover 中 JSON 输出的更多信息,请参阅 这些文档。
以下是从 rover {sub}graph check my-graph --format json
控制台输出的转换脚本示例,可以在 此 gist 中找到。
示例
以下示例假定已设置环境变量或配置文件以验证 Apollo CLI,并已运行 rover config auth
命令以验证 Rover。
从 Apollo 图谱注册表中检索图谱的模式
## Apollo CLI ### automatically outputs to schema.graphqlapollo client:download-schema --graph my-graph --variant prod## Rover ### automatically outputs to stdout. Can redirect to schema.graphql with the `--output <OUTPUT_FILE>` argumentrover graph fetch my-graph@prod --output schema.graphql
从内省中检索图谱的模式
## Apollo CLI ### automatically outputs to schema.graphql# can ONLY output introspection results in JSONapollo service:download --endpoint https://127.0.0.1:4000## Rover ### automatically outputs to stdout. Can redirect to schema.graphql with the `--output <OUTPUT_FILE>` argument# can ONLY output SDLrover graph introspect https://127.0.0.1:4000 --output schema.graphql
将单体模式发布到 Apollo 图谱注册表
## Apollo CLI ##apollo service:push --graph my-graph --variant prod --endpoint https://127.0.0.1:4000## Rover ##rover graph introspect https://127.0.0.1:4000 | rover graph publish my-graph@prod --schema -
检查单体图谱的变化
## Apollo CLI ##apollo service:check --graph my-graph --variant prod --localSchemaFile ./schema.graphql## Rover ##rover graph check my-graph@prod --schema ./schema.graphql
发布联合子图谱
子图谱曾被称为 Apollo CLI 中的 "实施服务" 或仅仅是 "服务"(一个多义词)。
## Apollo CLI ##apollo service:push \--graph my-graph \--variant prod \--serviceName users \--localSchemaFile ./users.graphql## Rover ##rover subgraph publish my-graph@prod \--schema ./users.graphql \--name users
检查子图谱的变化
## Apollo CLI ##apollo service:check \--graph my-graph \--variant prod \--serviceName users \--localSchemaFile ./users.graphql## Rover ##rover subgraph check my-graph@prod \--schema ./users.graphql \--name users
检查图谱的变化(使用配置文件)
在 Apollo CLI 中,配置文件原本意在替代命令使用中的标志,但往往这使得正在运行的命令细节过于抽象和难以跟踪。Rover 更详细的使用方法旨在更直接和明确。
// apollo.config.jsmodule.exports = {// this is the GRAPH_REF positional arg in Rovername: 'my-graph@prod',endpoint: {url: 'https://127.0.0.1:4001',headers: {// passed with the --header flag in Roverauthorization: 'Bearer wxyz',},},};
## Apollo CLI ##apollo service:check## Rover ### (no config file needed)rover graph introspect https://127.0.0.1:4001 --header "authorization: Bearer wxyz" \| rover graph check my-graph@prod --schema -
使用配置文件推送子图变更
// apollo.config.jsmodule.exports = {service: {// this is the GRAPH_REF positional arg in Rovername: 'my-graph@prod',// multiple schema files that can be concatenatedlocalSchemaFile: './*.graphql'}};
## Apollo CLI ##apollo service:push --serviceName users## Rover ### (no config file needed)# globs don't work natively with Rover, so you can use a command like `awk 1`# to combine multiple files on *nix machinesawk 1 *.graphql | rover subgraph publish my-graph@prod --name users --schema -