In a C# programming these days, it is becoming increasingly the case that direct editing a .csproj XML file, instead of via Visual Studio's project property GUI.
Because, the contents of modern .csproj file (a.k.a "SDK style project") is very simpler rather than old style .csproj file.
Additionally, by default, Visual Studio 2019 opens a .csproj file in that's text editor when the project node in solution explorer is double-clicked, instead of showing project property GUI, if the .csproj file is SDK style.
By the way, if you are developing a library to be a NuGet package, you would like to write the package release notes.
While you are writing the package release notes in Visual Studio's project property GUI, there is no problem.
However, if you write the package release notes by Visual Studio's text editor directly, is become a nightmare.
Because the Visual Studio's text editor format the XML contents of .csproj file whenever I save it.
This auto-formatting feature breaks all of the layout of the package release notes!
You can see many undesired spaces and line breaks in the package release notes after auto-formatting.
Yes, I can avoid this trouble by disabling auto-format feature, but editing .csproj file in other parts (ex. writing custom build tasks) without auto-formatting is also strongly painful.
What can I do?
One day, I found the method to solve this my problem finally!
The method is, writing the package release notes in a text file which is outside of .csproj file, and import it from inside of .csproj file. :)
I will show you more details.
At first, create a text file named
RELEASE-NOTES.txt, and write the package release notes in this file, like this.
v.1.0.1 - Support to Blazor v.3.2 Preview 3. v.1.0.0 - Initial release.
You can locate the
RELEASE-NOTES.txt file anywhere, in this case, I located the
RELEASE-NOTES.txt file at the solution folder of the my NuGet package library project.
Next, I implemented some MSBuild scripts in the NuGet package library project file (.csproj) to import the contents of the
I implemented the MSBuild target to be executed at the before "GenerateNuspec" target is executed.
At the before executing of the "GenerateNuspec" target is a good entry point to prepare the package release notes.
This target reads the
RELEASE-NOTES.txt file contents by
ReadLinesFromFile MSBuild standard task, and output the contents into a MSBuild items which named
Finally, build the
PackageReleaseNotes MSBuild property from the
ReleaseNoteLines MSBuild items that contain the contents of the
By the way, MSBuild joins the items with a ";" separator by default.
In this case, I want to make
PackageReleaseNotes MSBuild property with multi-lines, therefore I wrote the reference of
ReleaseNoteLines MSBuild items with
LF (Line-Feed) separator explicitly, like this:
LF code in an MSBuild script file.)
The MSBuild target is like this:
<Target Name="PreparePackageReleaseNotesFromFile" BeforeTargets="GenerateNuspec"> <ReadLinesFromFile File="../RELEASE-NOTES.txt" > <Output TaskParameter="Lines" ItemName="ReleaseNoteLines"/> </ReadLinesFromFile> <PropertyGroup> <PackageReleaseNotes>@(ReleaseNoteLines, '%0a')</PackageReleaseNotes> </PropertyGroup> </Target>
As a final step, I wrote a comment "(Please write the package release notes in "RELEASE NOTES.txt".)" in the original place of
PackageReleaseNotes MSBuild property via Visual Studio's project property GUI window.
After implemented these steps, I took back a peaceful and comfortable environment for writing the package release note.
I'm happy if this article helps you making NuGet package library life.
Happy coding :)