2013-03-05 31 views
9

Projelerimi yayınlamak için bir kurulum projesi kullanıyorum. Her projenin sürümünün kurulum sürümü ile aynı olmasını istiyorum.AssemblyInfo Sürüm numaralarını MSI kurulum sürümüyle ayarlayın

Kurulum sürümümüzü Visual Studio'da değiştirmek ve binadan sonra, bu özellikten güncellenecek tüm proje sürümleri için bu mümkün mü?

+1

"kurulum versiyonu" nedir? –

+0

@SimonMourier, ilk başta beni şaşırttı, benim 2. ekran görüntüsü cevabımda gösterildi. –

+0

Oh, kurulum projesinin bu "Sürüm" özelliği, bildiğim kadarıyla, son MSI dosyasında yazılmadı, bu yüzden ne anlamı var? –

cevap

26

Projeler Montaj & Dosya sürüm numaralarına sahiptir: (ı buna göre sorunuzu düzenlemediyse kurulum versiyonları) enter image description here

Cevap 1:

Montaj set Kur projeleri sürüm numarasını olmak için & Dosya sürüm numaralarını, yapı tarafından tetiklenen bir komut dosyası/exe ile yapmanız gerekir.

enter image description here

How To Update Assembly Version Number Automatically ilgili bu madde yarım çözümü gösteriyor ... ben yaptım araştırma itibaren

bir PreBuildEvent içinde SetupVersion kullanmak mümkün değildir. -set: komutunu kullanarak Kod Projesi makalesinde this comment gösterildiği gibi her inşa PreBuildEvent değiştirmek zorunda http://msdn.microsoft.com/en-us/library/42x5kfw4(v=vs.80).aspx

ideal değildir: bunun için bir $ SetupVersion komutu yoktur.

İhtiyacımız olan çözüm, AssemblyInfoUtil.exe dosyasını çağırmak ve vdproj proje dosyasından "ProductVersion" komutunu okumak için bir PreBuildEvent'tir. Daha sonra, Assembly sürüm numaralarını güncelleştirin.

nasıl Setup.vdproj gelen ürün sürümünü okumak için size göstermek için makalesinden kodunu değiştirmiş ve bu da bir PreBuildEvent çağrılabilir nasıl:

AssemblyInfoUtil.exe -setup:"C:\Program Files\MyProject1\Setup1\Setup1.vdproj" -ass:"C:\Program Files\MyProject1\AssemblyInfo.cs" 

Bu modifiye kodudur :

using System; 
using System.IO; 
using System.Text; 

namespace AssemblyInfoUtil 
{ 
    class AssemblyInfoUtil 
    { 
    private static int incParamNum = 0;  
    private static string fileName = ""; 
    private static string setupfileName = "";  
    private static string versionStr = null;  
    private static bool isVB = false; 
    [STAThread] 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < args.Length; i++) { 
      if (args[i].StartsWith("-setup:")) { 
      string s = args[i].Substring("-setup:".Length); 
      setupfileName = int.Parse(s); 
      } 
      else if (args[i].StartsWith("-ass:")) { 
      fileName = args[i].Substring("-ass:".Length); 
      } 
     } 

     //Jeremy Thompson showing how to detect "ProductVersion" = "8:1.0.0" in vdproj 
     string setupproj = System.IO.File.ReadAllText(setupfileName); 
     int startPosOfProductVersion = setupproj.IndexOf("\"ProductVersion\" = \"") +20; 
     int endPosOfProductVersion = setupproj.IndexOf(Environment.NewLine, startPosOfProductVersion) - startPosOfProductVersion; 
     string versionStr = setupproj.Substring(startPosOfProductVersion, endPosOfProductVersion); 
     versionStr = versionStr.Replace("\"", string.Empty).Replace("8:",string.Empty); 

     if (Path.GetExtension(fileName).ToLower() == ".vb") 
     isVB = true; 

