Dot-Net

如何讓 MSBuild 在建構伺服器上增加 ClickOnce 發布修訂版本號?

  • May 11, 2015

我們有一個NAnt腳本,它從CVS中籤出,然後執行MSBuild來發布應用程序。問題是我們必須記住始終在 Visual Studio 中增加版本。

我們可以選擇在發佈時自動增加它,但這會在下一次結帳時被清除,我寧願不必讓建構腳本簽入項目文件。

有沒有一種簡單的方法可以做到這一點?

最後,我使用 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>

MinimumRequiredVersion自動更新

項目編輯器簡介

  1. 在解決方案資源管理器中,右鍵點擊您的項目並選擇解除安裝項目。

解除安裝截圖 2. 一旦項目變得不可用,再次右鍵點擊並選擇編輯項目*<project_name>.<lang>*。

打開編輯器的螢幕截圖

MSBuild 簡介

  1. 屬性使用鍵/值對來提取資訊
  • 使用屬性名作為別名,可以$(OutputPath)用來獲取元素的值<OutputPath>.\bin</OutputPath>
  1. 我們將使用為 ClickOnce 部署生成的以下屬性
<MinimumRequiredVersion>1.0.0.6</MinimumRequiredVersion>
<ApplicationRevision>7</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
  1. MSBuild Tasks可以在項目 (*.proj) 文件中指定並在建構事件期間呼叫。
  • FormatVersion是 .NET 4.0 及更高版本的內置任務,它將 ApplicationVersion 和 ApplicationRevision 格式化為單個版本號。

執行

  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 來保存輸出。 7. 保存並重新載入您的項目。現在,每個 ClickOnce 部署都將自動更新到最近發布的版本。


*非常感謝 Kev的回答,我基本上在這裡重新討論過,並為任何初學者添加了一點說明。*這是我就這個問題發表的一篇博文,在此處進一步擴展了我的答案。

引用自:https://stackoverflow.com/questions/8482360