ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

深入掌握 @typespec/http-server-csharp Emitter:命令行、配置文件与全部选项实战指南

深入掌握 @typespec/http-server-csharp Emitter:命令行、配置文件与全部选项实战指南 深入掌握 typespec/http-server-csharp Emitter命令行、配置文件与全部选项实战指南【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespectypespec/http-server-csharp是 TypeSpec 生态中面向 C# / ASP.NET Core 的服务端代码生成器Service code generator它把 TypeSpec 定义的 HTTP 服务契约直接转换为可编译、可运行的 C# 服务工程。本文以官方参考文档 website/src/content/docs/docs/emitters/servers/http-server-csharp/reference/emitter.md 为骨架完整讲解它的两种调用方式命令行与 tspconfig.yaml、全部 10 个 Emitter 选项的语义与默认值并结合仓库源码emitter.tsx、lib.ts剖析每个选项背后的实现原理。读完本文你将能独立配置输出目录、切换模型/完整产物、生成 Mock 服务、接入 SwaggerUI并处理端口与集合类型等细节问题。一、认识 typespec/http-server-csharptypespec/http-server-csharp的定位与typespec/http-client-csharp相对后者生成客户端调用代码而前者生成的是服务端实现骨架。它在 packages/http-server-csharp/package.json 中被描述为 TypeSpec service code generator for c-sharp。安装方式npm install typespec/http-server-csharp该包的运行时约束与依赖来自 package.jsonnode 22.0.0以 peer dependency 方式依赖typespec/compiler、typespec/http、typespec/json-schema、typespec/rest、typespec/versioning内部依赖alloy-js/core、alloy-js/csharp、alloy-js/msbuild、typespec/emitter-framework与typespec/http-canonicalization说明它是基于 Alloy JS 声明式组件架构构建的发射器同时暴露一个名为hscs-scaffold的 CLI 命令./cmd/hscs.js用于一键生成带 Mock 实现的 ASP.NET 工程详见本文第五节。二、两种标准用法命令行与 tspconfig.yaml参考文档给出了两种等价的调用方式它们都会触发$onEmit入口见 src/emitter.tsx。2.1 方式一命令行直接发射tsp compile . --emittypespec/http-server-csharptsp是typespec/compiler提供的编译 CLI.表示以当前目录为 TypeSpec 工程入口目录下需要有main.tsp或能被识别的入口配置--emittypespec/http-server-csharp指定本次编译要运行的发射器。若需要在命令行同时传递选项可使用--option参数格式为typespec/http-server-csharp.选项名值tsp compile . \ --emittypespec/http-server-csharp \ --option typespec/http-server-csharp.project-namePetStore \ --option typespec/http-server-csharp.http-port8080这种写法在仓库自带的脚手架 CLIsrc/cli/cli.ts中被大量使用是程序化调用发射器的标准姿势。2.2 方式二通过 tspconfig.yaml 配置在 TypeSpec 工程根目录的tspconfig.yaml中声明发射器emit: - typespec/http-server-csharp随后在options节点下按发射器名分组建配置emit: - typespec/http-server-csharp options: typespec/http-server-csharp: option: value把option: value替换为真实的选项键值即可例如emit: - typespec/http-server-csharp options: typespec/http-server-csharp: output-type: models collection-type: enumerable emit-mocks: mocks-only需要说明的是这些选项名是强约束的。发射器通过createTypeSpecLibrary注册了一份 JSON Schema见 src/lib.ts其中additionalProperties: false且每个选项都声明了类型、枚举取值范围与默认值。传入未知选项或非法取值会被编译器校验拦截因此配置时务必使用下文列出的标准选项名。三、Emitter 选项全解含源码级原理参考文档共定义了 10 个选项下面逐一展开并在需要处结合源码说明底层影响。汇总表如下选项名类型默认值作用emitter-output-dirabsolutePath{output-dir}/typespec/http-server-csharp发射输出目录skip-formatbooleanfalse跳过对生成 C# 代码的dotnet format格式化output-typemodels \| allall仅生成模型或生成全部产物emit-mocksmocks-and-project-files \| mocks-only \| nonenone生成 Mock 业务实现与工程文件use-swaggeruibooleanfalse在开发配置中挂载 SwaggerUI 端点openapi-pathstringnull指定用于 SwaggerUI 的 OpenAPI 文档路径overwritebooleanfalse生成 Mock 与工程文件时覆盖同名文件project-namestringServiceProject生成工程的名称http-portnumbernull本地托管服务的 HTTP 端口https-portnumbernull本地托管服务的 HTTPS 端口collection-typearray \| enumerablearray生成代码使用的集合类型3.1emitter-output-dir控制输出位置类型absolutePath默认值{output-dir}/typespec/http-server-csharp该选项决定生成文件的根目录。{output-dir}是编译器全局输出目录未显式配置时默认为工程下的tsp-output这一点可在 src/output-writer.ts 中看到outputDir || resolvePath(root, tsp-output)的回退逻辑因此默认完整输出路径为./tsp-output/typespec/http-server-csharp。配置示例options: typespec/http-server-csharp: emitter-output-dir: ./generated/csharp-service命令行等价写法tsp compile . --emittypespec/http-server-csharp \ --option typespec/http-server-csharp.emitter-output-dir./generated/csharp-service在 src/emitter.tsx 中该目录会作为emitterOutputDir传入writeOutputWithOverwrite所有文件generated/目录下模型、控制器、序列化组件等都以它为根生成。3.2skip-format跳过 C# 代码格式化类型boolean默认值false默认情况下生成出的 C# 文件会调用dotnet format进行格式化保证缩进、命名风格一致。当生成环境没有安装 .NET SDK、或希望保留生成器原始输出以做 diff 对比时可将其设为trueoptions: typespec/http-server-csharp: skip-format: true该选项的默认值false在 lib.ts 的 Schema 中显式登记。3.3output-type模型产物与完整产物的切换类型models | all默认值allall默认生成完整的服务工程包括模型、枚举、控制器、接口、Program.cs、序列化组件、异常过滤器等models只生成模型层产物。在源码中output-type models会直接定义modelsOnly标志src/emitter.tsx并由此连锁关闭一批能力const modelsOnly options[output-type] models; const emitMocks !modelsOnly (options[emit-mocks] mocks-only || options[emit-mocks] mocks-and-project-files); const emitProjectFiles !modelsOnly options[emit-mocks] mocks-and-project-files; const useSwaggerUI !modelsOnly (options[use-swaggerui] ?? false);同时canonicalizeOperations: !modelsOnlysrc/emitter.tsx意味着模型模式下不进行操作规范化。从渲染树可以看到src/emitter.tsxmodels模式只输出generated/modelsModels与Enums以及JsonConverters控制器、Program.cs、Mock、工程文件、SwaggerUI、文档全部跳过。适用场景只希望把 TypeSpec 定义的模型契约POCO 类与枚举交付给其他团队而不需要服务骨架。options: typespec/http-server-csharp: output-type: models3.4emit-mocks让服务先跑起来类型mocks-and-project-files | mocks-only | none默认值none该选项控制是否生成业务逻辑的 Mock 实现。它直接对应参考文档中描述的能力Emits mock implementations of business logic, setup code, and project files, enabling the service to respond to requests before a real implementation is provided—— 即在真实业务实现就绪前让服务就能对请求作出响应。三个取值取值生成内容none默认不生成 Mockmocks-only仅生成 Mock 实现与辅助代码emitMocks trueemitProjectFiles falsemocks-and-project-files同时生成 Mock 实现、业务脚手架与完整工程文件emitMocks与emitProjectFiles均为true对应源码判断见 src/emitter.tsx。Mock 相关渲染组件集中在 src/components/scaffolding/mock-scaffolding.tsxMock 实现、Mock 辅助类、Mock 返回值工具而工程文件Csproj、LaunchSettings、AppSettings只在emitProjectFiles为真时渲染src/emitter.tsx。配置示例options: typespec/http-server-csharp: emit-mocks: mocks-and-project-files3.5use-swaggerui挂载 Swagger UI类型boolean默认值false设为true后发射器会在开发配置Program.cs 与文档中配置一个 SwaggerUI 端点便于在浏览器中交互式调试生成的 API。需要注意的前提SwaggerUI 依赖 OpenAPI 文档因此该功能要求你的 TypeSpec 工程同时声明并发射typespec/openapi3脚手架 CLI 的报错提示也明确说明这一点见 src/cli/cli.ts。一个典型的多发射器配置emit: - typespec/openapi3 - typespec/http-server-csharp options: typespec/openapi3: emitter-output-dir: ./openapi typespec/http-server-csharp: use-swaggerui: true3.6openapi-path自定义 OpenAPI 文档路径类型string默认值null用于为 SwaggerUI 端点指定 OpenAPI 文档的读取路径。参考文档说明当启用use-swaggerui时默认值为openapi/openapi.yaml。如果use-swaggerui: true且未显式指定该选项发射器会调用resolveOpenApiPath自动推导src/output-writer.ts其推导逻辑为重新解析工程编译配置若typespec/openapi3配置了emitter-output-dir则以该目录下的output-file默认openapi.yaml为文档位置否则回退到编译器输出目录下的typespec/openapi3/openapi.yaml默认tsp-output/typespec/openapi3/openapi.yaml计算出相对路径并做正斜杠归一化后返回。需要注意当openApiPath解析失败时effectiveUseSwaggerUI会变为falsesrc/emitter.tsxSwaggerUI 被静默降级关闭。3.7overwriteMock 文件的覆盖策略类型boolean默认值false当生成 Mock 与工程文件时是否覆盖同名已有文件。默认false表示不覆盖避免误伤开发者已经手写修改过的业务代码。该选项的语义在 src/output-writer.ts 中有精确实现generated/目录下的文件模型、枚举、控制器、序列化组件始终写入覆盖与否不受该选项影响其余文件脚手架、Mock 实现、工程文件只有在文件不存在或overwrite为true时才写入。options: typespec/http-server-csharp: emit-mocks: mocks-and-project-files overwrite: true3.8project-name生成工程名称类型string默认值ServiceProject生成工程的名称会体现在.csproj等工程文件中。源码中projectName options[project-name] ?? ServiceProjectsrc/emitter.tsx并作为Csproj组件的projectName属性传入src/emitter.tsx。同时若 TypeSpec 服务命名空间无法解析服务命名空间也会回退为ServiceProjectsrc/emitter.tsx。options: typespec/http-server-csharp: project-name: PetStoreService3.9http-port与https-port本地托管端口类型number默认值null分别指定本地托管服务时的 HTTP 与 HTTPS 端口。它们最终进入launchSettings.jsonhttpsprofile 的applicationUrl为https://localhost:{httpsPort};http://localhost:{httpPort}httpprofile 的applicationUrl为http://localhost:{httpPort}。完整模板见 src/components/project/launch-settings.tsx。值得注意的是虽然 Schema 中默认值为null但发射器在读取时存在第二层回退src/emitter.tsxconst httpPort options[http-port] ?? 5000; const httpsPort options[https-port] ?? 7000;即未配置时实际使用 5000 / 7000 作为兜底端口。options: typespec/http-server-csharp: http-port: 8080 https-port: 84433.10collection-type集合类型选择类型array | enumerable默认值array指定生成的 C# 属性使用哪种集合类型array使用T[]数组形式enumerable使用IEnumerableT形式。该值在 src/emitter.tsx 中读取并通过EmitterOptions.Providersrc/emitter.tsx注入组件树模型渲染组件通过useEmitterOptions()消费src/context/emitter-options-context.ts以此决定集合属性的输出形态。options: typespec/http-server-csharp: collection-type: enumerable四、从源码看选项如何驱动生成流程理解了全部选项后再看 src/emitter.tsx 的整体流程能更直观地把握它们之间的关系读取选项并推导派生标志collectionType、modelsOnly、emitMocks、emitProjectFiles、useSwaggerUI等标志由原始选项组合计算而来一次性解析服务类型resolveServiceTypes解析模型、枚举、接口与规范化操作映射并为output-type: models关闭操作规范化解析 OpenAPI 路径仅在需要 SwaggerUI 时调用resolveOpenApiPath组装渲染树Output→Namespace→ 各SourceDirectorygenerated/models、generated、generated/lib、Properties模型/枚举、控制器、Program.cs、Mock、工程文件按标志条件渲染写出文件writeOutputWithOverwrite依据overwrite语义落盘。最终生成的典型目录结构大致为emitter-output-dir/ ├── ServiceProject.csproj ├── appsettings.json / appsettings.Development.json ├── Properties/launchSettings.json ├── Program.cs ├── README.md使用说明文档 └── generated/ ├── models/ # 模型与枚举 ├── controllers/ # 控制器与接口 └── lib/ # 序列化转换器、HttpServiceExceptionFilter 等结构依据 src/emitter.tsx 的渲染树推断。五、配套脚手架 CLIhscs-scaffold除了通过tsp compile使用发射器仓库还提供了hscs-scaffold命令定义于 src/cli/cli.tsbin入口见 package.json一条命令即可创建带 Mock 实现的 ASP.NET 工程npx hscs-scaffold path-to-spec [--output project-directory] [--use-swaggerui] [OPTIONS]它支持的选项与 Emitter 选项高度对应CLI 选项说明默认值path-to-spec位置参数TypeSpec 规范文件或工程目录必填—--use-swaggerui包含生成的 OpenAPI 与 SwaggerUI 端点需typespec/openapi3依赖false--project-name生成工程名称ServiceProject--http-port/--https-port本地 HTTP / HTTPS 端口未指定时自动探测--overwrite覆盖已有 Mock 实现与工程文件true注意与 Emitter 选项默认false不同--output工程创建目录当前目录--collection-type集合类型取值array/enumerablearray一个有意思的实现细节当未指定端口时脚手架会在 5000–5999HTTP与 7000–7999HTTPS区间内随机探测空闲端口src/cli/cli.ts探测逻辑见 src/utils/port.ts —— 它通过net.createServer().listen(port)尝试监听来验证端口可用性最多尝试 100 次。内部实现上hscs-scaffold最终仍然是把这些参数翻译成npx tsp compile ... --option参数调用发射器src/cli/cli.ts并强制注入emit-mocksmocks-and-project-files、--trace http-server-csharp等参数。六、典型组合场景实战场景 A只输出模型契约如果只想把 TypeSpec 模型交付给 C# 侧做数据契约不生成服务骨架emit: - typespec/http-server-csharp options: typespec/http-server-csharp: output-type: models collection-type: enumerable skip-format: false场景 B一键生成可响应的 Mock 服务让服务在真实业务实现之前就能处理请求emit: - typespec/http-server-csharp options: typespec/http-server-csharp: emit-mocks: mocks-and-project-files project-name: QuickStartService http-port: 5100 https-port: 7100 overwrite: true场景 C附带 SwaggerUI 的完整工程emit: - typespec/openapi3 - typespec/http-server-csharp options: typespec/openapi3: emitter-output-dir: ./openapi output-file: openapi.yaml typespec/http-server-csharp: use-swaggerui: true openapi-path: openapi/openapi.yaml这里openapi-path指向 openapi3 发射器输出目录中的文档相对路径即便不显式配置发射器也会尝试从 openapi3 的配置中自动推导见 3.6 节。场景 D命令行快速验证在 CI 或脚本中命令行方式最直接tsp compile . \ --emittypespec/http-server-csharp \ --option typespec/http-server-csharp.emit-mocksmocks-and-project-files \ --option typespec/http-server-csharp.project-nameCIService \ --option typespec/http-server-csharp.overwritetrue七、使用注意事项与诊断信息SwaggerUI 的硬依赖use-swaggerui: true时工程必须同时发射typespec/openapi3否则文档路径解析失败SwaggerUI 会被静默降级关闭src/emitter.tsx。overwrite的默认值差异Emitter 选项默认false而hscs-scaffoldCLI 默认true混用时注意区分。选项名校验严格Schema 声明additionalProperties: false拼写错误或非法取值会直接报错而不是被忽略src/lib.ts。编译诊断发射器注册了多类诊断src/lib.ts其中大部分为 warning例如no-numeric不精确的数值类型如numeric无法直接映射单一 C# 数值类型会选用最安全的映射并提示指定更精确的类型如int32、float64anonymous-model内联模型在生成代码中使用自动命名建议显式命名模型get-request-bodyGET 操作不应携带请求体invalid-identifier、unrecognized-scalar、invalid-interpolation等。dryRun 支持发射器声明了dryRun: true能力src/lib.ts意味着可配合编译器的 dry-run 模式预览输出而不落盘。八、小结typespec/http-server-csharp的配置面并不复杂但每个选项都对应着清晰的生成行为分支output-type决定产物范围、emit-mocks决定是否以及如何生成 Mock 与工程文件、use-swaggerui/openapi-path决定 API 文档的接入、http-port/https-port决定本地托管端口、collection-type决定集合形态、overwrite决定文件覆盖策略。理解这些选项在 src/emitter.tsx 中的推导逻辑后你就能像搭积木一样组合出适合自己的 C# 服务生成流程——无论是仅交付模型契约还是直接生成一个带 Mock 与 SwaggerUI 的可运行 ASP.NET Core 服务。更完整的发射器概述与更新记录可继续阅读 packages/http-server-csharp/README.md 与 packages/http-server-csharp/CHANGELOG.md。【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表