1

我想将我的 .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.

我已经安装的东西:

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

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

4

3 回答 3

7

在 Windows 上,我稍微弄乱了grpc-toolsfor Node 并遇到了一些问题。npm install grpc-tools grpc_tools_node_protoc_ts --save-dev我通过我的本地文件夹安装了工具(和 TS 插件)node_modules/.bin。感谢这篇文章,我可以提供这些解决方案。这是我原来的 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),我发现如果您grpc-tools在本地 Node 环境中安装了其他插件,则可以简单地省略--plugin. 它似乎grpc_tools_node_protoc会自动查找生成输出标志指定的代码所需的可执行文件--grpc_out--js_out或者--ts_out./node_modules/.bin/.

因此,我在脚本中更新了以下 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

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

于 2020-03-03T12:35:10.897 回答
0

简单的解决方案:

对我来说,“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

于 2019-12-22T20:19:30.757 回答
0

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

    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上运行。

于 2020-04-18T02:42:14.657 回答