     if (fileName == "") { 
     System.Console.WriteLine("Usage: AssemblyInfoUtil 
      <path to :Setup.vdproj file> and <path to AssemblyInfo.cs or AssemblyInfo.vb file> [options]"); 
     System.Console.WriteLine("Options: "); 
     System.Console.WriteLine(" -setup:Setup.vdproj file path"); 
     System.Console.WriteLine(" -ass:Assembly file path"); 
     return; 
     } 

     if (!File.Exists(fileName)) { 
     System.Console.WriteLine 
      ("Error: Can not find file \"" + fileName + "\""); 
     return; 
     } 

     System.Console.Write("Processing \"" + fileName + "\"..."); 
     StreamReader reader = new StreamReader(fileName); 
      StreamWriter writer = new StreamWriter(fileName + ".out"); 
     String line; 

     while ((line = reader.ReadLine()) != null) { 
     line = ProcessLine(line); 
     writer.WriteLine(line); 
     } 
     reader.Close(); 
     writer.Close(); 

     File.Delete(fileName); 
     File.Move(fileName + ".out", fileName); 
     System.Console.WriteLine("Done!"); 
    } 

    private static string ProcessLine(string line) { 
     if (isVB) { 
     line = ProcessLinePart(line, "<Assembly: AssemblyVersion(\""); 
     line = ProcessLinePart(line, "<Assembly: AssemblyFileVersion(\""); 
     } 
     else { 
     line = ProcessLinePart(line, "[assembly: AssemblyVersion(\""); 
     line = ProcessLinePart(line, "[assembly: AssemblyFileVersion(\""); 
     } 
     return line; 
    } 

    private static string ProcessLinePart(string line, string part) { 
     int spos = line.IndexOf(part); 
     if (spos >= 0) { 
     spos += part.Length; 
     int epos = line.IndexOf('"', spos); 
     string oldVersion = line.Substring(spos, epos - spos); 
     string newVersion = ""; 
     bool performChange = false; 

     if (incParamNum > 0) { 
      string[] nums = oldVersion.Split('.'); 
      if (nums.Length >= incParamNum && nums[incParamNum - 1] != "*") { 
      Int64 val = Int64.Parse(nums[incParamNum - 1]); 
      val++; 
      nums[incParamNum - 1] = val.ToString(); 
      newVersion = nums[0]; 
      for (int i = 1; i < nums.Length; i++) { 
       newVersion += "." + nums[i]; 
      } 
      performChange = true; 
      } 
     } 

     else if (versionStr != null) { 
      newVersion = versionStr; 
      performChange = true; 
     } 

     if (performChange) { 
      StringBuilder str = new StringBuilder(line); 
      str.Remove(spos, epos - spos); 
      str.Insert(spos, newVersion); 
      line = str.ToString(); 
     } 
     } 
     return line; 
    } 
    } 
} 

Cevap 2:

Düşünceme daha iyi bir şekilde bireysel AssemblyInfo sınıf dosyaları yerine bir Shared Assembly Info sınıfını kullanmaktır.

Bunu uygulamak için, SharedAssemblyInfo.cs adlı çözüm klasöründe bir dosya oluşturun ve sonra da her projeye SharedAssemblyInfo.cs öğesine bir bağlantı ekleyin. Ayrıca, bağlı SharedAssemblyInfo.cs öğesini Properties klasörüne yan yana yerleştirerek Properties klasörüne taşıyabilirsiniz.Aşağıda gösterildiği gibi, çözümdeki her bir projeye özgü olan cs.

// Note: Shared assembly information is specified in SharedAssemblyInfo.cs 
using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 
// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information 
// associated with an assembly. 
[assembly: AssemblyTitle("WindowsFormsApplication2")] 
// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("ffded14d-6c95-440b-a45d-e1f502476539")] 

Yani her zaman tüm projeleri değiştirmek istiyorum: Burada

using System; 
using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information 
// associated with an assembly. 
[assembly: AssemblyCompany("Saint Bart Technologies")] 
[assembly: AssemblyProduct("Demo")] 
[assembly: AssemblyCopyright("Copyright ? Saint Bart 2013")] 
[assembly: AssemblyTrademark("")] 

