2008-10-14 55 views
16

有沒有辦法自動增加ClickOnce部署中的「最低要求版本」字段,以始終等於當前版本號?基本上,我總是希望我的部署在啓動時自動更新。在ClickOnce部署中自動增加「最低需求版本」?

我懷疑我會需要一些事前/事後編譯的事件,但我希望有一個更簡單的方法。

+0

我有一個乾淨的解決方案。請參閱我的答案[這裏](http://stackoverflow.com/a/31665818/450913)。 – orad 2015-07-28 18:50:25

回答

18

我可能有點遲到回答這個問題,但我發現很難在谷歌上找到解決方案,但最終想通了,所以認爲我會分享。

隨着MSBuild的版本4(VS2010和VS2012),這可以通過插入下面的目標來實現:

<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)是,你可以手動設置項目的發佈窗口相同的設置VS IDE,修訂部分設置爲星號。 $(ApplicationRevision)是用於發佈版本的實際版本。 FormatVersion任務是一個內置的MSBuild任務,它將兩者格式化爲一個完整的版本號。

這會將'最低要求版本'設置爲與'發佈版本'相同,因此確保新的部署將始終由用戶安裝,即沒有跳過更新的選項。

當然,如果您不想將最小需求版本設置爲發佈版本,並且想要使用不同的源屬性,那麼修改目標就很簡單,但原理是一樣的。

-1

您是否在尋找應用更新?

右鍵單擊解決方案資源管理器中的項目,然後單擊發布...是獲取應用程序更新的錯誤方法。您必須右鍵單擊您的項目,然後單擊「屬性」,然後單擊「發佈」選項卡。單擊更新...按鈕,然後選中「應用程序應檢查更新」複選框。在那裏,您還可以指定應用程序的最低要求版本(我沒有使用該功能,但更新功能是我使用ClickOnce的核心原因,並且效果很好。)

+1

我想要做的是自動遞增「應用程序的最低要求版本」以匹配即將發佈的當前版本。 – 2008-10-20 13:08:23

+1

我明白了。這聽起來很有用。事實上,如果MS很聰明,他們會將這種內置複選框功能作爲... :-) – 2008-10-27 03:28:14

+1

問題是如何自動增加該功能。 – 2013-11-05 11:26:20

5

開箱即用,我不相信有一種方法。然而,旋轉你自己並不是太費勁。

我使用的方法如下:

1)創建一個文件Version.Properties

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Util-VersionMajor>1</Util-VersionMajor> 
    <Util-VersionMinor>11</Util-VersionMinor> 
    <Util-VersionBuild>25</Util-VersionBuild> 
    <Util-VersionRevision>0</Util-VersionRevision> 
    <Util-VersionDots>$(Util-VersionMajor).$(Util-VersionMinor).$(Util-VersionBuild).$(Util-VersionRevision)</Util-VersionDots> 
    <Util-VersionUnders>$(Util-VersionMajor)_$(Util-VersionMinor)_$(Util-VersionBuild)_$(Util-VersionRevision)</Util-VersionUnders> 
    <MinimumRequiredVersion>$(Util-VersionDots)</MinimumRequiredVersion> 
    <ApplicationVersion>$(Util-VersionDots)</ApplicationVersion> 
    <ApplicationRevision>$(Util-VersionRevision)</ApplicationRevision> 
    </PropertyGroup> 
</Project> 

2)導入Version.Properties文件到您的項目文件

3)創建在Build上增加版本的任務。這裏是我的

