一旦我的nant构建完成,我想使用post-build命令重命名生成的.exe文件,该命令附加到项目.csproj文件的末尾(在Project元素中):
<Target Name="AfterBuild">
<Copy SourceFiles="$(TargetDir)\$(TargetName).exe" DestinationFiles="$(TargetDir)\MyApplication-$(AssemblyFileVersion).exe" SkipUnchangedFiles="true" />
</Target>
正如您在上面所看到的,我正在尝试将可执行文件重命名为:MyApplication - $(AssemblyFileVersion).exe但是,这显然是错误的,因为生成的可执行文件只是命名为:MyApplication-.exe(所以版本I我试图在文件名末尾添加添加功能。)
我在AssemblyInfo.cs文件中定义了AssemblyFileInfoVersion,如下所示:
[assembly: AssemblyFileVersion("1.5.1")]
所以问题是:如何访问同一项目的csproj文件中的AssemblyFileVersion?
答案 0 :(得分:3)
GetAssemblyIdentity可以获取有关已编译程序集的信息。任务输出包含有关Version,PublicKeyToken和Culture的元数据条目。
我使用$(TargetDir)\$(TargetName).exe
作为程序集文件。
<ItemGroup>
<AssembliesPath Include="$(TargetDir)\$(TargetName).exe" />
</ItemGroup>
<Target Name="GetAssemblyInfo">
<GetAssemblyIdentity AssemblyFiles="@(AssembliesPath)">
<Output TaskParameter="Assemblies" ItemName="AssemblyInfo"/>
</GetAssemblyIdentity>
</Target>
然后:
<Target Name="AfterBuild">
<GetAssemblyInfo />
<Copy SourceFiles="$(TargetDir)\$(TargetName).exe" DestinationFiles="$(TargetDir)\MyApplication-%(AssemblyInfo.Version).exe" SkipUnchangedFiles="true" />
</Target>
答案 1 :(得分:1)
以下代码来自ISun的原始答案,这实际上是我最终如何完成它,因为我在定义自定义任务时遇到了问题(ms构建引用经常被自动踢,并且构建一直在失败)。
正如您从ISun的答案中的注释中看到的那样,我总是得到版本0.0.0.0 - 尽管已经通过在texteditor中手动打开AssemblyInfo.cs将AssemblyFileVersion和AssemblyVersion的版本更改为1.0.0.0。我后来看了如何从我的Visual Studio编辑AssemblyInfo.cs,这是如何:
由于某些原因 - 在我通过上述方法(使用Visual Studio)输入所有信息之后,我不知道为什么它突然起作用了!当我第一次使用上面的方式打开AssemblyInfo.cs时,我的所有字段实际上都是空的,尽管它们被填入实际文件中。
现在我让AssemblyInfo.cs最终正常运行,我使用ISun的原始代码来实现我的目标。通过在项目的 .csproj 文件中的结束标记之前添加以下代码段:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<GetAssemblyIdentity AssemblyFiles="$(TargetDir)\$(TargetName).exe">
<Output TaskParameter="Assemblies" ItemName="AssemblyInfo"/>
</GetAssemblyIdentity>
<Copy SourceFiles="$(TargetDir)\$(TargetName).exe" DestinationFiles="$(TargetDir)\MyApplication-%(AssemblyInfo.Version).exe" SkipUnchangedFiles="true" />
</Target>