在“BeforeBuild”目标之前捕获的汇编版本

时间:2013-02-13 04:04:51

标签: msbuild msbuild-task msbuildcommunitytasks

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

几乎但是,我的DLL中的版本号总是落后于我的version.txt文件(从Version任务自动生成)。以下是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文件的名称是什么out as。

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

我会继续发布这个,以防其他人碰到类似的东西。

干杯。


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

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