如何让MSBuild在构建服务器上增加ClickOnce发布修订版本号?

时间:2011-12-12 23:20:44

标签: .net msbuild clickonce versioning

我们有一个NAnt脚本,可以从CVS签出,然后运行MSBuild来发布应用程序。问题是我们必须记住在Visual Studio中始终增加版本。

我们可以选择在发布时自动增加它,但是这会在下一次结账时被删除,我宁愿不必让构建脚本检查项目文件。

有一种简单的方法吗?

3 个答案:

答案 0 :(得分:10)

自动更新MinimumRequiredVersion

项目编辑器简介

  1. 在Solution Explorer中,右键单击您的项目并选择卸载项目。

    Screenshot of Unloading

  2. 项目不可用后,再次右键点击并选择修改 <project_name>.<lang> 项目。

    Screenshot of Opening Editor

  3. MSBuild简介

    1. 属性使用键/值对提取信息

      • 使用属性名称作为别名,您可以使用$(OutputPath)获取元素<OutputPath>.\bin</OutputPath>
      • 的值
    2. 我们将使用为ClickOnce部署生成的以下属性

      <MinimumRequiredVersion>1.0.0.6</MinimumRequiredVersion>
      <ApplicationRevision>7</ApplicationRevision>
      <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
      
    3. MSBuild Tasks可以在项目(* .proj)文件中指定,并在构建事件期间调用。

      • FormatVersion是.NET 4.0及更高版本的内置任务,它将ApplicationVersion和ApplicationRevision格式化为单个版本号。
    4. 实施

      1. 将以下代码复制并粘贴到打开的项目文件中,作为根<Project>元素的子元素。

        <Target Name="AutoSetMinimumRequiredVersion" BeforeTargets="GenerateDeploymentManifest">
          <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
            <Output PropertyName="MinimumRequiredVersion" TaskParameter="OutputVersion"  />
          </FormatVersion>
          <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
            <Output PropertyName="_DeploymentBuiltMinimumRequiredVersion" TaskParameter="OutputVersion"  />
          </FormatVersion>
        </Target>
        

        此代码将ApplicationVersion和ApplicationRevision作为Format Version任务中的参数,并通过使用完整发布版本覆盖MinimumRequiredVersion来保存输出。

      2. 保存并重新加载项目。现在,每个ClickOnce部署都将自动更新到最近发布的版本。


      3. 非常感谢Kev for their answer我已经基本上重新对这里做了一些补充说明。这是blog post我提出的问题在这里我的答案进一步扩展。

答案 1 :(得分:2)

最后我使用NAnt xmlpoke做了这个,所以对于版本我们最终得到20.0.dayofyear.hourminute - 它在构建中大多是唯一的。

不需要自定义任务 - 而且新版本的MSBuild也有一个pokexml,所以它可以使用它。

<target name="pokerevision" depends="init">
    <property name="projectname" value="MyProject.GUI" />

    <!-- This is a bit flawed because 231 could mean 02:31 or 23:01, but we never build before 3 am. -->
    <property
        name="app.revision"
        value="${datetime::get-hour(datetime::now())}${datetime::get-minute(datetime::now())}" />

    <echo message="revision: ${app.revision}" />

    <xmlpoke
        file="${Solution.Path}\${projectname}\${projectname}.csproj"
        xpath="//x:Project/x:PropertyGroup[1]/x:ApplicationRevision"
        value="${app.revision}"
    >
        <namespaces>
            <namespace prefix="x" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
        </namespaces>
    </xmlpoke>

    <property
        name="app.version"
        value="20.0.${datetime::get-day-of-year(datetime::now())}.${app.revision}" />

    <echo message="version: ${app.version}" />

    <xmlpoke
        file="${Solution.Path}\${projectname}\${projectname}.csproj"
        xpath="//x:Project/x:PropertyGroup[1]/x:ApplicationVersion"
        value="${app.version}"
    >
        <namespaces>
            <namespace prefix="x" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
        </namespaces>
    </xmlpoke>
</target>

答案 2 :(得分:1)

您有几种选择,这里有两种选择:

  1. 指定星号代替构建版本号以使其自动递增
    http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

    [assembly:AssemblyVersion(“1.0。*”)]

  2. 使用MSBuild扩展包中的AsssemblyInfo msbuild任务 http://msbuildextensionpack.codeplex.com
    例如:
    http://www.msbuildextensionpack.com/help/4.0.4.0/html/d6c3b5e8-00d4-c826-1a73-3cfe637f3827.htm

  3. 修改
    对不起,我误解了你的问题。

    请参阅Jason Stangroome接受的答案:
    How do I get the ClickOnce Publish version to match the AssemblyInfo.cs File version?