如何使用AssemblyInfoTask更改程序集版本号?

时间:2010-12-30 13:11:03

标签: msbuild msbuild-task

我正在尝试自动化为所有DLL设置版本的过程,花了一些时间后我开始了解最有可能实现的AssemblyInfo任务。

所以我继续安装它,特别是版本 1.0.51130.0

安装完成后,我在Import个文件中手动添加了AssemblyInfoTask .cspoj标记(通过卸载每个项目)(该解决方案包含超过35个proj文件)。

<Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets"/>

接下来,我修改了将在路径Microsoft.VersionNUmber.Target中安装的C:\Program Files\MSBuild\Microsoft\AssemblyInfoTask文件,并修改了以下部分:

<!-- Properties for controlling the Assembly Version -->
<PropertyGroup>
    <AssemblyMajorVersion>4</AssemblyMajorVersion>
    <AssemblyMinorVersion>0</AssemblyMinorVersion>
    <AssemblyBuildNumber></AssemblyBuildNumber>
    <AssemblyRevision></AssemblyRevision>
    <AssemblyBuildNumberType>DateString</AssemblyBuildNumberType>
    <AssemblyBuildNumberFormat>01MMdd</AssemblyBuildNumberFormat>
    <AssemblyRevisionType>AutoIncrement</AssemblyRevisionType>
    <AssemblyRevisionFormat>00</AssemblyRevisionFormat>
</PropertyGroup>

<!-- Properties for controlling the Assembly File Version -->  
<PropertyGroup>
    <AssemblyFileMajorVersion>4</AssemblyFileMajorVersion>
    <AssemblyFileMinorVersion>0</AssemblyFileMinorVersion>
    <AssemblyFileBuildNumber></AssemblyFileBuildNumber>
    <AssemblyFileRevision></AssemblyFileRevision>
    <AssemblyFileBuildNumberType>DateString</AssemblyFileBuildNumberType>
    <AssemblyFileBuildNumberFormat>01MMdd</AssemblyFileBuildNumberFormat>
    <AssemblyFileRevisionType>AutoIncrement</AssemblyFileRevisionType>
    <AssemblyFileRevisionFormat>00</AssemblyFileRevisionFormat>
</PropertyGroup>

接下来,我在每个项目中将assemblyInfo.cs文件的版本设置为1.0.0.0。最后我保存并关闭它,重新打开解决方案并构建。它就像一个冠军!

现在想要的是将版本自定义为4.0.1053.1,其中10是年度指标的一部分,即2010年,53表示周数,最后为1表示修订号。

如何使用AssemblyInfo任务实现此目的?我发现了几个帖子,在构建扩展包中可以使用新版本的AssemblyInfo任务。

我已安装 MSBuild Extension Pack 2010年12月,其版本为 MSBuild Extension Pack 4.0.2.0安装程序

5 个答案:

答案 0 :(得分:15)

首先..使用从每个项目链接的globalassemblyinfo.cs。 将其作为链接文件添加到每个项目。 这意味着您更新了一个文件,而不是30多个assemblyinfo文件......然后:

使用MSBuild.Community.Tasks ....

然后致电

<AssemblyInfo CodeLanguage="CS"
         OutputFile="$(VersionFile)"
         AssemblyCompany="Company"
         AssemblyProduct="Product"
         AssemblyCopyright="Copyright © Company 2011"
         ComVisible="false"
         AssemblyVersion="$(BUILD_NUMBER)"
         AssemblyFileVersion="$(BUILD_NUMBER)" />

假设你有类似的东西:

<Import Project=".\tasks\MSBuild.Community.Tasks.Targets"/>

答案 1 :(得分:13)

我在Jenkins中通过使用List Subversion Tags参数类型进行参数化的包构建来完成此操作。 Subversion标记必须遵循版本号格式(major.minor.revision.build),例如tags/2.0.0.1。然后将标签名称分配给Jenkins参数,例如, $VERSION变为2.0.0.1

