Projeler Montaj & Dosya sürüm numaralarına sahiptir: (ı buna göre sorunuzu düzenlemediyse kurulum versiyonları)
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.
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
ö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
"kurulum versiyonu" nedir? –
@SimonMourier, ilk başta beni şaşırttı, benim 2. ekran görüntüsü cevabımda gösterildi. –
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? –