By now, we have a good grasp on:
- Taking Avro IDL files and generating C# classes
- Automating the above so we can do it on lots of files with ease
In this final step, I will create a C# project and configure it in a way so developers only need to add/modify
avdl files and build.
We'll start from scratch, by creating the project and then adding an
dotnet new classlib --name MyProject cd MyProject mkdir Avro
Add the package Confluent.SchemaRegistry.Serdes.Avro:
dotnet add package Confluent.SchemaRegistry.Serdes.Avro --version 1.5.3
Then copy the
AVDL folder and
Generate.ps1 script from the previous post.
The project should end up looking like:
MyProject ├── Avro │ ├── AVDL │ │ └── ExampleMessage.avdl │ └── Generate.ps1 ├── Class1.cs └── MyProject.csproj
Before building the .NET project, we want MSBuild to generate our Avro classes. This can be done as a PreBuild step which is configured within
Open the file then add the following:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent"> <Exec WorkingDirectory="$(ProjectDir)Avro" Command="pwsh -ExecutionPolicy RemoteSigned -File Generate.ps1" /> <ItemGroup> <Compile Include="$(ProjectDir)Avro/_generated/**/*$(DefaultLanguageSourceExtension)" Exclude="@(Compile)" /> </ItemGroup> </Target>
This does a couple of things:
- Execute the PowerShell script to generate Avro classes first
- Inform MSBuild of the new files, but also ensure not to include them twice if they already exist (see here)
<ItemGroup> <EmbeddedResource Include="Avro\AVDL\**\*.avdl" /> </ItemGroup>
This is a little hack to trick Visual Studio into marking the build as out of date if you make any changes in the AVDL folder.
Now, we're ready to build:
Which results in:
Microsoft (R) Build Engine version 16.7.0+7fb82e5b2 for .NET Copyright (C) Microsoft Corporation. All rights reserved. Determining projects to restore... Restored /home/cainux/code/MyProject/MyProject.csproj (in 313 ms). Generating Avro classes... avro-tools not found, downloading from https://repo1.maven.org/maven2/org/apache/avro/avro-tools/1.10.0/avro-tools-1.10.0.jar to /home/cainux/.avro-tools/avro-tools-1.10.0.jar Running: /home/cainux/.dotnet/tools/avrogen -s ./_generated/avro/schema/ExampleMessage.avsc ./_generated/avro/classes MyProject -> /home/cainux/code/MyProject/bin/Debug/netstandard2.0/MyProject.dll Build succeeded. 0 Warning(s) 0 Error(s)
We went from manually generating C# classes from Avro IDL files to making it happen automagically withing a .NET project. Developers only need to put their AVDL files in the right place and run build to generate the classes. Now you can focus on building the rest of your application with one less thing to think about.
If you're managing your code with source control (if not, why on earth not?!) such as Git - remember to ignore the
_generated folder and its contents as they are build assets and shouldn't be checked in to source control.