هل تريد زيادة "الحد الأدنى المطلوب للإصدار" تلقائيًا في نشر ClickOnce؟
سؤال
هل هناك طريقة لزيادة حقول "الحد الأدنى المطلوب للإصدار" تلقائيًا في نشر ClickOnce لتساوي دائمًا رقم الإصدار الحالي؟في الأساس، أريد دائمًا أن يتم تحديث النشر الخاص بي تلقائيًا عند الإطلاق.
أظن أنني سأحتاج إلى بعض أحداث ما قبل/ما بعد البناء، ولكن آمل أن تكون هناك طريقة أسهل.
المحلول
وأنا قد يكون قليلا في وقت متأخر مع الإجابة عن هذا واحد ولكنني وجدت صعوبة في العثور على حل على جوجل ولكن في نهاية المطاف أحسب أنها مدروسة لذلك أود أن مشاركة.
ومع 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) هو نفس الإعداد الذي يمكن تعيين يدويا في نشر نافذة المشروع في IDE VS، مع الجزء مراجعة تعيينها إلى النجمة. و$ (ApplicationRevision) هو المراجعة الفعلية المستخدمة للحصول على الإصدار المنشورة. مهمة FormatVersion هو المدمج في مهمة MSBuild أن تنسيقات اثنين إلى رقم الإصدار الكامل واحد.
وهذا سوف تعيين 'الحد الأدنى من النسخة المطلوبة "أن تكون هي نفسها باسم' نشر صفحة" بالتالي ضمان الانتشار الجديد سيتم تثبيت دائما من قبل المستخدمين، أي لا خيار لتخطي التحديث.
وبطبيعة الحال، إذا كنت لا ترغب في تعيين الحد الأدنى المطلوب الإصدار إلى نشر نسخة وتريد استخدام خاصية مصدر مختلفة فمن مستقيم الى الامام لتعديل هذا الهدف، ولكن المبدأ هو نفسه.
نصائح أخرى
وانتهى بي الأمر في الواقع المتداول على الوظائف الإضافية لVS يقوم بمزامنة جميع أرقام إصدار، ثم يبني وتنشر بنقرة واحدة. وكان من السهل جدا.
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
ومن خارج منطقة الجزاء، وأنا لا اجد هناك طريقة. انها ليست الكثير من الجهد لزيادة ونقصان بنفسك ولكن.
والنهج الأول هو استخدام كما يلي:
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) إنشاء مهمة لزيادة الإصدار على إنشاء. وهنا الألغام
<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>
وبعض الحيل clickonce إضافية هنا <لأ href = "http://weblogs.asp.net/sweinstein/archive/2008/08/24/top-5-secrets-of-net-desktop-deployment-wizards.aspx "يختلط =" noreferrer "> http://weblogs.asp.net/sweinstein/archive/2008/08/24/top-5-secrets-of-net-desktop-deployment-wizards.aspx
وهنا هو كيف التعامل مع هذا واحد. أولا أنا خلقت مهمة مخصصة التي يلتف استبدال سلسلة:
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;
}
}
}
وذلك أن يحصل في صلب SynchBuild.dll الذي تراه المشار إليها في UsingTask أدناه. الآن أنا حاولت فقط overwritting الممتلكات MinimumRequiredVersion، ولكن لا يبدو أن الحصول على التقطت، لذلك أنا فقط overwrote في GenerateApplicationManifest الهدف بإضافة الأسطر التالية إلى نهاية الملف csproj بلدي:
<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>
والنتيجة النهائية هي أن نأخذ نسخة التطبيق والمراجعة، الجمع بينهما، وإزالة النجمة، ثم تعيين صيغة الحد الأدنى المطلوب. لدي نسخة التطبيق لصناعة السيارات زيادة في بلدي نشر خصائص تعيين بحيث هي الطريقة التي يأخذ تزايد المكان، ثم أنا فقط وضع minimumrequiredversion إلى دائما match.I لا تستخدم بناء الفريق، وهذا تم تصميم فقط بحيث مطور يستخدم استوديو البصرية يمكن ان يجعل جميع عمليات الانتشار clickonce المطلوبة. ويساعد هذا الأمل.
إذا كنت تقوم بنشر تطبيق ClickOnce بك من Visual ستوديو بعد ذلك فقط تثبيت AutoUpdateProjectsMinimumRequiredClickOnceVersion NuGet حزمة في المشروع، وكنت على ما يرام.
إذا كنت تقوم بنشر من خادم بناء أو السيناريو الآخر، ثم يمكنك استخدام تعيين-ProjectFilesClickOnceVersion بوويرشيل النصي . يصف بلدي بلوق بمزيد من التفصيل كيفية الإعداد الخادم الخاص بناء لاستيعاب نشر التطبيقات ClickOnce .
هل تبحث عن تحديثات التطبيق؟
النقر بزر الماوس الأيمن على المشروع في Solution Explorer ثم النقر فوق نشر...هي الطريقة الخاطئة للحصول على تحديثات التطبيق.يجب عليك النقر بزر الماوس الأيمن فوق مشروعك والنقر فوق "خصائص"، ثم النقر فوق علامة التبويب "نشر".انقر فوق التحديثات...زر ثم حدد خانة الاختيار "يجب أن يتحقق التطبيق من وجود تحديثات".هناك يمكنك أيضًا تحديد أ الحد الأدنى من الإصدار المطلوب للتطبيق. (لم أستخدم هذه الوظيفة ولكن وظيفة التحديثات هي السبب الأساسي الذي يجعلني أستخدم ClickOnce وهي تعمل بشكل رائع.)