十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TypeSpec http-client-js 发射器使用指南:CLI 与 tspconfig 配置方式、输出目录与 package-name 选项

TypeSpec http-client-js 发射器使用指南:CLI 与 tspconfig 配置方式、输出目录与 package-name 选项 TypeSpec http-client-js 发射器使用指南CLI 与 tspconfig 配置方式、输出目录与 package-name 选项【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespec本文围绕typespec/http-client-js发射器的官方参考文档展开完整覆盖两种调用方式命令行tsp compile与tspconfig.yaml配置、全部两个发射器选项emitter-output-dir与package-name的类型与默认值并结合 发射器源码、选项 Schema 定义 与 编译器输出目录默认值逻辑说明每个配置项在代码中的真实生效路径帮助你可复制、可验证地配置该发射器。发射器是什么typespec/http-client-js是 TypeSpec 仓库packages/http-client-js目录下的一个库其 package.json 中的描述为 TypeSpec library for emitting Http Client libraries for JavaScript/TypeScript即把 TypeSpec 中定义的 HTTP API 编译为可构建的 JavaScript/TypeScript 客户端代码包。从 入口文件 可以看到该库对外暴露两个核心导出export { $onEmit } from ./emitter.js; export { $lib } from ./lib.js; import typespec/http-client/typekit; import typespec/http/experimental/typekit;$lib是 TypeSpec 库元信息含发射器选项 Schema 与诊断项定义$onEmit是编译器在 emit 阶段调用的主函数。package.json中还声明了三个peerDependenciestypespec/compiler、typespec/http、typespec/rest说明使用该发射器时需要同时具备编译器、HTTP 库与 REST 库这也是运行tsp compile前项目依赖上的适用前提。方式一通过命令行最直接的调用方式是在 TypeSpec 项目根目录执行tsp compile . --emittypespec/http-client-js.是入口.tsp文件或项目目录--emittypespec/http-client-js指定本次编译要调用的发射器emitter值为发射器的 npm 包名。编译器解析到--emit参数后会加载对应包的$lib/$onEmit随后把编译产物写入发射器输出目录。方式二通过 tspconfig.yaml 配置如果不想每次都在命令行传入--emit可以在tspconfig.yaml中声明emit: - typespec/http-client-js在此基础上同一份配置还可以为发射器追加选项格式为在options下以发射器包名为键的嵌套映射emit: - typespec/http-client-js options: typespec/http-client-js: option: valueoptions中具体可写的键由发射器在 lib.ts 中声明的选项 Schema 决定见下文发射器选项一节。发射器选项emitter-output-dirTypeabsolutePath说明定义发射器的输出目录默认值为{output-dir}/typespec/http-client-js。这个默认行为可以直接在编译器源码中得到印证。program.ts 中编译器在为每个发射器准备运行时环境时会先取出emitter-output-dir选项let { emitter-output-dir: emitterOutputDir, ...emitterOptions } // ... if (emitterOutputDir undefined) { emitterOutputDir [options.outputDir, metadata.name].filter(isDefined).join(/); }即未显式指定时输出目录 全局output-dir拼接发射器包名typespec/http-client-js。这也解释了为何该选项从 Schema 角度看不属于 http-client-js 的自定义选项而是所有发射器通用的输出目录约定它会被编译器单独提取不会混入传给$onEmit的emitterOptions。拿到目录后http-client-js 发射器通过 emitter-framework 的writeOutput落盘见 write-output.ts它接收emitterOutputDir参数把发射器构建出的 SourceFile/SourceDirectory 树按joinPaths(emitterOutputDir, sub.path)逐层写到磁盘。package-nameTypestringDefaulttest-package说明生成包在package.json中的包名。该选项在 lib.ts 中的 Schema 定义如下export interface JsClientEmitterOptions { package-name?: string; } const EmitterOptionsSchema: JSONSchemaTypeJsClientEmitterOptions { type: object, additionalProperties: true, properties: { package-name: { type: string, nullable: true, default: test-package, description: Name of the package as it will be in package.json, }, }, required: [], };两个细节值得注意Schema 标记了additionalProperties: true意味着tspconfig.yaml的 options 映射中写入未知键不会因 Schema 校验直接报错但也不会被发射器消费package-name的default是test-package这是一个面向测试的占位默认值实际使用时建议在配置中显式指定有意义的包名。在 emitter.tsx 的主函数中可以看到该选项的消费点export async function $onEmit(context: EmitContextJsClientEmitterOptions) { const packageName context.options[package-name] ?? test-package; const output ( Output program{context.program} HttpClientOverrides ts.PackageDirectory name{packageName} version1.0.0 path. scripts{{ build: tsc }} devDependencies{{ types/node: ~18.19.75 }} // ... /ts.PackageDirectory /HttpClientOverrides /Output ); await writeOutput(context.program, output, context.emitterOutputDir); }packageName直接成为生成包package.json的name字段代码里用??做了兜底与 Schema 中的default: test-package保持一致。发射器生成的包结构同样从 emitter.tsx 的$onEmit实现中可以确认发射器输出的代码包采用如下目录约定生成于emitter-output-dir指向的位置根目录是一个package.json包名由package-name决定版本固定为1.0.0附带build: tsc脚本与types/node ~18.19.75开发依赖src/客户端入口与模型含models/Models与各模型的内部序列化器ModelSerializersapi/操作Operations目录helpers/分页辅助PagingHelpers、接口定义Interfaces、Multipart 辅助MultipartHelpers以及error.tsRestError类。此外lib.ts 还集中定义了发射器在编译期可能输出的诊断项例如诊断码级别含义unknown-encodingwarning未知编码multiple-auth-schemes-not-yet-supportedwarning多个认证方案尚不支持回退到第一个key-credential-non-header-not-implementedwarning非 header 位置的 key credential 未实现回退为不携带认证信息unsupported-nondiscriminated-unionwarning不支持无判别字段的联合类型跳过反序列化器unsupported-content-typewarning不支持的内容类型回退到 JSONmissing-http-partswarning操作声明为 Multipart 但没有 partsoperation-not-in-clienterror操作不属于任何 clientnon-model-partserror不支持非 model 类型的 partsclient-not-founderror找不到操作对应的 client在配置tspconfig.yaml运行发射器后如果 API 定义中存在上述情形即可根据这些诊断信息定位需要修正的 TypeSpec 声明。参考文档的维护方式从 package.json 的 scripts 可以看到本文所依据的参考页是由 tspd 文档生成器从选项 Schema 自动产出的regen-docs: tspd doc . --enable-experimental --output-dir ../../website/src/content/docs/docs/emitters/clients/http-client-js/reference --skip-js也就是说参考文档中的选项类型/默认值/描述与 lib.ts 里的EmitterOptionsSchema是同一份数据的两个视图。当你想确认某个选项的准确语义时直接阅读该 Schema 是最可靠的依据选项语义变更后文档通过regen-docs重新生成即可保持同步。小结命令行调用tsp compile . --emittypespec/http-client-js配置调用tspconfig.yaml的emit列表中加入包名并可在options下按包名嵌套写入选项emitter-output-dir控制产物目录缺省为{output-dir}/typespec/http-client-js默认值逻辑见 program.tspackage-name控制生成包package.json的name缺省为test-package见 lib.ts 与 emitter.tsx产物结构、编译期诊断等进一步细节均可在packages/http-client-js/src目录下对应源码中查证。【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表