<Target Name="IncrementVersion" DependsOnTargets="Build" Condition="'$(BuildingInsideVisualStudio)'==''"> 
    <ItemGroup> 
     <Util-VersionProjectFileItem Include="$(Util-VersionProjectFile)" /> 
    </ItemGroup> 
    <PropertyGroup> 
     <Util-VersionProjectFileFullPath>@(Util-VersionProjectFileItem->'%(FullPath)')</Util-VersionProjectFileFullPath> 
    </PropertyGroup> 
    <Exec Command="&quot;$(TfCommand)&quot; get /overwrite /force /noprompt &quot;$(Util-VersionProjectFileFullPath)&quot;" Outputs="" /> 
    <Exec Command="&quot;$(TfCommand)&quot; checkout /lock:checkout &quot;$(Util-VersionProjectFileFullPath)&quot;" Outputs="" /> 
    <Version Major="$(Util-VersionMajor)" Minor="$(Util-VersionMinor)" Build="$(Util-VersionBuild)" Revision="$(Util-VersionRevision)" RevisionType="None" BuildType="Increment"> 
     <Output TaskParameter="Major" PropertyName="Util-VersionMajor" /> 
     <Output TaskParameter="Minor" PropertyName="Util-VersionMinor" /> 
     <Output TaskParameter="Build" PropertyName="Util-VersionBuild" /> 
     <Output TaskParameter="Revision" PropertyName="Util-VersionRevision" /> 
    </Version> 
    <XmlUpdate Prefix="msb" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XPath="/msb:Project/msb:PropertyGroup/msb:Util-VersionMajor" XmlFileName="$(Util-VersionProjectFile)" Value="$(Util-VersionMajor)" /> 
    <XmlUpdate Prefix="msb" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XPath="/msb:Project/msb:PropertyGroup/msb:Util-VersionMinor" XmlFileName="$(Util-VersionProjectFile)" Value="$(Util-VersionMinor)" /> 
    <XmlUpdate Prefix="msb" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XPath="/msb:Project/msb:PropertyGroup/msb:Util-VersionBuild" XmlFileName="$(Util-VersionProjectFile)" Value="$(Util-VersionBuild)" /> 
    <XmlUpdate Prefix="msb" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XPath="/msb:Project/msb:PropertyGroup/msb:Util-VersionRevision" XmlFileName="$(Util-VersionProjectFile)" Value="$(Util-VersionRevision)" /> 
    <Exec Command="&quot;$(TfCommand)&quot; checkin /override:AutoBuildIncrement /comment:***NO_CI*** &quot;$(Util-VersionProjectFileFullPath)&quot;" /> 
    <Exec Command="&quot;$(TfCommand)&quot; get /overwrite /force /noprompt &quot;$(Util-AssemblyInfoFile)&quot;" Outputs="" /> 
    <Exec Command="&quot;$(TfCommand)&quot; checkout /lock:checkout &quot;$(Util-AssemblyInfoFile)&quot;" Outputs="" /> 
    <AssemblyInfo CodeLanguage="CS" OutputFile="$(Util-AssemblyInfoFile)" AssemblyConfiguration="$(Configuration)" AssemblyVersion="$(Util-VersionMajor).$(Util-VersionMinor).$(Util-VersionBuild).$(Util-VersionRevision)" AssemblyFileVersion="$(Util-VersionMajor).$(Util-VersionMinor).$(Util-VersionBuild).$(Util-VersionRevision)" /> 
    <Exec Command="&quot;$(TfCommand)&quot; checkin /override:AutoBuildIncrement /comment:***NO_CI*** &quot;$(Util-AssemblyInfoFile)&quot;" /> 
    </Target> 

這裏http://weblogs.asp.net/sweinstein/archive/2008/08/24/top-5-secrets-of-net-desktop-deployment-wizards.aspx

7

最後我居然滾動一個插件,以VS是同步所有的版本號,然後建立與一個單一的點擊發布一些額外的ClickOnce技巧。這很容易。

Public Sub Publish() 
     Try 
      Dim startProjName As String = Nothing 
      Dim targetProj As Project = Nothing 
      Dim soln As Solution2 = TryCast(Me._applicationObject.DTE.Solution, Solution2) 
      If soln IsNot Nothing Then 
       For Each prop As [Property] In soln.Properties 
        If prop.Name = "StartupProject" Then 
         startProjName = prop.Value.ToString() 
         Exit For 
        End If 
       Next 
       If startProjName IsNot Nothing Then 
        For Each proj As Project In soln.Projects 
         If proj.Name = startProjName Then 
          targetProj = proj 
          Exit For 
         End If 
        Next 
        If targetProj IsNot Nothing Then 
         Dim currAssemVersionString As String = targetProj.Properties.Item("AssemblyVersion").Value.ToString 
         Dim currAssemVer As New Version(currAssemVersionString) 
         Dim newAssemVer As New Version(currAssemVer.Major, currAssemVer.Minor, currAssemVer.Build, currAssemVer.Revision + 1) 
         targetProj.Properties.Item("AssemblyVersion").Value = newAssemVer.ToString() 
         targetProj.Properties.Item("AssemblyFileVersion").Value = newAssemVer.ToString() 
         Dim publishProps As Properties = TryCast(targetProj.Properties.Item("Publish").Value, Properties) 
         Dim shouldPublish As Boolean = False 
         If publishProps IsNot Nothing Then 
          shouldPublish = CBool(publishProps.Item("Install").Value) 
          If shouldPublish Then 
           targetProj.Properties.Item("GenerateManifests").Value = "true" 
           publishProps.Item("ApplicationVersion").Value = newAssemVer.ToString() 
           publishProps.Item("MinimumRequiredVersion").Value = newAssemVer.ToString() 
           publishProps.Item("ApplicationRevision").Value = newAssemVer.Revision.ToString() 
          End If 
         End If 
         targetProj.Save() 
         Dim build As SolutionBuild2 = TryCast(soln.SolutionBuild, SolutionBuild2) 
         If build IsNot Nothing Then 
          build.Clean(True) 
          build.Build(True) 
          If shouldPublish Then 
           If build.LastBuildInfo = 0 Then 

            build.Publish(True) 
           End If 
          End If 
         End If 
        End If 
       End If 
      End If 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 
    End Sub 
