15

我有一个从 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 命令行工具-Update更新已发布的清单版本,但我不知道如何在不使用PowerShell或某些需要的程序的情况下从项目或构建的程序集中检索程序集版本号被下载。如果我可以使用 Visual Studio 附带的东西,那也可以。

4

3 回答 3

14

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

发问者编辑:

请参阅下面的评论以获取更新。

于 2012-09-19T06:38:46.487 回答
12
msbuild xxx.csproj /target:clean;publish /property:ApplicationVersion=1.2.3.4
于 2014-07-24T15:34:40.790 回答
10

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

因此,这是您可以添加到 .csproj 文件中的更新后的 Target 代码片段:

<Target Name="AfterCompile">
  <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)">
     <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" />
  </GetAssemblyIdentity>
  <PropertyGroup>
    <ApplicationVersion>%(AssemblyInfo.Version)</ApplicationVersion>
  </PropertyGroup>
</Target>
于 2014-07-24T20:01:20.150 回答