使用MSBuild命令行指定发布版本作为项目的程序集版本

问题描述 投票:13回答:3

我有一个简单的批处理文件,我从DOS命令行运行,用于构建一个发布ClickOnce项目的小型C#应用程序。一行是这样的:

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/"

这当前发布了应用程序,但它使用我在Visual Studio的“发布”选项卡中设置的发布版本。我希望能够在命令行设置发布版本,具体来说,我想使用项目的汇编版本。就像是:

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" /property:PublishVersion="$(Proj.AssemblyVersion)"

我希望不用创建自定义任务,因为这只是一个临时解决方案,我将在稍后用更合适的构建系统替换它。

或者,我已经看过使用带有Mage Command Line Tool标志的-Update更新已发布的清单版本,但我不知道如何从项目或构建的程序集中检索程序集版本号而不使用PowerShell或某些需要下载的程序。如果我可以使用Visual Studio附带的东西,那也可以。

.net msbuild clickonce
3个回答
13
投票

尝试将此添加到.csproj文件中。目标将从输出程序集中检索版本并在发布之前更新ApplicationVersion:

<Target Name="AfterCompile">
  <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
    <Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/>
  </GetAssemblyIdentity>
  <PropertyGroup>
    <ApplicationVersion>%(fooAssemblyInfo.Version)</ApplicationVersion>
  </PropertyGroup>
</Target>

可能有一种更好的方法来动态获取程序集名称,但为了您的目的,它应该可以解决问题。

相信GetAssemblyIdentity语法的答案:https://stackoverflow.com/a/443364/266882

发问者编辑:

请参阅以下评论以获取更新


10
投票
msbuild xxx.csproj /target:clean;publish /property:ApplicationVersion=1.2.3.4

9
投票

为了正确更新部署清单中声明的​​版本,您需要在“AfterCompile”步骤而不是“BeforePublish”步骤中修改ApplicationVersion,因为应用程序清单是在构建时生成的。但是你不能依赖$(TargetPath)属性指向程序集而是使用以下路径:$(ProjectDir)obj \ $(ConfigurationName)\ $(TargetFileName)

所以这里是您可以添加到.csproj文件的更新的目标代码段:

<Target Name="AfterCompile">
  <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)">
     <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" />
  </GetAssemblyIdentity>
  <PropertyGroup>
    <ApplicationVersion>%(AssemblyInfo.Version)</ApplicationVersion>
  </PropertyGroup>
</Target>
© www.soinside.com 2019 - 2024. All rights reserved.