swagger-codegen
概要
インストール
code:bash
# wget経由だとjarがDLされる。ので,java環境が必要
java -jar swagger-codegen-cli.jar help
# homebrewは単純
brew install swagger-codegen
Getting Started
コードを生成する
code:sh
# コード生成
$ swagger-codegen generate \
-i <Swagger定義先のパス or URL> \
-l <言語> \
-o <出力先>
一部のみコードを生成する
java オプションを加えると、モデルのみ生成、などができるようだ。
code:bash
java -Dmodels ...
カスタマイズ
テンプレート
既存の言語の振る舞いを変えたい場合や他の言語をサポートしたい場合は、カスタムテンプレート を記述して利用できる。テンプレート言語には mustache が利用されている。modules/swagger-codegen/src/main/resources/${任意の言語} にテンプレート群が配置されているので参考にできる。 利用したテンプレートはディレクトリ内にまとめて配置し、-t でディレクトリ名を渡す。
オプション
型のマッピングをカスタマイズできるよう、各言語は設定ファイルをサポートしている。
以下に各言語毎のクライアントが定義されており、各々のファイル内にサポートしているオプションが記述されている。
一部抜粋すると以下のような感じ。
code:java
cliOptions.add(new CliOption(PROJECT_NAME, "Project name in Xcode"));
サポートされているオプションは言語毎に異なる。これは、config-help -l {言語} コマンドでも確認できる。
code:bash
swagger-codegen config-help -l swift4
これらのオプションは config.json 等、json ファイルにまとめて記述し、オプションで受け渡す。
code:json
{
"apiPackage" : "petstore"
}
code:bash
swagger-codegen generate \
-i {スキーマ定義} \
-l {言語} \
-o {出力先} \
-c path/to/config.json
モジュール
code:sh
swagger-codegen meta \
-o {プロジェクト出力先} \
-n {ジェネレータの名前} \
-p {mainクラスを配置するパッケージ名}
プロジェクトを作成したら、mvn package コマンドでコンパイルし、利用する。
code:bash
java -cp output/myLibrary/target/myClientCodegen-swagger-codegen-1.0.0.jar:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar io.swagger.codegen.SwaggerCodegen \
-l {ジェネレータの名前}
-i {スキーマ名}
-o {出力先}
Tips
相対パスの問題でコード生成に失敗する
code:sh
18:15:43.581 Thread-1 WARN io.swagger.v3.parser.OpenAPIV3Parser - Exception while reading: java.lang.RuntimeException: Unable to load RELATIVE ref: ../../../../../index.yml path: /Users/tasuku_tozawa/workspace
at io.swagger.v3.parser.util.RefUtils.readExternalRef(RefUtils.java:212)
at io.swagger.v3.parser.ResolverCache.loadRef(ResolverCache.java:119)
at io.swagger.v3.parser.processors.ParameterProcessor.processParameters(ParameterProcessor.java:86)
at io.swagger.v3.parser.processors.PathsProcessor.processPaths(PathsProcessor.java:75)
at io.swagger.v3.parser.OpenAPIResolver.resolve(OpenAPIResolver.java:49)
at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:53)
at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
at io.swagger.codegen.v3.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:495)
at io.swagger.codegen.v3.cli.cmd.Generate.run(Generate.java:340)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: Could not find ../../../../../index.yml on the classpath
at io.swagger.v3.parser.util.ClasspathHelper.loadFileFromClasspath(ClasspathHelper.java:31)
at io.swagger.v3.parser.util.RefUtils.readExternalRef(RefUtils.java:206)
... 9 common frames omitted
予約語について
言語毎に予約語が決まっていて、それが Swagger 仕様に含まれていた場合、自動的に _ を先頭に付与して定義される。
これを別の方法で変換したい場合は、--reserved-words-mappings オプションを利用できる。
code:sh
swagger-codegen generate \
-i ./index.yml \
-l swift4 \
-o ./tmp \
-c config.json \
--reserved-words-mappings id=identifier
HTML エスケープについて
意図せずメソッド説明欄が HTML エスケープされることがあるが、テンプレートを書き換えて {{{}}} で囲めば良い。mustache 都合の話。