Skip to content

「环境类别」这一个概念在 spec 里有两个枚举:DiscoverySchema.environment(3 成员)与 EnvironmentTypeSchema(7 成员) #5676

Description

@os-zhuang

发现于 #4828 的实施(界外发现,查重无命中故新开;未认领;observation-class)。

现象

packages/spec 里有两个枚举描述同一个概念:

声明 位置 成员
DiscoverySchema.environment src/api/discovery.zod.ts productionsandboxdevelopment
EnvironmentTypeSchema src/cloud/environment.zod.ts productionsandboxdevelopmentteststagingpreviewtrial

后者的注释写着「canonical buckets per industry convention (Salesforce, Power Platform, ServiceNow all use this taxonomy)」,即它自认是这个分类法的正本。前者是后者的真子集,两者之间没有任何引用关系,也没有任何东西保证它们同步演进。

影响

#4828 因此必须引入一个有损映射:NODE_ENV=stagingtest 都是 EnvironmentTypeSchema 里的一等成员,但在 discovery 面上必须被折叠进 3 个桶(staging → sandboxtest → development)。这个映射本身是维护者裁定认可的(discovery 只需回答「我在不在生产」这种粗粒度问题),但「同一个词在两个 schema 里含义不同」这件事本身是漂移。

具体的坑:一个读了 EnvironmentTypeSchema 的作者会以为 staging 是合法的 environment 取值,而 DiscoverySchema 会拒绝它(discovery.test.ts 里就有一条 should reject invalid environment 用的正是 'staging')。

可能的处置

  1. 维持两个,但写清楚关系:在 DiscoverySchema.environment.describe() 里点名 EnvironmentTypeSchema 是更细的分类法(两个 discovery 生产者都在线上返回 schema 未声明的顶层字段(scoping / features / endpoints),且 REST 形状永远无法通过 DiscoverySchema #4828 已经加了这句),并在 EnvironmentTypeSchema 那边回指;再加一条测试钉住「discovery 的 3 个成员是 EnvironmentType 的子集」,这样后者改名/删成员时前者会红。
  2. 让 discovery 复用 EnvironmentTypeSchema:去掉有损映射,但这会放宽一个响应枚举 —— 对按 3 个值做 switch 的消费者是前向不兼容的。两个 discovery 生产者都在线上返回 schema 未声明的顶层字段(scoping / features / endpoints),且 REST 形状永远无法通过 DiscoverySchema #4828 的裁定明确要求生产者取值落在 3 成员枚举内,所以这条需要新的裁定才能走。

选 1 的话是小活;选 2 是契约变更。倾向 1 + 那条子集测试:成本极低,而且能把「两个枚举」从沉默的漂移变成有闸门看着的关系。

参考:#4828(引入了映射函数 resolveDiscoveryEnvironment 与映射表)。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions