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

时间:2012-09-17 22:28:53

标签: .net msbuild clickonce

我有一个简单的批处理文件,我从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)"

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

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

3 个答案:

答案 0 :(得分:12)

尝试将此添加到.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

提问者编辑:

请参阅下面的评论以了解更新。

答案 1 :(得分:10)

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

答案 2 :(得分:9)

为了正确更新部署清单中声明的​​版本,您需要在&#34; AfterCompile&#34;中修改ApplicationVersion。步骤而不是&#34; BeforePublish&#34;步骤,因为应用程序清单是在构建时生成的。 但是,您不能依赖$(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>