在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