user1025852
user1025852

Reputation: 2784

inject version to DLLs during build process

this is my situation:

  1. I have VS2010 solution with X projects included.

  2. Wix project that can create msi from all compiled artifacts.

  3. I have build machine \ Jenkins that first compile (MSBuild .Net 4) all the solution, then compile the wix to package it to msi.

What\how can I inject to all artifacts\dlls the number of the product (e.g 11.2.0.4789) - as simple as possible?

Is there and command line arguments that can be passed while compiling the solution?

Upvotes: 0

Views: 2476

Answers (1)

Tom Blodget
Tom Blodget

Reputation: 20812

There are tools, such as several extensions for MSBuild, that do version stamping but each assumes a particular workflow. You might find one that works for you but a DIY method would help you evaluate them, even if it isn't your final solution.

You can add a property to the MSBuild command-line like this:

msbuild /p:VersionStamp=11.2.0.4789

Note: I assume you are going to parameterize the Jenkins build in some way or generate the number during a preceding build step. Here is a simulation of that:

echo 11.2.0.4789 >version.txt
set /p version=reading from pipe <version.txt
msbuild /p:VersionStamp=%version%

Now, the work is in getting each project to use it. That would depend on the project type and where you want VersionStamp to appear.

For a csproj, you might want to use it as the AssemblyVersion. The simplest way is to move the attribute to a cs file by itself and rewrite it every time. I would leave a comment in AssemblyInfo.cs as a clue to where it now comes from. You can include the cs file in your project either dynamically or permanently. I prefer dynamically since it is effectively an intermediate file for the build. So, in your .csproj add the following in a text editor (e.g. Visual Studio. Unload and Edit project):

  <Target Name="BeforeBuild">
    <PropertyGroup>
      <AssemblyVersionPath>$(IntermediateOutputDir)AssemblyVersion.cs</AssemblyVersionPath>
    </PropertyGroup>
    <ItemGroup>
      <Compile Include="$(AssemblyVersionPath)" />
    </ItemGroup>
    <WriteLinesToFile
      File='$(AssemblyVersionPath)' 
      Overwrite="true"
      Condition="'$(ProductVersion)' != ''"
      Lines='using System.Reflection%3b;&#x0a;[assembly: AssemblyVersion("$(VersionStamp)")]' />
  </Target>

This is sufficient but a more thorough solution would include adding the file to a list so it is cleaned with other files and only writing the file if the version changed to prevent unnecessary rebuilds, etc.

Use a similar technique for other project types.

Upvotes: 6

Related Questions