orchestrate-multi-target-sdks

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Orchestrate Multi-Target SDKs

编排多目标SDK

Generate multiple SDK variants (e.g., core, Azure, GCP) from different OpenAPI sources in a single repository.
从单个仓库中的不同OpenAPI源生成多个SDK变体(如核心版、Azure版、GCP版)。

When to Use

适用场景

  • Generating cloud-specific SDK variants (Azure, GCP, AWS)
  • Creating regional API variants (US, EU, APAC)
  • Building partner-branded/white-label SDKs
  • Managing multiple OpenAPI sources in one repo
  • User says: "multi-target SDK", "Azure variant", "SDK monorepo"
  • 生成云厂商专属SDK变体(Azure、GCP、AWS)
  • 创建区域化API变体(美国、欧盟、亚太)
  • 构建合作伙伴品牌/白标SDK
  • 在单个仓库中管理多个OpenAPI源
  • 用户提及:“多目标SDK”、“Azure变体”、“SDK单仓”

Quick Start

快速开始

Configure multiple sources and targets in
workflow.yaml
:
yaml
workflowVersion: 1.0.0
speakeasyVersion: latest

sources:
  main-source:
    inputs:
      - location: registry.speakeasyapi.dev/org/repo/main-openapi:main
  azure-source:
    inputs:
      - location: registry.speakeasyapi.dev/org/repo/azure-openapi:main

targets:
  main-sdk:
    target: typescript
    source: main-source
    output: ./
  azure-sdk:
    target: typescript
    source: azure-source
    output: ./packages/azure
workflow.yaml
中配置多个源和目标:
yaml
workflowVersion: 1.0.0
speakeasyVersion: latest

sources:
  main-source:
    inputs:
      - location: registry.speakeasyapi.dev/org/repo/main-openapi:main
  azure-source:
    inputs:
      - location: registry.speakeasyapi.dev/org/repo/azure-openapi:main

targets:
  main-sdk:
    target: typescript
    source: main-source
    output: ./
  azure-sdk:
    target: typescript
    source: azure-source
    output: ./packages/azure

Repository Structure

仓库结构

my-multi-sdk/
├── .speakeasy/
│   ├── workflow.yaml       # Multi-target config
│   └── gen.yaml            # Main SDK config
├── src/                    # Main SDK source
├── packages/
│   ├── azure/
│   │   ├── .speakeasy/
│   │   │   └── gen.yaml    # Azure-specific config
│   │   └── src/
│   └── gcp/
│       ├── .speakeasy/
│       │   └── gen.yaml    # GCP-specific config
│       └── src/
├── .github/workflows/
│   ├── sdk_generation_main.yaml
│   ├── sdk_generation_azure.yaml
│   └── sdk_generation_gcp.yaml
└── package.json
my-multi-sdk/
├── .speakeasy/
│   ├── workflow.yaml       # 多目标配置
│   └── gen.yaml            # 主SDK配置
├── src/                    # 主SDK源码
├── packages/
│   ├── azure/
│   │   ├── .speakeasy/
│   │   │   └── gen.yaml    # Azure专属配置
│   │   └── src/
│   └── gcp/
│       ├── .speakeasy/
│       │   └── gen.yaml    # GCP专属配置
│       └── src/
├── .github/workflows/
│   ├── sdk_generation_main.yaml
│   ├── sdk_generation_azure.yaml
│   └── sdk_generation_gcp.yaml
└── package.json

Per-Target gen.yaml

各目标专属gen.yaml

Each variant has its own configuration:
yaml
undefined
每个变体都有自己的配置:
yaml
undefined

packages/azure/.speakeasy/gen.yaml

packages/azure/.speakeasy/gen.yaml

configVersion: 2.0.0 generation: sdkClassName: MySDKAzure typescript: version: 1.0.0 packageName: '@myorg/mysdk-azure' envVarPrefix: MYSDK_AZURE
undefined
configVersion: 2.0.0 generation: sdkClassName: MySDKAzure typescript: version: 1.0.0 packageName: '@myorg/mysdk-azure' envVarPrefix: MYSDK_AZURE
undefined

Naming Conventions

命名规范

VariantPackage NameClass Name
Main
@myorg/mysdk
MySDK
Azure
@myorg/mysdk-azure
MySDKAzure
GCP
@myorg/mysdk-gcp
MySDKGCP
变体包名类名
主版
@myorg/mysdk
MySDK
Azure版
@myorg/mysdk-azure
MySDKAzure
GCP版
@myorg/mysdk-gcp
MySDKGCP

CI Workflow Per Target

各目标CI工作流

Create separate workflows for independent regeneration:
yaml
undefined
创建独立的工作流以实现单独重新生成:
yaml
undefined

.github/workflows/sdk_generation_azure.yaml

.github/workflows/sdk_generation_azure.yaml

name: Generate Azure SDK on: workflow_dispatch: inputs: force: type: boolean default: false
jobs: generate: uses: speakeasy-api/sdk-generation-action/.github/workflows/workflow-executor.yaml@v15 with: target: azure-sdk mode: pr secrets: github_access_token: ${{ secrets.GITHUB_TOKEN }} speakeasy_api_key: ${{ secrets.SPEAKEASY_API_KEY }}
undefined
name: Generate Azure SDK on: workflow_dispatch: inputs: force: type: boolean default: false
jobs: generate: uses: speakeasy-api/sdk-generation-action/.github/workflows/workflow-executor.yaml@v15 with: target: azure-sdk mode: pr secrets: github_access_token: ${{ secrets.GITHUB_TOKEN }} speakeasy_api_key: ${{ secrets.SPEAKEASY_API_KEY }}
undefined

Versioning Strategies

版本控制策略

Lockstep: All variants share the same version (simpler).
Independent: Each variant has its own version (more flexible).
yaml
undefined
同步版本:所有变体使用相同版本(更简单)。
独立版本:每个变体拥有自己的版本(更灵活)。
yaml
undefined

Independent versioning

独立版本示例

Main: version: 2.1.0

主版: version: 2.1.0

Azure: version: 1.8.0

Azure版: version: 1.8.0

GCP: version: 1.3.0

GCP版: version: 1.3.0

undefined
undefined

Sharing Code Across Variants

跨变体共享代码

Option 1: Duplicate hooks in each variant (simpler)
Option 2: Create shared package:
shared/
├── package.json          # @myorg/mysdk-shared
└── src/
    └── hooks.ts
方案1:在每个变体中复制钩子(更简单)
方案2:创建共享包:
shared/
├── package.json          # @myorg/mysdk-shared
└── src/
    └── hooks.ts

Troubleshooting

故障排除

IssueSolution
Wrong target generatedSpecify
-t target-name
in
speakeasy run
Config not foundEnsure
.speakeasy/gen.yaml
exists in output dir
Circular dependenciesUse workspace protocols in package.json
问题解决方案
生成了错误的目标
speakeasy run
中指定
-t target-name
未找到配置确保输出目录中存在
.speakeasy/gen.yaml
循环依赖在package.json中使用工作区协议

Related Skills

相关技能

  • start-new-sdk-project
    - Initial SDK setup
  • configure-sdk-options
    - Language-specific configuration
  • manage-openapi-overlays
    - Per-source overlays
  • orchestrate-multi-repo-sdks
    - Single repo per language
  • start-new-sdk-project
    - 初始化SDK项目
  • configure-sdk-options
    - 语言专属配置
  • manage-openapi-overlays
    - 各源专属覆盖配置
  • orchestrate-multi-repo-sdks
    - 单语言单仓库