erhöhen „mindestens erforderliche Version“ automatisch in einer Clickonce-Bereitstellung?

StackOverflow https://stackoverflow.com/questions/202491

  •  03-07-2019
  •  | 
  •  

Frage

Gibt es eine Möglichkeit automatisch die „erforderliche Mindestversion“ Felder in einer Clickonce-Bereitstellung zu erhöhen, die aktuelle Build-Nummer immer gleich? Grundsätzlich mag ich immer mein Einsatz automatisch beim Start aktualisiert werden.

Ich vermute, ich werde ein Ereignis einig Pre- / Post-Build müssen, aber ich hoffe, es ist ein einfacher Weg.

War es hilfreich?

Lösung

ich ein wenig zu spät sein kann, diese mit zu beantworten, aber ich fand es schwierig, die Lösung auf Google zu finden, aber es schließlich so heraus dachte, ich würde teilen.

Mit MSBuild Version 4 (VS2010 und VS2012) kann dies durch Einfügen der folgenden Ziele erreicht werden:

  <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>

Die $ (Programmversion) ist die gleiche Einstellung, die Sie manuell in dem Veröffentlichungsfenster des Projektes in dem VS IDE, mit der Revision Teil auf einen Stern einstellen. Der $ (ApplicationRevision) ist die aktuelle Version für die veröffentlichte Version verwendet wird. Die FormatVersion Aufgabe eine eingebaute in MSBuild Aufgabe ist, dass die beiden in eine einzige vollständige Versionsnummer formatiert.

Dies wird die ‚Minimum Required Version‘ gesetzt die gleiche wie die ‚Publish Version‘ daher, dass der neue Einsatz gewährleistet sein, wird immer von den Benutzern installiert werden, keine andere Wahl, dh das Update überspringen.

Natürlich, wenn Sie nicht wollen, um das Minimum setzen benötigte Version auf die Version veröffentlichen und eine andere Quelle Eigenschaft verwenden mögen dann ist geradlinig, das Ziel zu ändern, aber das Prinzip ist das gleiche.

Andere Tipps

landete ich tatsächlich ein AddIn zu VS Walzen, die alle Versionsnummern synchronisiert, und dann baut und veröffentlicht mit einem einzigen Mausklick. Es war ziemlich einfach.

    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

Aus dem Kasten heraus, ich glaube nicht, dass es einen Weg gibt. Es ist nicht zu viel Aufwand zu spinnen Ihre eigene jedoch.

Der Ansatz, den ich verwenden ist wie folgt:

1) erstellen Version.Properties Datei

<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) Importieren Sie die Version.Properties in Ihre Projektdateien Datei

3) Erstellen Sie eine Aufgabe, die Version auf Erstellen zu erhöhen. Hier ist mein

<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>

Einige zusätzliche Clickonce Tricks hier http://weblogs.asp.net/sweinstein/archive/2008/08/24/top-5-secrets-of-net-desktop-deployment-wizards.aspx

Hier ist, wie ich diese behandelt. Zuerst habe ich eine benutzerdefinierte Aufgabe, die String-Ersatz wickelt:

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;
        }
    }
}

Damit wird in SynchBuild.dll gebaut, die Sie im Usingtask unten verwiesen zu sehen. Jetzt habe ich versuchte, nur die MinimumRequiredVersion Eigenschaft overwritting, aber es schien nicht zu abgeholt, so dass ich überschrieb nur das GenerateApplicationManifest Ziel, indem die folgenden Zeilen am Ende meiner csproj-Datei:

<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>

Das Endergebnis ist, dass wir die App-Version und Revision nehmen, kombinieren sie, entfernen Sie das Sternchen, stellen Sie die mindestens erforderliche Version. Ich habe die Autoinkrement App-Version in meinen Eigenschaften veröffentlichen so eingestellt, das ist, wie Inkrementierung stattfindet, dann bin ich nur die minimumrequiredversion Einstellung immer match.I nicht Team-Build verwenden, ist dies nur so ausgelegt, dass ein Entwickler mit Visual Studio machen alle Clickonce-Implementierungen können erforderlich. Hoffe, das hilft.

Wenn Sie veröffentlichen Ihre Clickonce-Anwendung von Visual Studio installieren Sie dann nur die AutoUpdateProjectsMinimumRequiredClickOnceVersion NuGet Package in Ihrem Projekt und Sie sind gut zu gehen.

Wenn Sie von einem Build-Server oder einem anderen Skript veröffentlichen, dann können Sie die Set-ProjectFilesClickOnceVersion Powershell Skript . Mein Blog beschreibt ausführlicher wie Setup Ihr Build-Server zu veröffentlichen Clickonce-Anwendungen anzupassen .

Suchen Sie Anwendungs-Updates?

Ein Rechtsklick auf das Projekt im Solution Explorer und dann auf Veröffentlichen klicken ... ist der falsche Weg, Anwendungs-Updates zu erhalten. Sie müssen der rechten Maustaste Ihr Projekt und den Klick auf Eigenschaften, dann auf die Registerkarte Veröffentlichen klicken. Klicken Sie auf die Updates ... Schaltfläche und dann überprüfen Sie die „Die Anwendung sollte auf Updates prüfen“ das Kontrollkästchen. Dort können Sie auch eine mindestens erforderliche Version für die Anwendung angeben. (Ich habe nicht diese Funktionalität aber die Updates Funktionalität ist der Kern Grund verwende ich Clickonce verwendet und es funktioniert super.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top