いくつかの展開プロジェクトがあります。アプリケーションを配置するには、いくつかのタスクを実行する必要があります。その 1 つは、各配置プロジェクトの製品バージョンと製品コードを変更することです。
プログラムでそれらを変更する方法が見つかりません。
これは展開プロジェクト (最終的に実行可能なインストーラーを生成する) であるため、MSBuild を使用することはできません。代わりに、コマンド プロンプトから Devenv を使用しています。
いくつかの展開プロジェクトがあります。アプリケーションを配置するには、いくつかのタスクを実行する必要があります。その 1 つは、各配置プロジェクトの製品バージョンと製品コードを変更することです。
プログラムでそれらを変更する方法が見つかりません。
これは展開プロジェクト (最終的に実行可能なインストーラーを生成する) であるため、MSBuild を使用することはできません。代わりに、コマンド プロンプトから Devenv を使用しています。
今日、まったく同じものを探していました。私はグーグルを使ってこれを見つけました:
static void Main(string[] args)
{
string setupFileName = @"<Replace the path to vdproj file>";
StreamReader reader = File.OpenText(setupFileName);
string file = string.Empty;
try
{
Regex expression = new Regex(@"(?:\""ProductCode\"" =
\""8.){([\d\w-]+)}");
Regex expression1 = new Regex(@"(?:\""UpgradeCode\"" =
\""8.){([\d\w-]+)}");
file = reader.ReadToEnd();
file = expression.Replace(file, "\"ProductCode\" = \"8:{" +
Guid.NewGuid().ToString().ToUpper() + "}");
file = expression1.Replace(file, "\"UpgradeCode\" = \"8:{"
+ Guid.NewGuid().ToString().ToUpper() + "}");
}
finally
{
// Close the file otherwise the compile may not work
reader.Close();
}
TextWriter tw = new StreamWriter(setupFileName);
try
{
tw.Write(file);
}
finally
{
// close the stream
tw.Close();
}
}
元の投稿者がこの問題に対する .NET 2.0 ソリューションを探していることは知っています。ただし、これは .NET としてタグ付けされていないため、この問題に対する C++ ソリューションを提供します。これは .NET ランドにも当てはまるかもしれませんが、それは他の人に任せます。
これにより、アプリケーションのバージョン情報ボックスとログ ファイルのバージョン情報が更新されるだけでなく、Windows エクスプローラーに表示されるすべての Windows バージョン情報も更新されます。
更新:元の回答以降にプロセスに加えたいくつかの変更を追加しました。
まず、バージョン情報ブロック全体を Project.rc ファイルから Project.rc2 ファイルに移動しました。
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION FILE_VER
PRODUCTVERSION PROD_VER
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "MyCompany"
VALUE "FileDescription", "Software Description"
VALUE "FileVersion", 1,0,0,1
VALUE "InternalName", "FileName.exe"
VALUE "LegalCopyright", "(c) 2008 My Company. All rights reserved."
VALUE "OriginalFilename", "FileName.exe"
VALUE "ProductName", "Product Name"
VALUE "ProductVersion", 1,0,0,1
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
これは基本的に、リソース エディターから編集するすべてのバージョン情報を別のファイルに転送します。これにより、エディターの外部からリソース ファイルを編集するときにエラーが発生しなくなります。欠点は、リソース エディターからバージョン情報を編集できなくなったことです。しかし、このようなものを自動的に更新したいので、それは大したことではありません.
次に、VersionInfo.h ファイルを作成し、プロジェクトに追加しました。
#pragma once
//major release version of the program, increment only when major changes are made
#define VER_MAJOR 2
//minor release version of the program, increment if any new features are added
#define VER_MINOR 0
//any bugfix updates, no new features
#define VER_REV 0
//if this is some special release (e.g. Alpha 1) put the special release string here
#define STR_SPECIAL_REL "Alpha 1"
#define FILE_VER VER_MAJOR,VER_MINOR,VER_REV
#define PROD_VER FILE_VER
//these are special macros that convert numerical version tokens into string tokens
//we can't use actual int and string types because they won't work in the RC files
#define STRINGIZE2(x) #x
#define STRINGIZE(x) STRINGIZE2(x)
#define STR_FILE_VER STRINGIZE(VER_MAJOR) "." STRINGIZE(VER_MINOR) "." STRINGIZE(VER_REV)
#define STR_PROD_VER STR_FILE_VER " " STR_SPECIAL_REL
#define STR_COPYRIGHT_INFO "©" BuildYear " Your Company. All rights reserved."
次に、rc2 ファイルに VersionInfo.h を含め、次の変更を加えました。
#include "VersionInfo.h"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
<no changes>
VALUE "FileVersion", STR_FILE_VER
<no changes>
VALUE "LegalCopyright", STR_COPYRIGHT_INFO
<no changes>
VALUE "ProductVersion", STR_PROD_VER
<no changes>
このセットアップでは、ビルド スクリプト (Perl を使用) を編集して VersionInfo.h ファイルのバージョン情報を変更してから、devenv コマンド ラインを使用してプロジェクト全体を再構築することができました。
私が追加したもう 1 つのステップは、プロジェクトがビルドされるたびに一意のビルド番号を生成することです。現在の化身では、完全な再構築では常に機能しますが、増分ビルドでは散発的にしか機能しません。私がしたことは、以下を含む build_number.incl というファイルを作成することでした:
#define CurrentBuildNumber "20081020P1525"
これは基本的に、ビルドが開始された日時です。このファイルを生成するプロジェクトのビルド前イベントとして実行されるバッチ ファイルを作成しました。このスクリプトは BuildYear も定義して、VersionInfo.h ファイルの著作権に常に最新のビルドの年が含まれるようにします。バッチ スクリプトは次のとおりです。
echo Generating Build Number
@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @(
Set Month=%%A
Set Day=%%B
Set Year=%%C
)
@For /F "tokens=1,2,3 delims=/M: " %%A in ('Time /t') do @(
Set Hour=%%A
Set Minute=%%B
Set AmPm=%%C
)
@echo #define CurrentBuildNumber "%Year%%Month%%Day%%AmPm%%Hour%%Minute%" > "$(ProjectDir)\build_number.incl"
@echo #define BuildYear "%Year%" >> "$(ProjectDir)\build_number.incl"
echo ----------------------------------------------------------------------
このファイルは、ビルド番号を使用する必要があるプロジェクト内の任意のファイル (つまり、[about] ボックス) に含まれます。
この一部は、この CodeProject の投稿から収集されました。
この情報がお役に立てば幸いです。
私は同じ問題を抱えていまし.vdproj
たprebuildevent
。
セットアップ プロジェクトがビルドされた後、他のコードを使用してmsi
ファイル file を変更したので、postbuildevent
.
ここで私のブログ投稿を参照してください。
構成ファイルの値に基づいて各 AssemblyInfo.cs または AssemblyInfo.vb を更新するプログラムを使用します。各ビルドの前にこの実行可能ファイルを実行します。これが、このプロセスを自動化するために私たちができる最善のことでした。このバッチ プロセスへの呼び出しを、ビルド前のステップとしてプロジェクト構成に追加できます。
msbuild タスクを使用して製品バージョンを更新できます。このテーマに関する MSBuild チームの投稿を確認してください。
Windows アプリでコンパイル時に SVN リビジョン番号を埋め込む
この質問に対する私の回答では、SVN を使用してこのタスクを達成する方法について説明します。
このコンソール リソース エディターを使用すると、ビルド プロセスの最終段階でコマンド プロンプトから製品バージョン情報リソースを更新するための、信頼性が高く反復可能なプロセスを作成できます。
詳細については、特にファイル バージョン情報のバッチ操作ページを参照してください。
これはあなたが求めているものとはまったく異なるかもしれませんが、はるか昔、私はStampverと呼ばれるものを書きました。これは、ビルド後のステップとして .exe ファイルでビルド番号を直接自動インクリメントすることができます。
RCS、CVS、および/またはサブバージョンの使用を調べてください。私は RCS しか知りません。私の理解では、CVS は RCS に基づいていますが、より包括的です。さまざまな掲示板で、Subversion の方が優れていると読んだことがありますが、使用したことはありません。RCS は、すべてのドキュメントとソフトウェア プロジェクトの変更とバージョンを追跡するのに十分です。
RCS はこちら: http://www.cs.purdue.edu/homes/trinkle/RCS/
CVS はこちら: http://www.nongnu.org/cvs/
Subversion はこちら: http://subversion.tigris.org/