Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile multiple proto files in single command?

I have two proto files inside single directory and I am looking for a way to generate classes from those files in a single command. It seems that this can be accomplished with the --proto_path argument. As per the documentation:

You must provide one or more .proto files as input. Multiple .proto files can be specified at once. Although the files are named relative to the current directory, each file must reside in one of the IMPORT_PATHs [specified by the --proto_path argument] so that the compiler can determine its canonical name.

C:\shekhar\proto_trial>dir
 Volume in drive C is C

 Directory of C:\shekhar\proto_trial

07/25/2014  12:16 PM    <DIR>          .
07/25/2014  12:16 PM    <DIR>          ..
07/25/2014  12:16 PM    <DIR>          java_op
07/25/2014  12:16 PM               230 map.proto
07/23/2014  04:24 PM               161 message.proto
07/25/2014  12:17 PM             1,228 response.proto
               3 File(s)          1,619 bytes
               3 Dir(s)  50,259,398,656 bytes free

I used --proto_path argument as shown below

C:\shekhar\proto_trial>protoc 
                       --proto_path=C:\shekhar\proto_trial 
                       --java_out=C:\shekhar\proto_trial\java_op 
                       *.proto

but I am getting following error

message.proto: 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 unable to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

Please suggest some way to compile all the proto files together in single shot.

like image 458
Shekhar Avatar asked Jul 25 '14 06:07

Shekhar


People also ask

How do I compile multiple proto files?

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 unable to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

What does protoc command do?

The protoc command will generate Java output file from our addressbook. proto file. The -I option specifies a directory in which a proto file resides. The java-out specifies a directory where the generated class will be created.


3 Answers

The problem is that you are specifying --proto_path as an absolute path but your proto files as relative paths. You can either drop the --proto_path argument (it defaults to the current directory anyway), or you can do:

protoc --proto_path=C:\shekhar\proto_trial
       --java_out=C:\shekhar\proto_trial\java_op
       C:\shekhar\proto_trial\*.proto
like image 126
Kenton Varda Avatar answered Oct 21 '22 08:10

Kenton Varda


Here's an option using find

protoc --js_out=js \
        -Iproto/ \
        $(find proto/google -iname "*.proto")
like image 41
Cosmin Lehene Avatar answered Oct 21 '22 09:10

Cosmin Lehene


Commands for Protobuf >= 3.5

It seems to me that the normal command on Windows only worked for Protobuf <= 3.4, and in the newer versions you cannot use the wildcard * but you have to put all the filenames separately. Fortunately it's still easy using a for loop (from here), using relative directories:

for /f %i in ('dir /b proto_trial\*.proto') do protoc proto_trial\%i --java_out=proto_trial\java_op

Alternatively, from here, you could also try to use Git Bash if you have it installed as it could expand the wildcard properly, and then use the command as you have before:

protoc proto_trial\*.proto --java_out=proto_trial\java_op
like image 28
PHPirate Avatar answered Oct 21 '22 09:10

PHPirate