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.
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).
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.
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
Here's an option using find
protoc --js_out=js \
-Iproto/ \
$(find proto/google -iname "*.proto")
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With