3

我正在使用 MSBuild.Community.Tasks 来帮助完成两件事,即调整版本和压缩文件。我没有结婚,所以如果它产生了我正在寻找的东西,欢迎使用另一种方法。目标是在构建之前增加内部版本号,然后在构建之后压缩一个新的 DLL(带有几个其他文件)。ZIP 文件应根据构建命名。

我快到,但是,我的 DLL 中的版本号总是比我的 version.txt 文件落后一步(从版本任务自动生成)。这是我在BeforeBuild目标中的内容:

  <Target Name="BeforeBuild" BeforeTargets="PrepareForBuild">
    <Message Text=" --=== Before Build ===--"></Message>
    <ItemGroup>
      <PreviousFiles Include="$(MSBuildProjectDirectory)\BuildPackage\$(AssemblyName).*.zip">
        <InProject>false</InProject>
      </PreviousFiles>
    </ItemGroup>
    <Delete Files="@(PreviousFiles)"></Delete>
    <Delete Files="$(MSBuildProjectDirectory)\BuildPackage\$(AssemblyName).dll"></Delete>
    <Version VersionFile="version.txt" RevisionType="Increment">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
  </Target>

这会删除以前版本中的所有文件,然后正确递增 version.txt 文件。

接下来,在我的AfterBuild目标中,我把它放在一起:

  <Target Name="AfterBuild" AfterTargets="Build">
    <Message Text=" --=== After Build ==--"></Message>
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyVersion.cs" AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
    <ItemGroup>
      <ProjectOutputFiles Include="bin\$(AssemblyName).dll">
        <InProject>false</InProject>
      </ProjectOutputFiles>
      <ZipFiles Include="$(MSBuildProjectDirectory)\BuildPackage\*.*" Exclude="$(MSBuildProjectDirectory)\BuildPackage\*.zip">
        <InProject>false</InProject>
      </ZipFiles>
    </ItemGroup>
    <Copy SourceFiles="@(ProjectOutputFiles)" DestinationFolder="$(MSBuildProjectDirectory)\StorePackage" />
    <Zip Files="@(ZipFiles)" WorkingDirectory="$(MSBuildProjectDirectory)\BuildPackage" ZipFileName="$(MSBuildProjectDirectory)\BuildPackage\$(AssemblyName).$(Major)-$(Minor)-$(Build)-$(Revision).zip" ZipLevel="9" />
  </Target>

基本上,我正在更新AssemblyInfo.cs和指定一些文件组。然后我将项目输出复制过来,最后压缩所需的文件。

这一切都很好,除了我的 DLL 版本总是比我的实际修订号晚 1 个修订号 - 即,存储在 version.txt 中的内容以及保存的 .ZIP 文件的名称。

我在这里遗漏了一些明显的东西吗?这就像在构建过程开始之前捕获版本一样。

提前致谢。

4

1 回答 1

2

天哪,是的,我遗漏了一些明显的东西。一旦我在发布之前重新阅读了这个问题,就很清楚我做错了什么。我什至把它拼出来了。

解决方法是将AssemblyInfo任务上移到 BeforeBuild 目标。这是输出 .cs 文件的任务,该文件包含将正确的版本控制信息注入 DLL 所需的属性。在构建完成之后才更新这个文件意味着我的 DLL 将永远失去竞争。

无论如何,我将继续发布此内容,以防其他人遇到类似情况。

干杯。


编辑 为了它的价值,这些目标的最终版本需要将 ZIP 操作移到一个单独的目标(我称之为 ZipProjectOutput),因为我无法解决竞争条件:DLL 从未出现在 ZIP 文件中,我认为操作系统释放文件锁定的时间或其他原因可能是罪魁祸首。

我使用AfterTargets="AfterBuild"ZipProjectOutput 目标在另一个完成时执行。我对此并不完全满意,因为我不确定我只是在这里“赢得”比赛,而不是解决问题,但这现在对我来说相当有效。#WFM

于 2013-02-13T04:04:51.183 回答