セットアップ プロジェクトを使用してプロジェクトを公開しています。各プロジェクトのバージョンをセットアップ バージョンと同じにしたい。
Visual Studio でセットアップ バージョン プロパティを変更したいのですが、ビルド後に、このプロパティからすべてのプロジェクト バージョンを更新できますか?
セットアップ プロジェクトを使用してプロジェクトを公開しています。各プロジェクトのバージョンをセットアップ バージョンと同じにしたい。
Visual Studio でセットアップ バージョン プロパティを変更したいのですが、ビルド後に、このプロパティからすべてのプロジェクト バージョンを更新できますか?
プロジェクトにはアセンブリとファイルのバージョン番号があります:(セットアップバージョンではなく、それに応じて質問を編集しました)
答え 1:
セットアップ プロジェクトのバージョン番号をアセンブリとファイルのバージョン番号に設定する場合は、ビルドによってトリガーされるスクリプト/exe を使用して行う必要があります。
アセンブリのバージョン番号を自動的に更新する方法に関するこの記事は、ソリューションの半分を示しています...
私が行った調査から、PreBuildEvent で SetupVersion を使用することはできません。$SetupVersion コマンドはありません: http://msdn.microsoft.com/en-us/library/42x5kfw4(v=vs.80).aspx
コマンドを使用してコード プロジェクト記事のこのコメントに示されているように、ビルドごとに PreBuildEvent を変更する必要があるの-set:
は理想的ではありません。
必要な解決策は、AssemblyInfoUtil.exe を呼び出して vdproj プロジェクト ファイルから "ProductVersion" を読み取らせる PreBuildEvent です。次に、アセンブリのバージョン番号を更新します。
この記事のコードを変更して、Setup.vdproj から製品バージョンを読み取る方法を示しました。PreBuildEvent から呼び出す方法は次のとおりです。
AssemblyInfoUtil.exe -setup:"C:\Program Files\MyProject1\Setup1\Setup1.vdproj" -ass:"C:\Program Files\MyProject1\AssemblyInfo.cs"
これは変更されたコードです:
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;
}
}
}
答え 2:
私の考えでは、個々の AssemblyInfo クラス ファイルではなく、 Shared Assembly Infoクラスを使用する方が良い方法です。
これを実装するには、ソリューション フォルダーに SharedAssemblyInfo.cs という名前のファイルを作成し、各プロジェクトに SharedAssemblyInfo.cs へのリンクを追加します。以下に示すように、リンクされた SharedAssemblyInfo.cs を Properties フォルダーに移動して、ソリューション内の各プロジェクトに固有の AssemblyInfo.cs と並べて配置することもできます。
サンプルの SharedAssemblyInfo.cs ファイルを次に示します。
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"
サンプルの AssemblyInfo.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")]
したがって、すべてのプロジェクトのアセンブリ情報を変更するたびに、1 つの場所で行うことができます。MSI セットアップ バージョンをアセンブリ バージョン番号と同じに設定する必要があると思います。1 つの手動ステップです。
答え 3:
MSBuildを使用するように切り替えることを検討してください。MSBuildにはこれらすべての種類の利点がありますが、今すぐ手に入れる時間があるかどうかはわかりません。
答え 4:
アセンブリは、AssemblyInfo.cs 内で次のアスタリスク構文を使用して、ビルド番号を自動インクリメントできます。
[assembly: AssemblyVersion("1.0.0.*")]
ビルド番号を追跡するポイントは、さまざまなビルドを認識できるようにすることであるため、これは良い方法です。ビルド前にビルド番号を変更すると、ビルドがまだ行われていないため、この目的が無効になります。
答え 5:
ここでの他のCodeProjectProductVersion, ProductCode, PackageCode
の回答は、セットアップMSIプロジェクトファイルで更新することを前提としています。私はあなたの質問をそのように解釈しませんでした。このスレッドによると、問題があります:
セットアップ プロジェクトの ProductVersion を変更するためのビルド前イベントは、ビルド後まで有効になりません。
回答 6 (新規):
「アセンブリ情報」を設定するためのTFS ビルド プラグインがいくつかあります。 .update-assembly-info https://marketplace.visualstudio.com/items?itemName=ggarbuglia.setassemblyversion-task
これで問題が完全に解決するかどうかはわかりませんが、次のようなすべての configmanagment 情報を含む共通のクラスを実装できます。
public class VersionInfo{
public const string cProductVersion = "1.0.0"
//other version info
}
すべての AssemblyInfo.cs を新しいクラスで更新できたら、次のようにします。
[assembly: AssemblyVersion(VersionInfo.cProductVersion)]
これが役立つことを願っています。