https://github.com/gogo/protobufã¯ãã管çãããŠããŸããhttps://github.com/gogo/protobuf/issues/691 ïŒçŸåšïŒ
ããã¯ç§ãã¡ã®äŸåé¢ä¿ã§ãããæ°ããgolang/protobuf
ããŒãžã§ã³ãšäºææ§ããªãããŸããŸãå€ãã®ããã±ãŒãžãäŸåããŠãããããçŽæ¥ã®äŸåé¢ä¿ã®å€ãããŒãžã§ã³ã«å¿ããŠã golang/protobuf
ããŒãžã§ã³ã眮ãæããå¿
èŠããããŸãããã®æ¹æ³ã§ããã±ãŒãžãå£ã
gogo/protobuf
äŸåé¢ä¿
ãããç解ãã
æ°ããã¡ã³ãããç»å Žããã®ãããããšãæ©èœãåçã®å¥ã®ãã©ã°ã€ã³ãç»å Žããã®ããææ¡ããŸããïŒ
ããã©protobufã ãã䜿çšããŸããïŒ
ãã¹ã
ã¯ã
䜿çšããŠããæ€èšŒãã©ã°ã€ã³ã¯ãGoGoã®ãµããŒããçµäºããŸãã
https://github.com/envoyproxy/protoc-gen-validate/pull/340
åé²ããããã®æåã®æ¹æ³ã¯ããšã³ã·ã¹ãã ããã©ããgogo / protobufãã移è¡ããããšã ãšæããŸãã ä»ã®äŸåé¢ä¿ãgogoããé¢ããã«ã€ããŠãããã䜿ãç¶ããããšããŸããŸãé£ãããªããšæããŸãã ãã¡ããã移è¡ããã®ã¯å€§å€ãªäœæ¥ã«ãªãã®ã§ã移è¡ããå Žåã¯ãé©åãªèšç»ãç«ãŠãå¿ èŠããããŸãã
@rvolosatovsã¯ãããããgogottn
ãžã§ãã¬ãŒã¿ãŒã§èšå®ãããŠããã«ã¹ã¿ã ãªãã·ã§ã³ã«ã€ããŠè©³ããç¥ã£ãŠããŸãããprotoãã¡ã€ã«ã®æ瀺çãªãªãã·ã§ã³ã«ã€ããŠç§ãèŠã€ãããã®ã¯æ¬¡ã®ãšããã§ãã
gogoproto.customname
ã gogoproto.stdtime
ã gogoproto.stdduration
ãããã³goproto_enum_prefix
ãªãã·ã§ã³ãåé€ããããšããå§ããããšãã§ããŸãã Goã³ã³ãã€ã©ã¯çµæãšããŠçããåé¡ã«ã€ããŠããã«æå¥ãèšãã®ã§ããããã¯æ¯èŒçç°¡åã«åé€ã§ããŸããgogoproto.embed
ãªãã·ã§ã³ãåé€ãããšãåã蟌ã¿ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããªããªãïŒGoã³ã³ãã€ã©ãããããèŠã€ããã®ã«åœ¹ç«ã¡ãŸãïŒãã¡ãã»ãŒãžãäžéšã®ã€ã³ã¿ãŒãã§ã€ã¹ãæºãããªããªãããšãæå³ããŸãïŒããã¯ããé£ããå ŽåããããŸãïŒãgogoproto.nullable
ãªãã·ã§ã³ã¯ãã²ãã¿ãŒã®äœ¿çšãéå§ããnil-checksãè¿œå ããå¿
èŠããããããã¯ããã«æéãããããŸãã çµæãšããŠçããåé¡ã¯ãGoã³ã³ãã€ã©ã«ãã£ãŠæ€åºãããªãå ŽåããããŸãã èããããåé¿çã¯ããããã®ãã£ãŒã«ããäžæçã«ãã©ã€ããŒãã«ããŠãããã²ãã¿ãŒ/ã»ãã¿ãŒã«æžãçŽããŠãæåŸã«ãã£ãŒã«ããåã³ãããªãã¯ã«ããããšã§ããgogoproto.customtype
ã䜿çšãããã£ãŒã«ããšã gogoproto.enum_stringer
ãªãã·ã§ã³ã䜿çšããåæåã§ãã ãããã«ã€ããŠã¯ãããŒã·ã£ãªã³ã°/ã¢ã³ããŒã·ã£ãªã³ã°ã®æ¹æ³ãJSONã«å€æŽããããšããããããŸãã EUIãDevAddrãªã©ã®ã«ã¹ã¿ã bytes
ãã£ãŒã«ãã®å Žåãã¿ã€ãïŒãããã¡ãã»ãŒãžå
ïŒãstring
ïŒãã€ããªäºæïŒã«å€æŽã§ããŸãã åæåã§ã¯ãæååãšæŽæ°ã®äž¡æ¹ãšããŠïŒUnmarshalJSONã«ãã£ãŠïŒåãå
¥ããããããã«ãªã£ããããJSONAPIãæ©èœããªããªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãããã¶ããããã¯ç§ãã¡ã®v4 APIã«ã€ããŠèãå§ããè¯ãæ©äŒã§ããããŸãããªããªããç§ãã¡ã¯ããã«ããã€ãã®ïŒAPIãå£ãïŒé©ããçºèŠãããããããªããšæ³åã§ããããã§ãã
åé²ããããã®æåã®æ¹æ³ã¯ãæåã«https://github.com/alta/protopatchãè©Šãããšã ãšæã
api
ãã£ã¬ã¯ããªã§æ€çŽ¢ããŠçœ®æããã ãã§ãïŒprotopatch
ã«è²¢ç®ããå¿
èŠããããŸããäœåŽåæ©èœã ããã¯å®éã«ã¯ãªãã·ã§ã³ã«ãã£ãŠç°ãªããŸããã customtype
ã«ã€ããŠè©±ããŠããå ŽåãIMOã¯ééããªãè²¢ç®ãæ£åœåããŸããã stdtime
ãããªãã®ã¯ããã»ã©å€ããããŸãããå°æ¥çã«ã¯ãå®è¡æã«å
éšçã«ã³ã³ããŒãã³ãã§ããã©protobufããããçŽæ¥äœ¿çšããã¹ãã§ã¯ãªããšæããŸãïŒä»æ¥æäŸãããŠããprotobufã®æ©èœã»ãããåæãšããŠããŸãïŒã
ïŒéïŒã·ãªã¢ã«åãã€ãŸãã¹ãã¬ãŒãžãšAPIã¬ã€ã€ãŒã«protobufã䜿çšããããšã¯æå³ããããŸãã ãã ããå
éšçã«ã¯ããã¬ãŒã³ãªããã©ã§çæãããGoãããã䜿çšããŠãæå³ããããŸããã
ãããã£ãŠãããšãã°ãNSïŒ
*ttnpb.EndDevice
ïŒããã©çæã®Goã¿ã€ãïŒãååŸããä¿åãããŠãããã€ããªããŒã¿ããéã·ãªã¢ã«åããŸã*ttnpb.EndDevice
ãT_device
ã«å€æããŸãïŒæ³šïŒãããããæåã¯ã©ãããŒã§ããããæ°žä¹
ã«ã©ãããŒã§ããå¯èœæ§ããããŸãïŒT_device
䜿çšããT_device
ã*ttnpb.EndDevice
å€æããŸãïŒæ³šïŒã©ãããŒã䜿çšããŠããå Žåãå€æŽããããã£ãŒã«ããå€æŽããã ãã§ããã€ããªã§ãå®è¡ã§ãããããããã¯ç°¡åã§éåžžã«é«éãªã¿ã¹ã¯ã«ãªãå¯èœæ§ããããŸãããŒã¿ãçŽæ¥ïŒ*ttnpb.EndDevice
ããã€ããªããŒã¿ã«ã·ãªã¢ã«åããŸãåç §https://github.com/TheThingsNetwork/lorawan-stack/issues/342 ïŒçæãããããã¥ã¬ãŒã¿ãŒïŒ
ç§ã¯gogoã®ïŒããå°ããªïŒä»£æ¿æ段ãæ¯æããŠããŸããã 猶ãæŒããããªæãã§ãã ç©äºãå¯èœãªéãããã©ã«ä¿ã¡ãŸããããç¹ã«ãåé²ããããã®æåã®æ¹æ³ãããäžåºŠæ±ºå®ããå¿ èŠãããå Žåã¯ããã§ãã
çæããããããã«ã©ãã§ãäŸåããã®ã§ã¯ãªããããã€ãã®å Žæã§äžéã¿ã€ãã䜿çšããããšãæ€èšã§ããããšã«åæããŸãã åºæ¬çã«ãããŒã¿è»¢éãªããžã§ã¯ãïŒDTOïŒããããã¹ãã¬ãŒãžçšïŒãããŒã¿ã¢ã¯ã»ã¹ãªããžã§ã¯ãïŒDAOïŒãããã®äœ¿çšæ¹æ³ïŒããåé¢ããŸãã ãããäž»ã«èªãã§ããå Žåã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã宣èšããŠããããã©ããŸã§éæã§ãããã確èªããããšãã§ããŸãã
ããã¯èšã£ãŠããNSå
šäœãT_device
ã䜿çšããããã«å€æŽããã®ã§ã¯ãªããå¿
èŠã«å¿ããŠç¹å®ã®æ§é äœãã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããã«ããŸãã
ãã®è°è«ã11æã«ç§»ããŸããã
@rvolosatovsã«ã¹ã¿ã JSONããŒã·ã£ã©ãŒã䜿çšããŠããã©ã«ç§»è¡ããããšã«å察ããæèŠã¯äœã§ããïŒ
ããã©ããããçŽæ¥äœ¿çšããããšã«ãªã£ãå Žåã移è¡ã®å€§ããªè² æ
ãšå®åæã®è² è·ã
ç§ã¯å®éã«ã¯ããã«å察ããŸããããæåã«åçŽã§éªéã«ãªããªã代æ¿æ¡ãèŠã€ããããšãããããäžå¯èœãªå Žåã¯ããã®ãã¹ãŠãããçŽãããšã«é Œãã¹ãã ãšæããŸãã
ç§ãã¡ãäŸåãå§ãããã©ã°ã€ã³ã¯ãããæç¹ã§ã¡ã³ããã³ã¹ãããŠããªãç¶æ
ã«ãªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã äžè¬çã«èšã£ãŠãç§ã¯ç©äºãã§ããã ãããã©ã«è¿ã¥ããããšã«è³æã§ãã ãããnil
ãç§ãã¡ãæããããé »ç¹ã«ãã§ãã¯ããããšãæå³ããã®ã§ããã°ãããã§ãã ãŸããåæåãããæ§é äœã§ã¯ãªããèšå®ãããŠããªãããšãããã£ãŠããããšãæå©ã«æ©èœããŸãã
ã³ãŒãããŒã¹å šäœã®ãªãã¡ã¯ã¿ãªã³ã°ã¯ãã©ã®ããã«è¡ã£ãŠãèŠçã«ãªãã®ã§ã¯ãªãããšå¿é ããŠããŸãã ç§ãã¡ã®ïŒgogoã§çæãããïŒãããæ§é äœã¯çŸåšã©ãã§ã䜿çšãããŠããŸãïŒgRPC APIãHTTP APIãã€ãã³ãããšã©ãŒãå éšçã«ãRedis DBãªã©ïŒãã³ãŒãããŒã¹ã®ã»ãšãã©ãã¹ãŠããããŠçŸåšã®å€èŠ³ããã¹ãŠåæã«ã
é£ããèŠä»¶ã¯ãv3APIã®äºææ§ãæãªããªãããšã§ãã ãã®ç¶æ³ãv4APIã®äœæ¥ãéå§ããç¬éãšããŠïŒå°ãªããšãå éšçã«ïŒäœ¿çšããããšã«ããå Žåã§ããæ¢åã®ãŠãŒã¶ãŒã«å¯ŸããŠãã®v3APIããµããŒããç¶ããå¿ èŠããããŸãã
é·æçã«ã¯ãïŒããŒãžã§ã³ç®¡çããããã¡ãžã£ãŒå ã§å®å®ããïŒå€éšAPIãå éšïŒããŒãžã§ã³ç®¡çãããŠããªãããã€ããŒå ã§å®å®ããïŒAPIããã³ïŒããŒãžã§ã³ç®¡çããããå®å®ããïŒããŒã¿ããŒã¹ããã¥ã¡ã³ãããåé¢ããããšã§ã倧ããªæ©æµãåãããšæããŸãã ã 次ã«ãå éšAPIãšä»ã®APIã®éã§å€æããé¢æ°ãèšè¿°ãŸãã¯çæã§ããŸãã
ããããç§ãã¡ãä»ãã§ã«å®è¡ã§ããããã€ãã®ã¹ãããããããšæããŸãã
v3 JSON APIãšã®äºææ§ãç¶æããããã«ãæåã®TODOã¯ãã«ã¹ã¿ã åãããŒã·ã£ãªã³ã°/ã¢ã³ããŒã·ã£ãªã³ã°ããæ¹æ³ãç解ããJSONããŒã·ã£ã©ãŒãšã¢ã³ããŒã·ã£ã©ãŒã®çæã«åãçµãããšã ãšæããŸãã Goã«ãããããã³ã«ãããã¡ã®JSON圢åŒã®å®è£
ã«ã¯å®å®æ§ãçŽæãããŠããªãããããããè¡ãã®ã¯è³¢æã ãšæãgrpc-gateway
ã©ã³ã¿ã€ã ã§ã¯ã³ãŒããã¯ãç»é²ã§ããããã{gogoãgolang} / protobufã®jsonpbã®ä»£ããã«ãç¬èªã®ïŒçæãããïŒïŒéïŒããŒã·ã£ã©ãŒãåŒã³åºãã³ãŒããã¯ãèšè¿°ã§ããŸãã
ç§ã¯ãã§ã«ããã§ãããè©ŠããŸããïŒ https ïŒ
ããã«ãããprotobufã¯typesã¬ãžã¹ããªã«ã€ããŠäžå¹³ãèšãã®ã§ããããæ©èœãããã«ã¯ãå€ãprotoããgolang_proto.RegisterType
ãåé€ããå¿
èŠããããããããŸããã ãããåé€ãããšã google.protobuf.Any
解決ã倱æããå¯èœæ§ããããŸããããããã¯ãšã©ãŒãšã€ãã³ãã§ã®ã¿äœ¿çšãããããããããã®ç¹å®ã®ã±ãŒã¹ã®åé¿çãèŠã€ããããšãã§ããŸãã
ããã¯ç§»è¡æéã®ã¿ã§ãããé·æçãªè§£æ±ºçãšããŠãåæ§ã®ã³ã³ããŒã¿ãŒãçæããå¿ èŠããããŸãã
https://github.com/TheThingsNetwork/lorawan-stack/commit/cd7d75c8b42ad15eee1ac594ff6d0f2d5a75eb67ã®ç°¡åãªãµãŒãã¹ã§ãã§ã«è©ŠããŸããããããè€éãªãµãŒãã¹ã®å Žåã¯ããããã®ã³ã³ããŒã¿ãŒãå¿ ãå¿ èŠã«ãªããŸãã
ããã¯grpcãµãŒãã¹èªäœã®ã¿ãå€æŽããããšã«æ³šæããŠãã ããã grpc-gatewayã¯åŒãç¶ãJSONåŽã§å€ãgogoã®ãã®ã䜿çšããå éšgRPCãµãŒããŒãåŒã³åºããŸããå éšgRPCãµãŒããŒã¯æ°ããå®è£ ãå®è¡ããŸãã
ããã€ãã®åæäŸåé¢ä¿ã®æŽæ°ãšäžäœäºææ§ã®åé¿çãããã«ããã·ã¥ããŸããïŒ https ïŒ
ãŸããŸãå€ãã®äŸåé¢ä¿ãprotobuf1.4ãšV2APIã«ã¢ããã°ã¬ãŒããããŠããããããéãããŸãŸã«ããŠããæéãé·ãã»ã©ãäŸåé¢ä¿ãã¢ããã°ã¬ãŒãããããšãããšãã«åé¡ãçºçããŸãã
ç§ãã¡ã¯æ¬åœã«ãããããå°ãåªå ããããã«ã€ããŠäœããããã決å®ããå¿ èŠããããŸãã
ãªãã©ã€ã³ã§è©±ãåãããšãã§ããããã«ãæ¥é±ã®é»è©±ãèšç»ããŠãã ããã
ç§ãã¡ã¯ãã®çã¿ã®ããã»ã¹ãçµãŠã1ã2é±éã§ããã解決ããããšã«éäžãã¹ãã ãšæããŸãã ãããŠããããé¿ããããã«ãä»ã®ããšãããŸããããããªããšãå€ãã®ç«¶åãçºçããããã§ãã ã§ããã ãå€ãã®æãæã£ãŠããããšã¯ãç§ãã¡ãã©ã®ãããªå Žåã«äœãããããšããŠããã®ããæ£ç¢ºã«ç¥ããã¿ã¹ã¯ãå¯èœãªéãåå²ããè³ã«ç®ãå ãããå¿ èŠããããŸãã
次ã®ã¹ãããïŒ
unconvert
ã gofumpt
ãªã©ãprotocã®äžã§å®è¡ããŠãããã®ããã¹ãŠåé€ããŸãprotoc-gen-gogottn
ããprotoc-gen-gofast
ïŒãŸãã¯ããã©ã«æãè¿ããã®ïŒã«åãæ¿ããŸã(gogoproto.*)
ãªãã·ã§ã³ãæ瀺çã«è¿œå ããŠãçŸåšãšåãããã«ã¬ã³ããªã³ã°ããããã«ããŸãgopls
ãrf
ãããªããŒã«ãããã«åœ¹ç«ã€ã§ãããã(gogoproto.*)
ãªãã·ã§ã³ã1ã€ãã€åé€ããããã䜿çšããã³ãŒããæŽæ°ããŸãã ããããã gopls
ãrf
ãããªããŒã«ãããã«åœ¹ç«ã€ã§ããããgogoproto.populate
ãåé€ããŠãã¹ããæŽæ°ããïŒhttps://github.com/TheThingsNetwork/lorawan-stack/issues/342ïŒgogoproto.customname
ãåé€ãã EUI -> Eui
ãªã©ãå€æŽããŸããgogoproto.embed
åé€ããŸãã ã¡ãã»ãŒãžãValidateContext(context.Context) error
ãExtractRequestFields(m map[string]interface{})
ãªã©ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããããšã確èªããå¿
èŠããããŸããgogoproto.nullable
ãåé€ããå¯èœãªå Žåã¯Getterã䜿çšããŠããããšã確èªãããã以å€ã®å Žåã¯nilãã§ãã¯ãå®è¡ããŸãã@rvolosatovsã¯ãv3.11.3ã®æåã®ã¹ããããè©ŠããŠã¿ãŸãããã ãããçµãã£ãããä»ã®æ åœè ãå床远å ããŠãããäžåºŠè©±ãåããŸãããã
æãåèã«ãªãã³ã¡ã³ã
ãªãã©ã€ã³ã§è©±ãåãããšãã§ããããã«ãæ¥é±ã®é»è©±ãèšç»ããŠãã ããã
ç§ãã¡ã¯ãã®çã¿ã®ããã»ã¹ãçµãŠã1ã2é±éã§ããã解決ããããšã«éäžãã¹ãã ãšæããŸãã ãããŠããããé¿ããããã«ãä»ã®ããšãããŸããããããªããšãå€ãã®ç«¶åãçºçããããã§ãã ã§ããã ãå€ãã®æãæã£ãŠããããšã¯ãç§ãã¡ãã©ã®ãããªå Žåã«äœãããããšããŠããã®ããæ£ç¢ºã«ç¥ããã¿ã¹ã¯ãå¯èœãªéãåå²ããè³ã«ç®ãå ãããå¿ èŠããããŸãã