问题描述
我正在尝试加载来自arduino-cli存储库的.proto文件。更具体地说,我正在加载依赖于同一目录中其他几个.proto文件的commands.proto。
在提供给proto-loader的加载选项中,我指定了所有这些.proto依赖项的路径,但弹出一个错误,指出未定义在这些依赖项之一中定义的proto消息。
这是我的代码:
const grpcLib = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const pathLib = require("path");
const RPC_PATH = pathLib.join(__dirname,"arduino-cli/rpc")
var PROTO_PATH = pathLib.join(RPC_PATH,"/commands/commands.proto");
const options = {
keepCase: true,longs: String,enums: String,defaults: true,oneofs: true,includeDirs:
[
pathLib.join(RPC_PATH,"/commands/common.proto"),pathLib.join(RPC_PATH,"/commands/board.proto"),"/commands/compile.proto"),"/commands/core.proto"),"/commands/upload.proto"),"/commands/libs.proto"),]
}
const packageDeFinition = protoLoader.loadSync(PROTO_PATH,options);
最后一行导致此错误:
/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:382
throw Error("no such type: " + path);
^
Error: no such type: BoardDetailsReq
at Service.lookupType (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:382:15)
at Method.resolve (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/method.js:147:44)
at Service.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/service.js:111:20)
at Namespace.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:307:25)
at Namespace.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:307:25)
at Namespace.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:307:25)
at Namespace.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:307:25)
at Root.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/namespace.js:307:25)
at Root.resolveAll (/Users/Herve/node_modules/@grpc/proto-loader/node_modules/protobufjs/src/root.js:258:43)
at Object.loadSync (/Users/Herve/node_modules/@grpc/proto-loader/build/src/index.js:218:16)
在boards.proto中定义了导致错误的BoardDetailsReq
消息,该消息包含在我的includeDirs
结构中的options
中。这不正确吗?如果发生此错误,我一定做错了。
解决方法
public class ProofAttribute
{
[JsonProperty("raw")]
public string Raw { get; set; }
/// <summary>
/// ignore structural mapping of other properties
/// </summary>
[JsonExtensionData]
public IDictionary<string,JToken> Rest { get; set; }
}
选项的目的是列出应在其中搜索导入文件的目录。有问题的文件将导入includeDirs
,commands/common.proto
等。因此commands/board.proto
应该指向包含这些文件的目录。在这种情况下,即为includeDirs
。因此,您的RPC_PATH
列表应仅为includeDirs
。