【问题标题】:Error: failed post-processing: 820:39: missing ',' in argument list错误:后处理失败:820:39:参数列表中缺少“,”
【发布时间】:2022-01-18 10:10:17
【问题描述】:

protoc-gen-validate 是一个用于生成多语言消息验证器的 protoc 插件。

该项目使用 Bazel 进行构建,并有一个 open pull request 以添加对自定义验证错误消息的支持。

原代码是2020年做的,最近更新了最新的代码,修复了所有的合并冲突,现在编译失败了,但是找不到问题:

~/GitHub/protoc-gen-validate (i18n) $ make bazel-tests
bazel test //tests/... --test_output=errors
INFO: Analyzed 68 targets (0 packages loaded, 0 targets configured).
INFO: Found 62 targets and 6 test targets...
ERROR: /Users/mparnisari/GitHub/protoc-gen-validate/tests/harness/cases/BUILD:46:21: Generating into bazel-out/darwin-fastbuild/bin/tests/harness/cases/go_/github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/go failed: (Exit 1): go-protoc-bin failed: error executing command bazel-out/darwin-opt-exec-2B5CBBC6/bin/external/io_bazel_rules_go/go/tools/builders/go-protoc-bin_/go-protoc-bin -protoc bazel-out/darwin-opt-exec-2B5CBBC6/bin/external/com_google_protobuf/protoc ... (remaining 117 argument(s) skipped)

Use --sandbox_debug to see verbose messages from the sandbox
[error] failed post-processing: 820:39: missing ',' in argument list (and 10 more errors)
--validate_out: protoc-gen-validate: Plugin failed with status code 1.
2021/12/14 23:46:43 error running protoc: exit status 1
ERROR: /Users/mparnisari/GitHub/protoc-gen-validate/tests/harness/cases/BUILD:46:21 GoCompilePkg tests/harness/cases/go.a failed: (Exit 1): go-protoc-bin failed: error executing command bazel-out/darwin-opt-exec-2B5CBBC6/bin/external/io_bazel_rules_go/go/tools/builders/go-protoc-bin_/go-protoc-bin -protoc bazel-out/darwin-opt-exec-2B5CBBC6/bin/external/com_google_protobuf/protoc ... (remaining 117 argument(s) skipped)

Use --sandbox_debug to see verbose messages from the sandbox
INFO: Elapsed time: 0.962s, Critical Path: 0.48s
INFO: 8 processes: 8 internal.
FAILED: Build did NOT complete successfully

从触发测试命令后立即出现错误 ([error] failed post-processing: 820:39: missing ',' in argument list (and 10 more errors)) 的事实来看,我认为这是 Bazel 的问题,但我不确定。


更新 1:我把它缩小到这个:

~/GitHub/fork/protoc-gen-validate (i18n) $ make testcases
cd tests/harness/cases && \
        protoc \
                -I . \
                -I ../../.. \
                --go_out="module=github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/go,Mtests/harness/cases/other_package/embed.proto=github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/other_package/go;other_package,Mtests/harness/cases/yet_another_package/embed.proto=github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/yet_another_package/go,Mvalidate/validate.proto=github.com/envoyproxy/protoc-gen-validate/validate,Mgoogle/protobuf/any.proto=google.golang.org/protobuf/types/known/anypb,Mgoogle/protobuf/duration.proto=google.golang.org/protobuf/types/known/durationpb,Mgoogle/protobuf/struct.proto=google.golang.org/protobuf/types/known/structpb,Mgoogle/protobuf/timestamp.proto=google.golang.org/protobuf/types/known/timestamppb,Mgoogle/protobuf/wrappers.proto=google.golang.org/protobuf/types/known/wrapperspb,Mgoogle/protobuf/descriptor.proto=google.golang.org/protobuf/types/descriptorpb:./go" \
                --plugin=protoc-gen-go=/Users/mparnisari/go/bin/protoc-gen-go \
                --validate_out="module=github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/go,lang=go,Mtests/harness/cases/other_package/embed.proto=github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/other_package/go,Mtests/harness/cases/yet_another_package/embed.proto=github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/yet_another_package/go:./go" \
                ./*.proto
filename-with-dash.proto:5:1: warning: Import validate/validate.proto is unused.
[error] failed post-processing: 820:39: missing ',' in argument list (and 10 more errors)
--validate_out: protoc-gen-validate: Plugin failed with status code 1.
make: 
*** [testcases] Error 1

更新 2:缩小范围。如果我删除这个文件:tests/harness/cases/maps.proto

make testcases 有效


更新 3:缩小范围。如果我删除这些行:https://github.com/envoyproxy/protoc-gen-validate/blob/main/tests/harness/cases/maps.proto#L14-L17

make testcase 有效

【问题讨论】:

    标签: go bazel protoc


    【解决方案1】:

    使用开关 --sandbox_debug 构建将提供未截断的堆栈跟踪。
    只是缺少一个逗号……唯一的问题是在哪个文件和哪个行中。

    它抱怨harness_py_proto 测试@46:21。建议对文件tests/harness/executor/cases.go 运行语法检查,因为如果820:39 不在某个生成的文件中,这可能是最适合的文件(按行号和错误消息)。我的 Go 语法不是那么流利,这就是为什么我不能一眼就发现它 - 但是语法检查器或 linter 可以:

    lint bazel testcases bazel-tests
    

    Makefile 也可能是一个可能的候选人,但没有太多进展:

    .PHONY: harness
    harness: testcases tests/harness/go/harness.pb.go tests/harness/go/main/go-harness tests/harness/cc/cc-harness bin/harness ## runs the test harness, validating a series of test cases in all supported languages
        ./bin/harness -go -cc
    
    .PHONY: bazel-tests
    bazel-tests: ## runs all tests with Bazel
        bazel test //tests/... --test_output=errors
    

    以前曾经尝试过运行make harness 吗?当它按照评论所说的那样做时......

    ## runs the test harness, validating a series of test cases in all supported languages
    

    【讨论】:

    • “它抱怨harness_py_proto 测试@ 46:21”,你在哪里看到这个?
    • 我在更改列表中查找了给定坐标。坦率地说,我不确定来源或生成的原型中是否缺少逗号;两者都有可能。由于语言技能有限,答案通常是使用 linter,它知道语法应该如何相似。如果不是答案,它至少可能会提供进一步的线索,即罪魁祸首可能是什么。当知道哪个更改破坏了构建时,可能会更容易判断...与。 24?更改,破坏了构建。
    • 而我只是查看了测试,也可能是它们不再与代码匹配得太好了。并且它不一定必须是缺少逗号,但也可能与缺少或多余的括号有关,根据生成的语法,看起来好像缺少逗号。但是,当它抱怨语法时,这通常会被认真对待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2018-02-04
    相关资源
    最近更新 更多