Go protoc插件CLI正则参数含逗号时解析报错求助
解决protoc插件参数含逗号被错误拆分的问题
问题根源
protogen默认会将--xxx_opt后的参数按逗号直接分割,不会判断逗号是否在字符串值内部。比如你传入的phone_regexp='^\d{1,5}$'会被拆成phone_regexp='^\d{1'和5}$',后者被当成了不存在的flag,导致报错。
可行解决方法
方法1:预处理参数后再用flag解析
在ParamFunc中先合并被错误拆分的参数,再交给flag.FlagSet解析,兼容现有flag定义:
import ( "flag" "strings" "google.golang.org/protobuf/compiler/protogen" ) var flags flag.FlagSet var phoneRegexp *string func init() { phoneRegexp = flags.String("phone_regexp", "", "custom regex for phone checking.") // 定义其他flag... } func main() { opts := protogen.Options{ ParamFunc: func(params []string) error { // 合并被逗号拆分的参数项 mergedParams := []string{} var current string for _, p := range params { if strings.Contains(p, "=") { // 遇到新的键值对,先保存之前的合并结果 if current != "" { mergedParams = append(mergedParams, current) current = "" } current = p } else { // 追加到当前参数的值中(补回逗号) current += "," + p } } if current != "" { mergedParams = append(mergedParams, current) } // 用合并后的参数解析flag return flags.Parse(mergedParams) }, } // 后续protogen逻辑... opts.Run(func(gen *protogen.Plugin) error { // 使用*phoneRegexp... return nil }) }
方法2:手动解析参数(更轻量)
如果你的参数不多,可以跳过flag.FlagSet,直接遍历并合并参数:
import ( "strings" "google.golang.org/protobuf/compiler/protogen" ) var phoneRegexp string func main() { opts := protogen.Options{ ParamFunc: func(params []string) error { for i := 0; i < len(params); i++ { p := params[i] if strings.HasPrefix(p, "phone_regexp=") { // 提取初始值 phoneRegexp = strings.TrimPrefix(p, "phone_regexp=") // 合并后续无等号的项(被拆分的部分) for i+1 < len(params) && !strings.Contains(params[i+1], "=") { i++ phoneRegexp += "," + params[i] } } // 处理其他参数... } return nil }, } opts.Run(func(gen *protogen.Plugin) error { // 使用phoneRegexp... return nil }) }
方法3:shell层面转义(不推荐)
部分shell环境下可以通过多重转义让逗号完整传递,但依赖终端环境,通用性差:
# bash环境示例 protoc ... --check_opt=phone_regexp="^\\d{1\,5}$" my.proto
内容的提问来源于stack exchange,提问作者Clément Jean
相关产品推荐
相关产品推荐

