2008-10-14 6 views
16

क्या वर्तमान बिल्ड नंबर के बराबर हमेशा एक क्लिकऑन परिनियोजन में "न्यूनतम आवश्यक संस्करण" फ़ील्ड को स्वचालित रूप से बढ़ाने का कोई तरीका है? असल में, मैं हमेशा लॉन्च पर अपनी तैनाती को स्वचालित रूप से अपडेट करना चाहता हूं।क्लिकऑन परिनियोजन में स्वचालित रूप से "न्यूनतम आवश्यक संस्करण" बढ़ाएं?

मुझे संदेह है कि मुझे कुछ पूर्व-पोस्ट-बिल्ड इवेंट की आवश्यकता होगी, लेकिन मुझे उम्मीद है कि एक आसान तरीका है।

+0

मेरे पास इसका एक साफ समाधान है। कृपया मेरा जवाब देखें [यहां] (http://stackoverflow.com/a/31665818/450913)। – orad

उत्तर

18

मुझे इसका उत्तर देने में थोड़ा देर हो सकती है लेकिन मुझे Google पर समाधान ढूंढना मुश्किल हो गया, लेकिन आखिर में यह पता चला कि मैं साझा करूंगा।

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) एक ही सेटिंग है कि आप में इस परियोजना के प्रकाशित करें विंडो में मैन्युअल रूप से सेट कर सकते हैं वीएस आईडीई, संशोधन भाग के साथ एक तारांकन के लिए सेट। $ (ApplicationRevision) प्रकाशित संस्करण के लिए वास्तविक संशोधन का उपयोग किया जा रहा है। FormatVersion कार्य एक अंतर्निहित एमएसबिल्ड कार्य है जो दोनों को एक पूर्ण संस्करण संख्या में स्वरूपित करता है।

यह 'न्यूनतम संस्करण' को 'प्रकाशित संस्करण' जैसा ही सेट करेगा, इसलिए यह सुनिश्चित करना होगा कि नई तैनाती हमेशा उपयोगकर्ताओं द्वारा स्थापित की जाएगी, यानी अद्यतन छोड़ने का कोई विकल्प नहीं है।

बेशक, यदि आप प्रकाशित संस्करण में न्यूनतम आवश्यक संस्करण सेट नहीं करना चाहते हैं और एक अलग स्रोत संपत्ति का उपयोग करना चाहते हैं तो यह लक्ष्य में संशोधन करने के लिए सीधे आगे है, लेकिन सिद्धांत समान है।

+1

मुझे यह पता लगाने में थोड़ी देर लग गई कि इसे कहां रखा जाए। आपको प्रोजेक्ट को अनलोड करना होगा, राइट क्लिक करें और "Test.csproj संपादित करें" का चयन करें (या इसे एक संपादक में वीएस के बाहर खोलें)। – Dan

+1

"MinimumRequiredVersion" और "_DeploymentBuiltMinimumRequiredVersion" के बीच क्या अंतर है? अगर मैं पहले फॉर्मेटर्स अनुभाग को हटा देता हूं तो यह अभी भी काम करता है। इसकी आवश्यकता कब होगी? – Dan

+0

कृपया ध्यान रखें कि यह MinimumRequiredVersion के लिए मान को सही तरीके से तैनात करेगा, लेकिन उस मान को आपकी प्रोजेक्ट फ़ाइल में या प्रकाशित UI के भीतर प्रदर्शित नहीं किया जाएगा। –

-1

क्या आप एप्लिकेशन अपडेट ढूंढ रहे हैं?

समाधान एक्सप्लोरर में प्रोजेक्ट पर राइट क्लिक करें और फिर प्रकाशित करें पर क्लिक करें ... एप्लिकेशन अपडेट प्राप्त करने का गलत तरीका है। आपको अपनी प्रोजेक्ट पर राइट-क्लिक करना होगा और गुण क्लिक करें, फिर प्रकाशित करें टैब पर क्लिक करें। अद्यतन ... बटन पर क्लिक करें और फिर "एप्लिकेशन को अद्यतनों की जांच करनी चाहिए" चेक बॉक्स को चेक करें। वहां आप एप्लिकेशन के लिए न्यूनतम आवश्यक संस्करण भी निर्दिष्ट कर सकते हैं। (मैंने उस कार्यक्षमता का उपयोग नहीं किया है, लेकिन अपडेट कार्यक्षमता मुख्य कारण है जिसे मैं क्लिकऑन का उपयोग करता हूं और यह बहुत अच्छा काम करता है।)

