ããã«ã¡ã¯ããã¯ã©ã¯äºæ¥é¨ ãã¯ã©ã¯ãã¸ãã¹ã«ã¼ãéçºãã¼ã ã§EMã¨TechLeadãæ å½ãã¦ãã髿± @shnjtk ã§ãã
ä»åã¯ãopenapi-generator ã使ã£ã¦OpenAPIå®ç¾©ãã¡ã¤ã«(OpenAPI Specification)ããGoã®ã³ã¼ããçæããæ¹æ³ã¨ãéç¨æã®Tipsã«ã¤ãã¦ãç´¹ä»ãã¾ãã
èæ¯
ãã¯ã©ã¯äºæ¥é¨ã§ã¯ãã¹ãã¼ãé§åéçºã«ããDBãGraphQLã®ã¹ãã¼ãå®ç¾©ãOpenAPIå®ç¾©ãã¡ã¤ã«ãªã©ããèªåçæãããã³ã¼ããç©æ¥µçã«å©ç¨ããéçºã¹ã¿ã¤ã«ãæ¡ç¨ããã¦ãã¾ãã
OpenAPIã«ã¤ãã¦ã¯ãããã¾ã§ã¯ go-swagger ãå©ç¨ãã¦ãã¾ãããã対å¿ãã¦ãããã¼ã¸ã§ã³ã OpenAPI v2.0 ã¾ã§ã§ãããããOpenAPI v3.0 ã«æºæ ããOpenAPIå®ç¾©ãã¡ã¤ã«ããã¯ã³ã¼ãã®çæãã§ãã¾ããã§ããã èªç¤¾éçºã®APIã§ããã°ãã¼ã¸ã§ã³ãOpenAPI v2ã«ãããã¨ã§å¯¾å¿ã¯ã§ãã¾ãããä»ç¤¾ã«ããéç¨ããã¦ããREST APIãµã¼ããå©ç¨ããå ´åã«ããããOpenAPI v3ã§ããã°ãããã訳ã«ããããªããããOpenAPI v3ã«å¯¾å¿ãããã¼ã«ã調æ»ããçµæãopenapi-generatorãå©ç¨ãããã¨ã«ãã¾ããã
ã³ã¼ãçææ¹æ³
æ¬è¨äºã§ã¯ãå ¬å¼ãµã¤ãã«ã¦å ¬éããã¦ãã petstore.yaml ã使ç¨ãã¾ãã
openapi-swaggerã®åºæ¬çãªä½¿ãæ¹
å ¬å¼ãµã¤ãã«ããããã«ãåºæ¬çãªä½¿ãæ¹ã¯ä»¥ä¸ã®ããã«ãªãã¾ããããã§ã¯Dockerã使ç¨ãã¦ãã¾ãããnpmãHomebrewã使ã£ãæ¹æ³ãå ¬å¼ãµã¤ãã«è¨è¼ããã¦ãã¾ãã®ã§ããã¡ããããæ¹ã¯å ¬å¼ãµã¤ãããåç §ãã ããã
docker run --rm \
-v $PWD:/local openapitools/openapi-generator-cli generate \
-i /local/petstore.yaml \
-g go \
-o /local/out/go
-i ãªãã·ã§ã³ã§å¯¾è±¡ã¨ãªãå®ç¾©ãã¡ã¤ã«ãã-o ãªãã·ã§ã³ã§åºåå
ãæå®ãã¾ãã
ã¾ãã-g ã§çæããã³ã¼ãã®è¨èªãæå®ãã¾ãã
ããã±ã¼ã¸åãæå®ãã
--additional-properties ãªãã·ã§ã³ã§ããã±ã¼ã¸åãæå®ã§ãã¾ããããã§ã¯ petstore ããã±ã¼ã¸ã¨ãã¾ããããã«ãããã¦ãçæãããã³ã¼ãã®åºåå
ã夿´ãã¾ããèªåçæããããã®ã§ãããã¨ã示ãããã«ããã£ã¬ã¯ããªãåãããããã¡ã¤ã«åã xxx.gen.go ã®ããã«ãããªã©è²ã
ããæ¹ã¯ããã¨æãã¾ãããå¼ç¤¾ã§ã¯ /gen ã®ããã«ãã£ã¬ã¯ããªãåãããã¨ãå¤ãã§ãã
- ããã±ã¼ã¸åãæå®ããçæã³ãã³ã
docker run --rm \
-v $PWD:/local openapitools/openapi-generator-cli generate \
-i /local/petstore.yaml \
-g go \
--additional-properties packageName=petstore \
-o /local/gen/petstore
å²ãå½ã¦ãåãæå®ãã
--type-mappings ãªãã·ã§ã³ã§çææã«å²ãå½ã¦ãåãæå®ã§ãã¾ããä¾ãã° #/components/schemas/Pet ã®ããããã£ã«ä»¥ä¸ã®ããã«numberåã®priceã追å ããå ´åãèªåçæãããã³ã¼ãã§ã¯float32ã«ãªãã¾ãããããfloat64ã«å¤æ´ãããå ´åã¯æ¬¡ã®ããã«æå®ãã¾ãã
- Pet ã®ãããã㣠(é¢é£ç®æä»¥å¤ã¯çç¥)
Pet:
properties:
price:
type: number
- åãæå®ããçæã³ãã³ã
docker run --rm \
-v $PWD:/local openapitools/openapi-generator-cli generate \
-i /local/petstore.yaml \
-g go \
--additional-properties packageName=petstore \
--type-mappings number=float64 \
-o /local/out/go
ããããã£å®ç¾©ã§ format: double ã®ããã«ããã°ãªãã·ã§ã³ãä»ããªãã¦ãfloat64ãå²ãå½ã¦ãããã³ã¼ããçæãã¾ãããä»ç¤¾ã«ãã使ãããOpenAPIå®ç¾©ãã¡ã¤ã«ã§ãã®ãããªæå®ãããã¦ããªãã£ãã¨ãã«ä¸æ¬ãã¦å²ãå½ã¦ãå ´åã«ä¾¿å©ã§ããformatæå®ã®ãªãintegerãint64ãint32ã«å²ãå½ã¦ãå ´åãåæ§ã§ãã
éç¨æã®Tips
ã³ã¼ãçæã³ãã³ããã¿ã¹ã¯ã©ã³ãã¼ã«è¨è¼ãã
å¼ç¤¾ã§ã¯ããã¯ã¨ã³ãéçºã«ããã¦Makefileã«ããã³ãã³ãã管çãããã¨ãå¤ãã®ã§ãMakefileã«ã³ã¼ãçæã³ãã³ãã追å ãã¾ããããã«ãããã³ã¼ãçææã®ãªãã·ã§ã³ã®ç·¨éãªã©ãgitã§ç®¡çã§ããããã«ãªããããã©ã®ãããªãªãã·ã§ã³ããã¤ä»ãããã»å¤ããããçç±ã¨ã¨ãã«ææ¡ã§ããããã«ãªãã¾ãã
gen-petstore:
docker run --rm \
-v ${PWD}:/local openapitools/openapi-generator-cli generate \
-i /local/petstore.yaml \
-g go \
--additional-properties packageName=petstore \
--type-mappings number=float64 \
-o /local/gen/petstore
èªåçæãããã³ã¼ãã¯ç·¨éããªã
ããã¯ã³ã¼ãçæã«ãããéåã§ãããèªåçæãããã³ã¼ããç·¨éããã¨ã次ã«ã³ã¼ããçæããã¨ãã«ä¸æ¸ãããã¦å¤±ããã¦ãã¾ãã®ã§ãèªåçæãããã³ã¼ãã¯ç·¨éãã¦ã¯ããã¾ãããIDEã«ãã£ã¦ã¯èªåçæãããã³ã¼ããç·¨éããã¨è¦åã表示ãããã®ã§ãããèªåãä»è§¦ã£ã¦ããã³ã¼ããèªåçæããããã®ãåãããªãå ´åã¯ããã®ãããªè¡¨ç¤ºãè¦éããªãããã«ãã¾ãããã

