我正在使用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。
我错过了一些明显的东西吗?就像在构建过程甚至开始之前捕获版本一样。
提前致谢。
答案 0 :(得分:2)
GOSH ,是的,我错过了一些明显的东西。一旦我重新阅读这个问题,就在发布之前,很明显我做错了什么。我甚至把它拼出来了。
修复方法是将AssemblyInfo
任务移至BeforeBuild目标。这是输出.cs文件的任务,该文件包含将正确的版本控制信息注入DLL所需的属性。保留此文件的更新直到构建完成后意味着我的DLL将永远失去竞争。
我会继续发布这个,以防其他人碰到类似的东西。
干杯。
编辑对于它的价值,这些目标的最终版本需要将ZIP操作移出到一个单独的目标(我称之为ZipProjectOutput),因为竞争条件我无法解决:DLL从未出现在ZIP文件中,我认为操作系统释放锁定文件或其他东西的时机可能是罪魁祸首。
我使用AfterTargets="AfterBuild"
让ZipProjectOutput目标在另一个完成时执行。我并不完全对此感到高兴,因为我不确定我是在这里“赢得”比赛,而不是解决问题,但现在这对我来说相当顺利。 #WFM