当前位置: 首页 > 工具软件 > grpc-tools > 使用案例 >

在win环境下使用grpc_tools_node_protoc generate static code 出现的坑

松桐
2023-12-01

在win环境下使用grpc_tools_node_protoc generate static code 出现的坑

在GRPC github上用node.js生成静态代码的示例是这样的:

cd ../../protos
npm install -g grpc-tools
grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=../node/static_codegen --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` helloworld.proto

在win上照搬下来会出错(因为上述是在mac或linux环境下)
具体会报这三种错误:

1.权限问题

PS D:\vsCode\nodejsCode> grpc_yle=commonjs,binary:static_codnode_protoc_plugin proto/Stude
grpc_tools_node_protoc : 无法加载因为在此系统中禁止执行脚本的解决方法ng\npm\grpc_tools_node_protoc.
关详细信息,请参阅 https:/go.m
中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ grpc_tools_node_protoc --js_
atic_c ...
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : 
    ception
    + FullyQualifiedErrorId : 

解决办法

在powershell中执行 set-ExecutionPolicy RemoteSigned

2.出现乱码

 grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./static_codegen/ --grpc_out=./static_codegen/ --plugin=protoc-gen-grpc="C:/Users/miki/AppData/Roaming/npm/node_modules/grpc-tools/bin/grpc_node_plugin" --proto_path=./proto/ Student.proto
--grpc_out: protoc-gen-grpc: ϵͳ�Ҳ���ָ�����ļ���

C:\Users\miki\AppData\Roaming\npm\node_modules\grpc-tools\bin\protoc.js:41
    throw error;
    ^

Error: Command failed: C:\Users\miki\AppData\Roaming\npm\node_modules\grpc-tools\bin\protoc.exe --plugin=protoc-gen-grpc=C:\Users\miki\AppData\Roaming\npm\node_modules\grpc-tools\bin\grpc_node_plugin.exe --js_out=import_style=commonjs,binary:./static_codegen/ --grpc_out=./static_codegen/ --plugin=protoc-gen-grpc=C:/Users/miki/AppData/Roaming/npm/node_modules/grpc-tools/bin/grpc_node_plugin --proto_path=./proto/ Student.proto
--grpc_out: protoc-gen-grpc: ϵͳ�Ҳ���ָ�����ļ���


    at ChildProcess.exithandler (child_process.js:295:12)
    at ChildProcess.emit (events.js:210:5)
    at maybeClose (internal/child_process.js:1028:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5) {
  killed: false,
  code: 1,
  signal: null,
  cmd: 'C:\\Users\\miki\\AppData\\Roaming\\npm\\node_modules\\grpc-tools\\bin\\protoc.exe --plugin=protoc-gen-grpc=C:\\Users\\miki\\AppData\\Roaming\\npm\\node_modules\\grpc-tools\\bin\\grpc_node_plugin.exe --js_out=import_style=commonjs,binary:./static_codegen/ --grpc_out=./static_codegen/ --plugin=protoc-gen-grpc=C:/Users/miki/AppData/Roaming/npm/node_modules/grpc-tools/bin/grpc_node_plugin --proto_path=./proto/ Student.proto'
}

解决办法:

注意命令里:

--plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin`

--plugin=protoc-gen-grpc=`C:/Users/miki/AppData/Roaming/npm/node_modules/grpc-tools/bin/grpc_node_plugin.exe`
注意的是:需要特别指定grpc_node_plugin.exe (这个win32的可执行文件)

3.文件不在使用–proto_path(或-I)指定的任何路径中

File does not reside within any path specified using --proto_path (or -I).  You must specify a --proto_path which encompasses this file.  Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

解决办法:

原本最后只是加对应的proto文件位置,但是实际需要加入 --proto_path
--proto_path=./proto/ Student.proto

最终可执行的命令如下

grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./static_codegen/ --grpc_out=./static_codegen/ --plugin=protoc-gen-grpc="C:/Users/miki/AppData/Roaming/npm/node_modules/grpc-tools/bin/grpc_node_plugin.exe" --proto_path=./proto/ Student.proto
 类似资料: