【问题标题】:(Node.js) --grpc_out: protoc-gen-grpc: %1 is not a valid Win32 application(Node.js) --grpc_out: protoc-gen-grpc: %1 不是有效的 Win32 应用程序
【发布时间】:2020-04-14 07:06:39
【问题描述】:

我想将我的 .proto 文件编译成存根,但是在输入命令时:

`protoc -I=. ./protos/dummy.proto --js_out=import_style=commonjs,binary:./server --grpc_out=./server --plugin=protoc-gen-grpc=which grpc_tools_node_protoc_plugin

我收到以下错误:

--grpc_out: protoc-gen-grpc: %1 is not a valid Win32 application.

我已经安装的东西:

  • Windows 10
  • npm install -g grpc-tools
  • npm install google-protobuf
  • 协议

注意:我注意到已经有一些类似的问题,但我没有找到 Node.js 的问题,而且已经提出的问题都有不同的解决方案。

【问题讨论】:

    标签: node.js protocol-buffers grpc grpc-node


    【解决方案1】:

    在 Windows 上,我对 Node 的 grpc-tools 进行了一些处理,并遇到了一些问题。我通过npm install grpc-tools grpc_tools_node_protoc_ts --save-dev 将工具(和TS 插件)安装到我的本地node_modules/.bin 文件夹中。感谢this 的帖子,我可以提供这些解决方案。这是我原来的 shell 脚本

    #!/usr/bin/env bash
    
    PROTO_DIR="./src/grpc/proto"
    PROTOC_GEN_TS_PATH="./node_modules/.bin/protoc-gen-ts"
    GRPC_TOOLS_NODE_PROTOC_PLUGIN="./node_modules/.bin/grpc_tools_node_protoc_plugin"
    GRPC_TOOLS_NODE_PROTOC="./node_modules/.bin/grpc_tools_node_protoc"
    
    # Generate JS and corresponding TS d.ts codes for each .proto file using the grpc-tools for Node.
    $GRPC_TOOLS_NODE_PROTOC \
        --plugin=protoc-gen-grpc="$GRPC_TOOLS_NODE_PROTOC_PLUGIN" \
        --plugin=protoc-gen-ts="$PROTOC_GEN_TS_PATH" \
        --js_out=import_style=commonjs,binary:"$PROTO_DIR" \
        --ts_out="$PROTO_DIR" \
        --grpc_out="$PROTO_DIR" \
        -I "$PROTO_DIR" \
        "$PROTO_DIR"/*.proto
    
    1. 如果您只是按名称提供插件,例如--plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin,Windows 会抱怨 Win32 应用程序无效。您可以通过添加 .cmd 扩展来解决此问题:

    --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin.cmd

    1. 很遗憾,出现以下问题'.' Not an internal or external command, or a runnable program or batch file,表示Windows无法解析插件的相对路径。因此,您必须提供绝对路径,例如

    --plugin=protoc-gen-grpc=C:/.../<project-dir>/node_modules/.bin/grpc_tools_node_protoc_plugin.cmd

    现在真正的魔法发生了:

    由于一个简单的拼写错误(我输入了--plugin=proto-gen-grpc 而不是--plugin=protoc-gen-grpc),我发现如果您在本地Node 环境中安装了grpc-tools 和其他插件,您可以简单地省略--plugin。 似乎grpc_tools_node_protoc 会自动查找生成由./node_modules/.bin/ 中的输出标志--grpc_out--js_out--ts_out 指定的代码所需的可执行文件。

    因此,我在脚本中更新了以下 LOC

    $GRPC_TOOLS_NODE_PROTOC \
        --js_out=import_style=commonjs,binary:"$PROTO_DIR" \
        --ts_out="$PROTO_DIR" \
        --grpc_out="$PROTO_DIR" \
        -I "$PROTO_DIR" \
        "$PROTO_DIR"/*.proto
    

    也许,其他人可以分享他们的经验并对此问题进行更多说明。

    【讨论】:

    • 这仅适用于我使用npm install -g grpc-tools grpc_tools_node_protoc_ts全局安装 grpc-tools 和 grpc_tools_node_protoc_ts
    • 脚本的第一个版本具有误导性,它不起作用并且失败并出现 OP 提到的错误,但是一旦阅读到帖子的末尾:) 并用最终版本的脚本替换它终于起作用了!谢谢。
    【解决方案2】:

    简单的解决方案:

    对我来说,“which”命令指向了错误的路径,所以我将其删除并用插件的绝对路径替换它。它看起来像这样:

    协议-I=。 ./protos/dummy.proto --js_out=import_style=commonjs,binary:./server --grpc_out=./server --plugin=protoc-gen-grpc=C:\Users\myUser\AppData\Roaming\npm\node_modules\grpc-tools\bin \grpc_node_plugin.exe

    解释:

    我不确定为什么会发生这个错误(--grpc_out: protoc-gen-grpc: %1 is not a valid Win32 application),但我有一个理论...“which”命令指向文件夹而不是 .exe 文件。我怎么知道这个?当我尝试只运行命令时(在终端中)

    which grpc_tools_node_protoc_plugin
    

    返回文件夹

    /c/Users/myUser/AppData/Roaming/npm/grpc_tools_node_protoc_plugin

    【讨论】:

      【解决方案3】:

      由于 grpc-tools 已全局安装(每个 OP 的 -g 标志),因此可以预先设置插件路径。

          GRPC_TOOLS_PLUGIN="$HOME/AppData/Roaming/npm/grpc_tools_node_protoc_plugin.cmd" && \
      protoc -I=. ./protos/*.proto \
      --js_out=import_style=commonjs,binary:./server \
      --grpc_out=./server \
      --plugin=protoc-gen-grpc=$GRPC_TOOLS_PLUGIN
      

      感谢我之前的两个答案的指点!
      经过测试,发现可以在 Windows 10 ProGit Bash 上运行。

      【讨论】:

        猜你喜欢
        • 2016-04-15
        • 2021-02-25
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多