TypeSpecを利用してOpenAPIの仕様書を作成すると、デフォルトではtsp-output/@typespec/openapi3/openapi.yaml
のパスにファイルが出力されます。
これを任意のフォルダ(例えばswagger/spec.yaml
)へ出力するように設定を変更する方法をまとめます。
最終的には設定ファイルを以下のように記述しました。
emit:
- "@typespec/openapi3"
options:
"@typespec/openapi3":
emitter-output-dir: "{output-dir}"
output-file: "{service-name}.{version}.spec.yaml"
output-dir: "{project-root}/openapi"
設定の変更
TypeSpecの設定はtspconfig.yaml
に記載するか、CLIでのコンパイル実行時にフラグを指定することで変更できます。この記事では前者のtspconfig.yaml
に記載する方法で説明したいと思います。
tspconfig.yaml
ファイルは、コンパイル時のエントリーポイントのパスに存在するものか、最も近い親フォルダに存在するものが参照されるようです。
出力フォルダを設定
デフォルトではファイルは{output-dir}/{emitter-name}
というパスで出力されます。
Emitterというのは、TypeSpecで記述した仕様の出力フォーマットのようなものと私は認識しています。互換性があるものであれば、1つの記述でOpenAPIの仕様で出力したり、gRPCのProtobufで出力したりと出し分けられるようです。
今回想定しているユースケースはOpneAPIの仕様のみの出力なので、出力フォルダをemitter名を含まないopenapi
フォルダとすることにします。
output-dirの設定
tspconfig.yaml
に以下のように追記します。
emit:
- "@typespec/openapi3"
+ output-dir: "{project-root}/openapi"
ここで{project-root}
は組み込み変数で、tspconfig.yaml
ファイルのあるフォルダのパスを参照します。
ちなみに、output-dir
は絶対パスにする必要があり、output-dir: "./swagger"
などには設定できません。
これでopenapi/@typespec/openapi3/openapi.yaml
にファイルが出力されるようになりました。
emitter-nameの設定
上記の設定では出力フォルダにまだemitter名のパスが残っているため、emitter名を省略するように設定します。
emit:
- "@typespec/openapi3"
+ options:
+ "@typespec/openapi3":
+ emitter-output-dir: "{output-dir}"
output-dir: "{project-root}/swagger"
ここでは、OpneAPIの仕様書を出力する@typespec/openapi3
のエミッターのオプションとして、出力先に大元のoutput-dir
をそのまま指定しています。
この設定により、swagger/openapi.yaml
に出力されるようになりました。
出力ファイル名を設定
次に出力されるファイル名がspec.yaml
となるように設定を変更します。
emit:
- "@typespec/openapi3"
options:
"@typespec/openapi3":
emitter-output-dir: "{output-dir}"
+ output-file: "{service-name}.{version}.spec.yaml"
output-dir: "{project-root}/openapi"
ファイル名は、デフォルト値が{service-name}.{version}.openapi.yaml
という形式なようです。なので、それを踏襲して最後のopenapi.yaml
の部分のみspec.yaml
へと変更しています。
これにより目的としていたopenapi/spec.yaml
への出力ができるようになりました。