0

下面是我處理這個問題的方法。首先,我創建了一個包裹字符串替換自定義任務:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Build.Utilities; 
using Microsoft.Build.Framework; 

namespace SynchBuild 
{ 
    public class RemoveAsterisk : Task 
    { 
     private string myVersion; 

     [Required] 
     public string Version 
     { 
      set{myVersion = value;} 
     } 


     [Output] 
     public string ReturnValue 
     { 
      get { return myVersion.Replace("*", ""); } 
     } 


     public override bool Execute() 
     { 
      return true; 
     } 
    } 
} 

這樣被內置到您看到下面的UsingTask引用SynchBuild.dll。現在,我嘗試了overwritting的MinimumRequiredVersion屬性,但它似乎沒有得到回升,所以我只是通過添加以下行到我的csproj文件末尾覆蓋了GenerateApplicationManifest目標:

<UsingTask AssemblyFile="$(MSBuildExtensionsPath)\WegmansBuildTasks\SynchBuild.dll" TaskName="SynchBuild.RemoveAsterisk" /> 
    <Target Name="GenerateDeploymentManifest" DependsOnTargets="GenerateApplicationManifest" Inputs="&#xD;&#xA;   $(MSBuildAllProjects);&#xD;&#xA;   @(ApplicationManifest)&#xD;&#xA;   " Outputs="@(DeployManifest)"> 
    <RemoveAsterisk Version="$(ApplicationVersion)$(ApplicationRevision)"> 
     <Output TaskParameter="ReturnValue" PropertyName="MinimumRequiredVersion" /> 
    </RemoveAsterisk> 
    <GenerateDeploymentManifest MinimumRequiredVersion="$(MinimumRequiredVersion)" AssemblyName="$(_DeploymentDeployManifestIdentity)" AssemblyVersion="$(_DeploymentManifestVersion)" CreateDesktopShortcut="$(CreateDesktopShortcut)" DeploymentUrl="$(_DeploymentFormattedDeploymentUrl)" Description="$(Description)" DisallowUrlActivation="$(DisallowUrlActivation)" EntryPoint="@(_DeploymentResolvedDeploymentManifestEntryPoint)" ErrorReportUrl="$(_DeploymentFormattedErrorReportUrl)" Install="$(Install)" MapFileExtensions="$(MapFileExtensions)" MaxTargetPath="$(MaxTargetPath)" OutputManifest="@(DeployManifest)" Platform="$(PlatformTarget)" Product="$(ProductName)" Publisher="$(PublisherName)" SuiteName="$(SuiteName)" SupportUrl="$(_DeploymentFormattedSupportUrl)" TargetCulture="$(TargetCulture)" TargetFrameworkVersion="$(TargetFrameworkVersion)" TrustUrlParameters="$(TrustUrlParameters)" UpdateEnabled="$(UpdateEnabled)" UpdateInterval="$(_DeploymentBuiltUpdateInterval)" UpdateMode="$(UpdateMode)" UpdateUnit="$(_DeploymentBuiltUpdateIntervalUnits)" Condition="'$(GenerateClickOnceManifests)'=='true'"> 
     <Output TaskParameter="OutputManifest" ItemName="FileWrites" /> 
</GenerateDeploymentManifest> 
    </Target> 

最終結果我們是採取應用程序版本和修訂版本,合併它們,刪除星號,然後設置所需的最低版本。我的發佈屬性集中有自動增量應用程序版本,所以這是增量發生的方式,然後我只是將最低要求的版本設置爲始終匹配。我不使用團隊構建,這是爲了讓開發人員使用Visual Studio可以進行所有clickonce部署。希望這可以幫助。