OpenAPIå®ç¾©ãã¡ã¤ã«ãgit管çã®å¯¾è±¡ã«å«ãã
ä»ã®èªåãã¡ã®ãµã¼ãã¹ãã©ã®APIãã¼ã¸ã§ã³ã«å¾ã£ã¦ããã®ããè¨é²ããããã«ããOpenAPIå®ç¾©ãã¡ã¤ã«ã¯git管çã®å¯¾è±¡ã«å«ããããã«ãã¾ãããã APIãã¼ã¸ã§ã³ã¯OpenAPIå®ç¾©ãã¡ã¤ã«ä¸ã«è¨è¼ããã¦ãã¾ãããã³ããããã°ã«ããã®APIãã¼ã¸ã§ã³ãè¨è¼ãã¦ããã¨ãã°ãè¦ãã ãã§ããã«åããããã«ãªãã¾ãã
ä¾ãã°ãæåã«éçºããæç¹ã§ã¯API v1.0.0ã ã£ãã¨ãã¦ããã®å¾API v1.1.0ã«ãã¼ã¸ã§ã³ã¢ããããéã«ãã®OpenAPIå®ç¾©ãã¡ã¤ã«ãæ´æ°ãã¦v1.1.0ã¨ãã¦ã³ããããã°ã«è¨é²ãã¦ããã°ãå¾ãã対象ã®OpenAPIå®ç¾©ãã¡ã¤ã«ã®ãã°ãè¦ãã¨ãã«ä¸ç®ã§ç¾å¨ã®ãã¼ã¸ã§ã³ãåããã¾ãã
% git log --oneline petstore.yaml 9bd88ab feat: add petstore.yaml v1.1.0 1a1234e feat: add petstore.yaml v1.0.0
OpenAPIå®ç¾©ãã¡ã¤ã«ãç·¨éããå ´åã¯ãªãªã¸ãã«ã¨ã¯å¥ã«ãã¡ã¤ã«ã使ãã
APIãµã¼ãã¹ã®æä¾å ããOpenAPIå®ç¾©ãã¡ã¤ã«ãå ¥æããå ´åã¯åºæ¬çã«ã¯ç·¨éããªãæ¹ãããã®ã§ãããäºæ ã«ããã©ããã¦ãç·¨éããããå¾ãªãã¨ããå ´åãããããããã¾ããããã®ãããªå ´åã¯ããªãªã¸ãã«ã®å®ç¾©ãã¡ã¤ã«ã¨èªåãã¡ã§ç·¨éãããã¡ã¤ã«ãããããå¥ãã¡ã¤ã«ã¨ãã¦gitã§ç®¡çãããã¨ããããããã¾ããçç±ã¯ãä¾ãã°APIãã¼ã¸ã§ã³ãv1.0.0ããv1.1.0ã«ä¸ãã£ãã¨ãã«ãAPI v1.0.0ã¨ã®å·®åã¨ãAPI v1.0.0ã«å¯¾ãã¦èªåãã¡ã§ç·¨éããå 容ã¨ã®å·®åãããããåå¥ã«ç¢ºèªã§ããããã«ãªãããã§ãã
ã¾ã¨ã
openapi-generatorã使ããã¨ã§OpenAPI v3.0ã®å®ç¾©ãã¡ã¤ã«ããã§ãGoã®ã³ã¼ããçæã§ãããããç¹ã«ã¢ãã«ã®çæã«æ´»ç¨ãã¦ãã¾ãã APIã®ãã¼ã¸ã§ã³ã¢ããã«è¿½å¾ããéããdiffãè¦ãªãã夿´å 容ãå½±é¿ç¯å²ãææ¡ãã¦ä½æ¥ãé²ãããããããèªä¿¡ãæã£ã¦æ´æ°ä½æ¥ã«åãçµããã¨ãã§ãã¾ãããã®ãããã¯ã¾ãå¥ã®è¨äºã«ã¦ãç´¹ä»ã§ããã°ã¨æãã¾ãã
ãããã«
åé ã§æããããã«ããã¯ã©ã¯äºæ¥é¨ã§ã¯çééçºãå®ç¾ããããã«ãOpenAPIã«éããDBã¹ãã¼ããGraphQLã¹ãã¼ããªã©ããã³ã¼ããèªåçæããã¹ãã¼ãé§åéçºãæ¡ç¨ãã¦ãã¾ãããã®ãããªãã¼ã«ãæ´»ç¨ããéçºå¹çåãçç£æ§ã®åä¸ã«èå³ãããæ¹ã¯ãã²ãæ°è»½ã«ã話ãã¾ãããï¼