繁体   English   中英

(Node.js) --grpc_out: protoc-gen-grpc: %1 不是有效的 Win32 应用程序

[英](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.

我安装的东西:

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

注意:我注意到已经有一些类似的问题,但我没有找到 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
  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 '.' 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 ProGit Bash 上运行

  1. 您可以通过添加 .cmd 扩展名来解决此问题:

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

  1. 和下面的问题'。 不是内部或外部命令,也不是可运行程序或批处理文件,您可以解决替换“。”的问题。 通过“%cd%”:

--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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM