هل تريد زيادة "الحد الأدنى المطلوب للإصدار" تلقائيًا في نشر ClickOnce؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لزيادة حقول "الحد الأدنى المطلوب للإصدار" تلقائيًا في نشر 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="&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>

وبعض الحيل 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="&#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>

والنتيجة النهائية هي أن نأخذ نسخة التطبيق والمراجعة، الجمع بينهما، وإزالة النجمة، ثم تعيين صيغة الحد الأدنى المطلوب. لدي نسخة التطبيق لصناعة السيارات زيادة في بلدي نشر خصائص تعيين بحيث هي الطريقة التي يأخذ تزايد المكان، ثم أنا فقط وضع minimumrequiredversion إلى دائما match.I لا تستخدم بناء الفريق، وهذا تم تصميم فقط بحيث مطور يستخدم استوديو البصرية يمكن ان يجعل جميع عمليات الانتشار clickonce المطلوبة. ويساعد هذا الأمل.

إذا كنت تقوم بنشر تطبيق ClickOnce بك من Visual ستوديو بعد ذلك فقط تثبيت AutoUpdateProjectsMinimumRequiredClickOnceVersion NuGet حزمة في المشروع، وكنت على ما يرام.

إذا كنت تقوم بنشر من خادم بناء أو السيناريو الآخر، ثم يمكنك استخدام تعيين-ProjectFilesClickOnceVersion بوويرشيل النصي . يصف بلدي بلوق بمزيد من التفصيل كيفية الإعداد الخادم الخاص بناء لاستيعاب نشر التطبيقات ClickOnce .

هل تبحث عن تحديثات التطبيق؟

النقر بزر الماوس الأيمن على المشروع في Solution Explorer ثم النقر فوق نشر...هي الطريقة الخاطئة للحصول على تحديثات التطبيق.يجب عليك النقر بزر الماوس الأيمن فوق مشروعك والنقر فوق "خصائص"، ثم النقر فوق علامة التبويب "نشر".انقر فوق التحديثات...زر ثم حدد خانة الاختيار "يجب أن يتحقق التطبيق من وجود تحديثات".هناك يمكنك أيضًا تحديد أ الحد الأدنى من الإصدار المطلوب للتطبيق. (لم أستخدم هذه الوظيفة ولكن وظيفة التحديثات هي السبب الأساسي الذي يجعلني أستخدم ClickOnce وهي تعمل بشكل رائع.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top