[英](Node.js) --grpc_out: protoc-gen-grpc: %1 is not a valid Win32 application
我想将 my.proto 文件编译成存根,但是在输入命令时:
`协议-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.
我安装的东西:
注意:我注意到已经有一些类似的问题,但我没有找到 Node.js 的问题,而且已经提出的问题都有不同的解决方案。
在 Windows 上,我使用了 Node 的grpc-tools
并遇到了一些问题。 我通过npm install grpc-tools grpc_tools_node_protoc_ts --save-dev
将工具(和 TS 插件) npm install grpc-tools grpc_tools_node_protoc_ts --save-dev
到我的本地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
--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
'.' Not an internal or external command, or a runnable program or batch file
'.' 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
会自动查找生成由输出标志--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
也许,其他人可以分享他们的经验和对这个问题的更多澄清。
简单的解决方案:
对我来说,“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 不是有效的 Win32 应用程序),但我有一个理论......“which”命令指向文件夹而不是.exe 文件。 我怎么知道这个? 当我尝试只运行命令时(在终端中)
which grpc_tools_node_protoc_plugin
它返回文件夹
/c/Users/myUser/AppData/Roaming/npm/grpc_tools_node_protoc_plugin
由于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 Pro和Git Bash 上运行。
--plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin.cmd
--plugin=protoc-gen-grpc=%cd%/node_modules/.bin/grpc_tools_node_protoc_plugin.cmd
这段代码对我有用。
protoc --js_out=import_style=commonjs,binary:./server ./proto/dummy.proto
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.