DotNetNuke module development became a lot easier when it became easy to use MSBuild to simply build your project and get a nice install-able module package in the end. I've been using this process for a number of years now, but there have always been those little things with the default templates that many have been distributing that just don't meet my needs 100%. For example a few years back I blogged about a fix for Auto Packaging Multiple Modules. This post shows a fix for one of my other biggest pet-peeves when it comes to the auto-package process and that comes from the determination of the 'PackageName' that is used to name the destination file.
The Default Process
Before I go into the fix for this I want to make sure to cover the current process for MSBuild to pick up on the PackageName. In most of the templates being distributed today there are entries in the .csproj within a <PropertyGroup> that contain definitions for Extension, DNNFileName, PackageName, and MSBuildCommunityTasksPath.
I'm perfectly fine with all items here except for package name. I like to keep my package name consistent and typically it matches my root namespace, or the DLL name for the module. Which is very hard to get right with a template, and if you want to change it down the road you have to open the .csproj in notepad.
The Automated Way
Amazingly it takes less than 1 minute to make this something that the build process can simply find on its own based on the Package Name defined in your .dnn manifest. The following assumes you are using the most current DNN Manifest format.
First you want to simply delete the PackageName node from the .csproj in question.
Lastly, open up the Modulepackage.targets file that is inside of the "BuildScripts" folder. You should see a node at the very top that is <XmlRead>. Just after this node, add the following.
<XmlRead Prefix="n"
Namespace="http://schemas.microsoft.com/developer/msbuild/2003"
XPath="dotnetnuke/packages/package[1]/@name"
XmlFileName="$(DNNFileName).dnn">
<Output TaskParameter="Value" PropertyName="PackageName" />
</XmlRead>
This tells MSBuild that you want to read the value from the name attribute that is contained on the first package node, within the dotnetnuke/packages nodes. Now, your module build process is dynamic. If you update the package name within the manifest your package name automatically updates.
I know that this helps us save a lot of time in our builds, especially with new project setup. Feel free to share your comments below.
This post has been cross-posted to my personal blog.