// Make it easy to distinguish Debug and Release (i.e. Retail) builds; 
// for example, through the file properties window. 
#if DEBUG 
[assembly: AssemblyConfiguration("Debug")] 
[assembly: AssemblyDescription("Flavor=Debug")] // a.k.a. "Comments" 
#else 
[assembly: AssemblyConfiguration("Retail")] 
[assembly: AssemblyDescription("Flavor=Retail")] // a.k.a. "Comments" 
#endif 

[assembly: CLSCompliant(true)] 

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type. 
[assembly: ComVisible(false)] 

// Note that the assembly version does not get incremented for every build 
// to avoid problems with assembly binding (or requiring a policy or 
// <bindingRedirect> in the config file). 
// 
// The AssemblyFileVersionAttribute is incremented with every build in order 
// to distinguish one build from another. AssemblyFileVersion is specified 
// in AssemblyVersionInfo.cs so that it can be easily incremented by the 
// automated build process. 
[assembly: AssemblyVersion("1.0.0.0")] 

// By default, the "Product version" shown in the file properties window is 
// the same as the value specified for AssemblyFileVersionAttribute. 
// Set AssemblyInformationalVersionAttribute to be the same as 
// AssemblyVersionAttribute so that the "Product version" in the file 
// properties window matches the version displayed in the GAC shell extension. 
[assembly: AssemblyInformationalVersion("1.0.0.0")] // a.k.a. "Product version" 

örnek AssemblyInfo.cs dosyası: Burada

enter image description here

örnek SharedAssemblyInfo.cs dosyasıdır Montaj bilgileri tek noktadan yapabilirsiniz. MSI Kurulum Sürümünü, Assembly versiyon numarası, bir manuel adım ile aynı şekilde ayarlamak istediğinizi varsayalım.


Cevap 3:

o tüm avantajları bu tür sahiptir MSBuild kullanmak geçmeyi düşünün ama şu anda onu almak için zamanınız varsa emin değilim.


Yanıt 4:

Kurullar olabilir otomatik artış AssemblyInfo.cs Aşağıdaki yıldız sözdizimi kullanılarak yapı numaraları:

[assembly: AssemblyVersion("1.0.0.*")] 

Bu, iyi bir yöntemdir Farklı yapıları tanımak için bir yapı numarası izleme noktası 'dur. Önceden oluşturulmuş bir yapı numarasına sahip olmak, yapı henüz gerçekleşmediğinden bu amacı yener.


Cevap 5:

diğer CodeProject cevap burada Kurulum MSI Proje dosyasında ProductVersion, ProductCode, PackageCode güncellemek istiyorum varsayar. Ben bu şekilde sorunuzu yorumlamak ve bu konuya göre sorunlar var vermedi: pre-build event to change setup project's ProductVersion doesn't take effect until after the build

Cevap 6 (yeni): Birkaç TFS "Montaj Bilgisi" ayarlamak için eklentileri kurmak vardır

: https://marketplace.visualstudio.com/items?itemName=bleddynrichards.Assembly-Info-Task https://marketplace.visualstudio.com/items?itemName=bool.update-assembly-info https://marketplace.visualstudio.com/items?itemName=ggarbuglia.setassemblyversion-task

+0

Büyük cevap, ama Yanıt 1'in kod örneğinde bir sorun buldum. SetupfileName (derleme hatası) için tamsayılar için ayrıştırmaya gerek yoktur ve versionStr yerel değişken olarak yeniden bildirilmemelidir (betiğin hata !). –

1

bu mükemmel sorununuzu çözer eğer bilmiyorum ama gibi tüm configmanagment bilgiler ile ortak bir sınıf uygulamak olabilir: Eğer yeni sınıf ile tüm AssemblyInfo.cs güncelleyebilirsiniz sonra

public class VersionInfo{ 
    public const string cProductVersion = "1.0.0" 
    //other version info 
} 

:

[assembly: AssemblyVersion(VersionInfo.cProductVersion)] 

Umarım bu yardımcı olur.

+0

olurdu Bunu yapmak için resmi bir yol için benim # 2 cevabı bakın, iyi ipucu için –

+0

thx deneyin, çözümünüzden sonra kendi proje kurulumumu değiştireceğim – yaens

İlgili konular