On Wed, Nov 28, 2018 at 1:03 AM Nadav Samet <[email protected]> wrote: > > In Java, the dependencies you mentioned are provided by Gradle. We pull > protobuf-java in here.
I see... Been a little while since I dove that deep in any Java stacks, so that's a new one to me, but good to know. > In C++, the equivalent files would come from descriptor.h which is shipped > with protobuf sources, and the implementation is provided by libprotobuf, > which you can build yourself of the sources. > > The plugin is going to be an executable (.EXE on Windows) file. Thanks, I appreciate the clarification. I'm not sure which download I saw, but it did not include sources, or I downloaded the minimal one. If memory serves there was a full source one, so I'll have a look there. Thanks! > On Tue, Nov 27, 2018 at 9:46 PM Michael Powell <[email protected]> wrote: >> >> So... >> >> You've got a magic set of imports (in Java). >> >> import com.google.protobuf.DescriptorProtos; >> import com.google.protobuf.Descriptors; >> import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse; >> import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest; >> >> Where do you get these from? >> >> Or Assemblies or NuGet Package References in .NET / C#, or >> source/libraries, ostensibly, for C/C++. >> >> This is the question I have in getting started. >> >> The nearest assumption I could derive is that I start with protoc.exe >> (Windows) and the bundled .proto files, "compile" those to target >> plugin language, and build them with the project? >> >> Again, as a what? .DLL? .EXE? >> >> On Wed, Nov 28, 2018 at 12:31 AM Nadav Samet <[email protected]> wrote: >> > >> > Hi Rahul and Michael, >> > >> > I put together a basic example of a protoc plugin in Java that generates >> > text files: https://github.com/thesamet/protoc-plugin-in-java >> > >> > The plugin itself is an executable that gets executed by protoc, it can be >> > written in any language. In this instance, the plugin is written in Java, >> > so we use gradle to generate a shell script (or bat file for windows) that >> > protoc will execute to run our plugin inside a JVM. The exact instructions >> > to run it are in the provided README.md >> > >> > >> > On Tue, Nov 27, 2018 at 6:01 AM Michael Powell <[email protected]> >> > wrote: >> >> >> >> >> >> >> >> On Saturday, November 10, 2018 at 5:33:11 PM UTC-5, Nadav Samet wrote: >> >>> >> >>> Michael, >> >>> >> >>> A protoc plugin is a program that receives a serialized >> >>> CodeGeneratorRequest message via its stdin, and writes a >> >>> CodeGeneratorResponse to its stdout. >> >>> >> >>> You asked where the CodeGeneratorRequest comes from. The answer is that >> >>> the message is defined here. Assuming your plugin is named >> >>> protoc-gen-boilerplate, then when you invoke protoc like this: >> >>> protoc --boilerplate_out=outdir file1.proto [...] >> >>> >> >>> Then protoc would parse the proto files, prepare a CodeGeneratorRequest >> >>> and pipe it into your plugin. That request object contains a >> >>> representation of all the files you passed in the command line as well >> >>> as the files their transitively import. Your plugin should parse the >> >>> request and print out a serialized CodeGeneratorResponse. Unless you set >> >>> an error message, protoc would create the files you specified in your >> >>> response. The plugin can be written in any language, but if you use some >> >>> of the supported languages (at least C++, Python and Java, but probably >> >>> others), you'll find a method named something like >> >>> DescriptorPool.BuildFile which would convert a FileDescriptorProto to an >> >>> higher-level object (FileDescriptor) which is easier to work with. >> >>> >> >>> Plugins are pretty simple to write (look online for examples). I would >> >>> advise not writing a parser for proto files manually, since you'll be >> >>> chasing a moving target - over time language features get added albeit >> >>> not very often. It would also be hard to match the language spec >> >>> perfectly. >> >> >> >> >> >> I guess I am not sure quite where to begin. I've downloaded the protoc >> >> compiler, which itself has a set of proto files, but no target language >> >> level generated code. >> >> >> >> Am I accurate in assuming I run those through protoc itself to my target >> >> language, in this case I suppose C++? >> >> >> >> On Windows, what form does the plugin need to take? DLL? Executable file? >> >> >> >> These are the sort of nibblets I think that would make it more evident >> >> where to pick up and run with it. >> >> >> >> Examples of this appear to be few and far between, if at all. >> >> >> >> Absent examples, I am working on a Boost Spirit Qi parser in the >> >> meantime, which the learning curve is not a plateau, I can agree there. >> >> It's not terrible to work through, and I end up with an AST that I know >> >> forwards and backwards without too much extra effort once the rules have >> >> done their synthetic magic. >> >> >> >> Cheers, thank you! >> >> >> >>> On Thursday, November 1, 2018 at 6:14:54 PM UTC-7, Michael Powell wrote: >> >>>> >> >>>> Hello, >> >>>> >> >>>> I'm a bit confused. I thought I was grasping it earlier, then I >> >>>> thought I wasn't ... What is the starting point developing a protoc >> >>>> plugin? >> >>>> >> >>>> What I want to accomplish is processing a .proto (v2) and generating >> >>>> some C# boilerplate code for it. I'm not generating a proto adapter >> >>>> itself, per se, but C# DSL that would be used to support it. >> >>>> >> >>>> The starting point for me would seem to be receiving the compiler >> >>>> request, but that itself is a .proto, which leaves me a bit confused. >> >>>> Where do you obtain that from? Or are you starting by compiling those >> >>>> .protos from the bits bundled with the protoc.exe compiler? >> >>>> >> >>>> What I want is to just have the descriptors drawn from the target >> >>>> .proto(s) themselves. That's it. A full-on plugin seems like a little >> >>>> bit of overkill. >> >>>> >> >>>> Suggestions? >> >>>> >> >>>> Thanks so much! >> >>>> >> >>>> Best regards, >> >>>> >> >>>> Michael Powell >> >> >> >> -- >> >> You received this message because you are subscribed to the Google Groups >> >> "Protocol Buffers" group. >> >> To unsubscribe from this group and stop receiving emails from it, send an >> >> email to [email protected]. >> >> To post to this group, send email to [email protected]. >> >> Visit this group at https://groups.google.com/group/protobuf. >> >> For more options, visit https://groups.google.com/d/optout. >> > >> > >> > >> > -- >> > -Nadav >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Protocol Buffers" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at https://groups.google.com/group/protobuf. >> For more options, visit https://groups.google.com/d/optout. > > > > -- > -Nadav -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
