erhöhen „mindestens erforderliche Version“ automatisch in einer Clickonce-Bereitstellung?
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.
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=""$(TfCommand)" get /overwrite /force /noprompt "$(Util-VersionProjectFileFullPath)"" Outputs="" />
<Exec Command=""$(TfCommand)" checkout /lock:checkout "$(Util-VersionProjectFileFullPath)"" 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=""$(TfCommand)" checkin /override:AutoBuildIncrement /comment:***NO_CI*** "$(Util-VersionProjectFileFullPath)"" />
<Exec Command=""$(TfCommand)" get /overwrite /force /noprompt "$(Util-AssemblyInfoFile)"" Outputs="" />
<Exec Command=""$(TfCommand)" checkout /lock:checkout "$(Util-AssemblyInfoFile)"" 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=""$(TfCommand)" checkin /override:AutoBuildIncrement /comment:***NO_CI*** "$(Util-AssemblyInfoFile)"" />
</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="
 $(MSBuildAllProjects);
 @(ApplicationManifest)
 " 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.)