我使用WriteLinesToFile msbuild任务将assembly属性写入第二个文件以及名为VersionInfo.cs的PropertyInfo.cs。签入源代码控制时,这只包含一个默认版本号:

// Do not change this. The version is set on package builds only by setting the AsmVersion MSBuild property
[assembly: System.Reflection.AssemblyVersion("0.0.0.0")] 

构建服务器上的包构建通过AsmVersion参数传递版本:

/p:AsmVersion=$VERSION

.csproj文件被修改为具有BeforeBuild目标(Visual Studio为您创建一个注释掉的):

<Target Name="BeforeBuild">
    <WriteLinesToFile 
        Condition=" '$(AsmVersion)' != '' " File="Properties\VersionInfo.cs" 
        Overwrite="True"
        Lines="[assembly: System.Reflection.AssemblyVersion(&quot;$(AsmVersion)&quot;)] // Generated by build" />   
</Target>

在Visual Studio中构建或不传入AsmVersion时,程序集的默认版本为0.0.0.0。在包构建中构建时,您将获得所需的内部版本号。

答案 2 :(得分:3)

.NET Core样式.csproj文件的更新:如果您在转换为.NET Core使用的新.csproj格式后遇到此问题,则可以just set the Version property (无需为MSBuild任务烦恼)。

答案 3 :(得分:1)

我最终如何使用MSBuild版本12(VS 2013)。

  1. 使用Nuget获取MSBuildTasks社区包
  2. 编辑了我的.csproj文件并添加了导入包的路径:
  3. <Import Project="..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.targets" Condition="Exists('..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.target')"/>
    
    1. 找出正则表达式,只更改AssemblyInfo.cs文件中的版本号:
    2. (?<=AssemblyFileVersion\("[0-9]\.[0-9]\.[0-9]\.)(\*)
      

      不兼容XML,因此必须更改为:

      (?&#60;=AssemblyFileVersion\(&#34;&#91;0-9]\.&#91;0-9]\.&#91;0-9]\.)(\*)
      
      1. 取消注释<Target Name="BeforeBuild">部分并添加以下内容:
      2. <Target Name="BeforeBuild">
            <FileUpdate Files="properties\AssemblyInfo.cs"
                        Regex="(?&#60;=AssemblyFileVersion\(&#34;&#91;0-9]\.&#91;0-9]\.&#91;0-9]\.)(\*)"
                        ReplacementText="$(Revision)" />
        </Target>
        
        1. 运行MSBuild时,将“Revision”属性添加到命令行,例如
        2. msbuild.exe myProject.csproj /t:Build /p:Configuration=Release;Revision=12345
          

答案 4 :(得分:1)

作为@bruceboughton proposed,您可以在编译过程中轻松生成版本程序集文件,而无需使用MSBuild.Community.Tasks库:

<PropertyGroup>
    <Version>0.0.0</Version>
    <InformationalVersion>0.0.0-dev~commithash</InformationalVersion>
    <VersionFileName>$(BaseIntermediateOutputPath)Version.cs</VersionFileName>
</PropertyGroup>
<Target Name="GenerateVersionFile" BeforeTargets="BeforeBuild">
    <WriteLinesToFile
        File="$(VersionFileName)"
        Overwrite="True"
        Lines="
            [assembly: System.Reflection.AssemblyVersion(&quot;$(Version)&quot;)]
            [assembly: System.Reflection.AssemblyFileVersion(&quot;$(Version)&quot;)]
            [assembly: System.Reflection.AssemblyInformationalVersion(&quot;$(InformationalVersion)&quot;)]" />
    <ItemGroup>
        <Compile Include="$(VersionFileName)" />
    </ItemGroup>
</Target>

Properties\AssemblyInfo.cs文件中删除在生成的文件中指定的参数的定义。

之后,您可以通过向msbuild添加参数来指定版本:

msbuild /property:Version=1.2.3 /property:InformationalVersion=1.2.3-dev~commithash .\SolutionFile.sln