+1

मैं जो करना चाहता हूं वह स्वचालित रूप से बढ़ाना है कि "संस्करण के लिए न्यूनतम आवश्यक संस्करण" प्रकाशित होने के बारे में वर्तमान संस्करण से मेल खाता है। –

+1

मैं देखता हूं। यह बहुत उपयोगी लगता है। वास्तव में, यदि एमएस स्मार्ट थे, तो वे इसे चेकबॉक्स सुविधा में निर्मित कर सकते थे ... :-) –

+1

सवाल यह था कि उस कार्यक्षमता को स्वचालित रूप से कैसे बढ़ाया जाए। –

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) बनाएं बिल्ड पर संस्करण बढ़ाने के लिए एक कार्य। यहाँ मेरा

<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

मैं वास्तव में वी.एस. के लिए एक ऐडइन कि सभी संस्करण संख्याओं सिंक्रनाइज़ करता है, और फिर बनाता है और एक क्लिक के साथ प्रकाशित करता रोलिंग समाप्त हो गया कुछ अतिरिक्त 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

वीएस एडइन इस मामले में सबसे अच्छा तरीका नहीं है जब आपके पास परियोजना पर काम कर रहे कई डेवलपर हैं। क्या आपने बिल्ड इवेंट्स का उपयोग करके इसे करने का एक तरीका निकाला है? –

+0

@Bob दिलचस्प बात यह है कि आपका समाधान गैर-वीएसटीओ परियोजनाओं के लिए ठीक काम करता है, लेकिन "प्रकाशित" संपत्ति VSTO परियोजनाओं के लिए कुछ भी नहीं है। –

+0

क्या आप एक VSTO प्रोजेक्ट में "प्रकाशित करें" टैब पर बटन का उपयोग करके प्रकाशित कर सकते हैं? –

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

ताकि SynchBuild.dll जो आप नीचे UsingTask में संदर्भित देखें में बनाया जाता है: सबसे पहले मुझे लगता है कि स्ट्रिंग प्रतिस्थापन लपेटता एक कस्टम कार्य बनाया। अब मैं सिर्फ MinimumRequiredVersion संपत्ति overwritting की कोशिश की है, लेकिन यह उठाया पाने के लिए नहीं लगता था, इसलिए मैं सिर्फ अपनी 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> 

अंतिम परिणाम क्या हम ऐप संस्करण और संशोधन लेते हैं, उन्हें गठबंधन करते हैं, तारांकन हटाते हैं, फिर न्यूनतम आवश्यक संस्करण सेट करते हैं। मेरे पास मेरे प्रकाशित गुण सेट में ऑटो वृद्धि एप संस्करण है, इसलिए यह बढ़ता जा रहा है कि मैं कितनी वृद्धि कर रहा हूं, फिर मैं हमेशा न्यूनतम मिलान करने के लिए न्यूनतम रिक्वेर्डवर्जन सेट कर रहा हूं। मैं टीम बिल्ड का उपयोग नहीं करता हूं, यह सिर्फ डिज़ाइन किया गया है ताकि विज़ुअल स्टूडियो का उपयोग करने वाला डेवलपर सभी क्लिकऑन परिनियोजन की आवश्यकता हो सकती है। उम्मीद है की यह मदद करेगा।

0

यदि आप विजुअल स्टूडियो से अपना क्लिकऑन एप्लिकेशन प्रकाशित कर रहे हैं तो बस अपनी परियोजना में AutoUpdateProjectsMinimumRequiredClickOnceVersion NuGet Package इंस्टॉल करें और आप जाने के लिए अच्छे हैं।

यदि आप किसी बिल्ड सर्वर या अन्य स्क्रिप्ट से प्रकाशित कर रहे हैं, तो आप Set-ProjectFilesClickOnceVersion PowerShell script का उपयोग कर सकते हैं। मेरा ब्लॉग अधिक जानकारी how to setup your build server to accommodate publishing ClickOnce applications में वर्णित है।