Msbuild “之前捕获的程序集版本”;“建造前”;目标

Msbuild “之前捕获的程序集版本”;“建造前”;目标,msbuild,msbuild-task,msbuildcommunitytasks,Msbuild,Msbuild Task,Msbuildcommunitytasks,我使用MSBuild.Community.Tasks来帮助完成两件事,即调整版本和压缩文件。我还没有考虑到这一点,所以欢迎使用另一种方法,只要它能产生我想要的东西。目标是在构建之前增加构建编号,然后在构建之后压缩一个新的DLL(包含两个其他文件)。ZIP文件应根据构建命名 我就快到了,但是,我的DLL中的版本号总是比version.txt文件落后一步(从版本任务自动生成)。以下是我在BeforeBuild目标中的内容: <Target Name="BeforeBuild" Before

我使用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>
基本上,我正在更新
AssemblyInfo.cs
并指定一些文件组。然后复制项目输出,最后压缩所需的文件

这一切都很好,除了我的DLL版本总是在我的实际版本号后面有一个版本号-即,version.txt中存储的是什么,以及.ZIP文件的名称保存为什么

我是不是漏掉了什么明显的东西?这就像是在构建过程开始之前或其他什么时候捕获版本一样

提前谢谢。

天哪,是的,我错过了一些明显的东西。当我在发帖前重新阅读这个问题时,我发现我做错了什么。我甚至把它拼出来了

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

不管怎样,我都会继续发帖,以防其他人遇到类似的事情

干杯


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

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

  <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>