8

我有一种情况,我希望版本控制在构建时是动态的。

版本模式:<year>.<month>.<day>.<hhmm>

但是我已经阅读了在编译时重新解析属性中使用的字符串值的位置。

有关如何完成此动态版本控制的任何建议?

理想情况:

<Assembly: AssemblyVersion("4.0.0.0")> 
<Assembly: AssemblyFileVersion(Year(Now) & "." & Month(Now()) & "." & Day(Now()) & "." & String.format("hhmm", now()))> 

我知道它不会起作用,但应该明白这一点。

4

1 回答 1

3

您可以使用MsbuildCommunityTasks生成内部版本号并在预构建时自定义程序集文件版本。

  • 在MsbuildCommunityTasks下载 zip

  • 解压到文件夹 [SolutionFolder]\MsBuildExtensions\MSBuildCommunityTasks

  • 在 Microsoft.CSharp.Targets 导入之后,在您的项目 (csproj) 中添加以下示例。

  <PropertyGroup>
  <MSBuildCommunityTasksPath>$(MSBuildThisFileDirectory)..\MsBuildExtensions\MSBuildCommunityTasks</MSBuildCommunityTasksPath>  
    <My-PropertiesDir>Properties</My-PropertiesDir>
  </PropertyGroup>
  <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets"/>
  <Target Name="BeforeBuild">
    <Time Format="yyyy.MM.dd.HHmm">
      <Output TaskParameter="FormattedTime" PropertyName="My-VersionNumber" />
    </Time>
    <Message Text="Building $(My-VersionNumber) ...">
    </Message>
    <ItemGroup>
      <My-AssemblyInfo Include="$(My-PropertiesDir)\AssemblyVersionInfo.cs" />
      <Compile Include="@(My-AssemblyInfo)" />
    </ItemGroup>
    <MakeDir Directories="$(My-PropertiesDir)" />
    <AssemblyInfo OutputFile="@(My-AssemblyInfo)"
          CodeLanguage="CS"
          AssemblyFileVersion="$(My-VersionNumber)"
          AssemblyInformationalVersion="$(My-VersionNumber)"
          Condition="$(My-VersionNumber) != '' "
          />
  </Target>
  <Target Name="AfterBuild">
    <Delete Files="@(My-AssemblyInfo)" />
  </Target>

  • 从您的 AssemblyInfo.cs 中擦除 AssemblyFileVersion 属性。它将在构建时生成。

  • 构建时,您会在控制台上看到打印的版本号。生成的文件在 AfterBuild 目标上被删除,以保持源代码管理干净。

    构建前:

    构建 2013.01.14.1016 ... 创建了 AssemblyInfo 文件“Properties\AssemblyVersionInfo.cs”。

    (...)

    构建后:

    删除文件“Properties\AssemblyVersionInfo.cs”。

  • 如果您想对许多具有较少 msbuild 代码的项目执行此操作,则有必要创建一个自定义的构建脚本来包装您的解决方案。

于 2013-01-14T13:03:26.980 回答