¿Cómo se define la versión de la aplicación en un solo lugar para múltiples aplicaciones?

Tenemos un sistema que consiste en numerosas aplicaciones. Todas las aplicaciones tienen su versión modificada al mismo tiempo. Actualmente, cuando lanzamos una nueva versión, tenemos que abrir manualmente las opciones del proyecto de cada aplicación y cambiar la versión una a una. ¿Hay alguna manera de comstackr todas las aplicaciones en la misma versión, por ejemplo, guardarla en un archivo global y, una vez comstackda, leer este archivo y asignar esa versión al proyecto? Solo trato de eliminar demasiados pasos, porque planeamos cambiar los números de versión con más frecuencia. Me gustaría cambiarlo en un solo lugar. Se puede hacer esto? ¿y cómo?

Puede crear un recurso VERSIONINFO en un archivo de texto sin formato (por ejemplo, Versioninfo.rc )

 1 VERSIONINFO FILEVERSION 2,0,0,0 PRODUCTVERSION 2,0,0,0 FILEOS 0x4 FILETYPE 0x1 { BLOCK "StringFileInfo" { BLOCK "040904E4" { VALUE "CompanyName", "Your Company Name Here\0" VALUE "FileDescription", "Your File Description Here\0" VALUE "FileVersion", "2.0.0.0\0" VALUE "InternalName", "Your Internal Name\0" VALUE "LegalCopyright", "© Your Copyright Notice\0" VALUE "LegalTrademarks", "Your Trademark Notice\0" VALUE "OriginalFilename", "YourExeName\0" VALUE "ProductName", "Your Product Name\0" VALUE "ProductVersion", "2.0.0.0\0" VALUE "Comments", "No Comments\0" } } BLOCK "VarFileInfo" { VALUE "Translation", 0x0409 0x04E4 } } 

Nota: Los terminadores nulos de estilo C ( \0 ) son necesarios al final de cada elemento como se muestra para que el comstackdor de recursos termine apropiadamente las cadenas. De lo contrario, cuando usa Explorer para mostrar la información de la versión del ejecutable, puede obtener valores confusos o parcialmente concatenados.

Agregue una línea al archivo fuente de su proyecto:

 {$R VersionInfo.res VersionInfo.rc} 

Sugiero poner el recurso de información de versión común en una referencia externa en su sistema de control de versiones, y luego puede verificarlo en la carpeta de cada proyecto y actualizarlo fácilmente.

Haga un proyecto-> comstackr, y la información de su versión está integrada en el .exe. Puede verificar utilizando el Explorador de Windows y viendo las propiedades de su aplicación.

Hay un par de publicaciones (una por mí y otra en una respuesta de Jim Fleming) en los foros de Embarcadero Delphi en los archivos de CodeNews Fast. El mío es [aquí], donde describo paso a paso cómo usar un evento de preconstrucción en su proyecto para actualizar el número de versión en el script de recursos que publiqué anteriormente.

Jim publica algunas respuestas, pero alrededor de una docena de publicaciones más abajo hay una fuente para un ejecutable al que se puede llamar desde el evento de preconstrucción que funciona para él. (Hay algunas cosas que haría de manera diferente, como dejar que el IDE pase el nombre y la ubicación del proyecto en la línea de comandos; cómo hacerlo se describe en el artículo paso a paso. También manejaría el análisis de la versión y incrementando de manera diferente, pero la aplicación básica es una buena ubicación inicial.)

Los grupos de Embarcadero están actualmente deprimidos, pero también pude recuperar el código de Jim de CodeNewsFast , y puedo reproducirlo aquí:

Conocido,

Gracias a ti, lo hice funcionar.

En caso de que alguien más quiera implementar esta solución, a continuación encontrará los pasos necesarios y el progtwig auxiliar.

Jim Fleming

A) Cree su archivo de recursos de información de versión en su directorio de proyecto o donde sea, con la siguiente

contenidos y extensión de archivo .rc:

 // Note the \000 !!!! Here and elsewhere below !!!! // C string terminator !!! #define CONST_VERSION "4.1.1.1003\000" 1 VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEOS 0x4 FILETYPE 0x1 { BLOCK "StringFileInfo" { BLOCK "040904E4" // Will need changing if your language is not English and char-set not 1252 (multilingual). { VALUE "CompanyName", "Whatever\000" VALUE "FileDescription", "Whatever\000" VALUE "FileVersion", CONST_VERSION VALUE "InternalName", "My Internal Name\000" VALUE "LegalCopyright", "Copyright © whoever\000" VALUE "LegalTrademarks", "\000" VALUE "OriginalFileName", "If you wish\000" VALUE "ProductName", "What pleases you\000" VALUE "ProductVersion", CONST_VERSION VALUE "Comments", "Anything you wish to add\000" } } BLOCK "VarFileInfo" { VALUE "Translation", 0x0409 0x04E4 } } 

B) Cree un nuevo proyecto en alguna carpeta, el código del único módulo debería ser similar a:

 unit FormIncrementBuildNumber; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.IOUtils, System.StrUtils; type TIncrementBuildNumber = class(TForm) IncrementingBuildNumberLabel: TLabel; procedure FormShow (Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var IncrementBuildNumber: TIncrementBuildNumber; implementation {$R *.dfm} procedure TIncrementBuildNumber.FormShow (Sender: TObject); var Resource_File_Contents: TStringList; Full_File_Name_And_Path: string; First_Line_Of_File: string; Position_First_Dot: Integer; Position_Second_Dot: Integer; Position_Third_Dot: Integer; Position_Trailing_Backslash: Integer; Start_of_Build_Number: Integer; Length_of_Build_Number: Integer; Build_Number_In_ASCII: string; Build_Number_Numeric: Integer; Old_Resource_File_Name: string; Success: Boolean; begin if (System.ParamCount <> 1) then begin ShowMessage ('Resource File name not in first command-line parameter.'); Exit; end; Full_File_Name_And_Path := System.ParamStr(1); if (not TFile.Exists(Full_File_Name_And_Path, False)) then begin ShowMessage ('Resource file ' + Full_File_Name_And_Path + ' not found.'); Exit; end; Resource_File_Contents := TStringList.Create; try Resource_File_Contents.LoadFromFile(Full_File_Name_And_Path); First_Line_Of_File := Resource_File_Contents.Strings[0]; if (Copy(First_Line_Of_File, 1, 21) <> '#define CONST_VERSION') then begin ShowMessage ('First line of Version Info must start with "#define CONST_VERSION".' + #13 + 'Version not incremented.'); Exit; end; Position_First_Dot := Pos('.', First_Line_Of_File); if (Position_First_Dot = 0) then begin ShowMessage ('Version must have format "abcd".' + #13 + 'Build Number not incremented.'); Exit; end; Position_Second_Dot := PosEx('.', First_Line_Of_File, Position_First_Dot+1); if (Position_Second_Dot = 0) then begin ShowMessage ('Version must have format "abcd".' + #13 + 'Build Number not incremented.'); Exit; end; Position_Third_Dot := PosEx('.', First_Line_Of_File, Position_Second_Dot+1); if (Position_Third_Dot = 0) then begin ShowMessage ('Version must have format "abcd".' + #13 + 'Build Number not incremented.'); Exit; end; Position_Trailing_Backslash := PosEx('\', First_Line_Of_File, Position_Third_Dot+1); if (Position_Trailing_Backslash = 0) then begin ShowMessage ('Version must have format "abcd\000".' + #13 + 'Build Number not incremented.'); Exit; end; Start_of_Build_Number := Position_Third_Dot + 1; Length_of_Build_Number := Position_Trailing_Backslash - Start_of_Build_Number; if (Length_of_Build_Number < 1) then begin ShowMessage ('Build Number must be present.' + #13 + 'Build Number not incremented.'); Exit; end; Build_Number_In_ASCII := Copy (First_Line_Of_File, Start_of_Build_Number, Length_of_Build_Number); Success := TryStrToInt (Build_Number_In_ASCII, Build_Number_Numeric); if (not Success) then begin ShowMessage ('Build Number must be numeric integer.' + #13 + 'Build Number not incremented.'); Exit; end; Build_Number_Numeric := Build_Number_Numeric + 1; Build_Number_In_ASCII := IntToStr(Build_Number_Numeric); Resource_File_Contents.Strings[0] := Copy(First_Line_Of_File, 1, Position_Third_Dot) + Build_Number_In_ASCII + '\000"'; Old_Resource_File_Name := Full_File_Name_And_Path; Old_Resource_File_Name := TPath.ChangeExtension(Old_Resource_File_Name, '~rc'); if TFile.Exists(Old_Resource_File_Name, False) then TFile.Delete(Old_Resource_File_Name); Success := RenameFile(Full_File_Name_And_Path, Old_Resource_File_Name); if (not Success) then begin ShowMessage ('Error renaming old resource file to have extension "~rc".' + #13 + 'Build Number not incremented.'); Exit; end; Resource_File_Contents.SaveToFile(Full_File_Name_And_Path); finally Resource_File_Contents.Free; end; end; procedure TIncrementBuildNumber.FormActivate (Sender: TObject); begin Close; end; end. 

C) En Opciones de proyecto del proyecto cuyo número de comstackción debe incrementarse:

  • Elimine la marca "incluir información de versión".

  • Agregue un evento de preconstrucción con el siguiente texto, tal como está escrito, incluidos los dos pares de comillas dobles, sustituyendo las partes dentro de <>:

"" ""

D) Agregar al origen del proyecto, justo debajo de la palabra clave "progtwig":

 {$R '.res' '.rc'} // I think both names must 

sé el mismo aquí: IIRC, recibí errores cuando eran diferentes.

E) Compile, ejecute y disfrute de la devolución de números de construcción de Incremento automático, a pesar de que Embarcadero haya eliminado la instalación.

Fin del contenido de Jim

Puede usar el evento de preconstrucción para, por ejemplo, actualizar los valores de ProductName o FileDescription , o cualquier otro que tenga que ser diferente del script de base.

ACTUALIZACIÓN : no es parte de RADStudio en sí, sino que proviene de DDevExtensions de Andreas Hausladen (¡que estoy tan acostumbrado a …!).

Puede hacerlo desde el IDE con un ProjectGroup siempre que haya instalado las excelentes extensiones DDev de Andreas Hausladen.

  • Tener un Grupo de Proyecto para contener todos tus proyectos
  • Asegúrese de que cada uno de sus proyectos haya marcado “Incluir información de versión en el proyecto” en la página Options|Version Info page .
  • Utilice el menú Project|Set Versioninfo... para abrir el diálogo Establecer información de la versión del proyecto (solo una vez, el proyecto actual no importa).
  • Allí, puede especificar toda la información de la versión y elegir entre “Aplicar a todos” o solo a los proyectos seleccionados si marcó “Aplicar a seleccionados”.

Por ejemplo, vea cómo configuro la versión para ambos proyectos a la vez: Ejemplo donde configuré la versión para ambos proyectos a la vez

Luego, Build All en ProjectGroup produjo ambos archivos con la versión establecida en 1.1.1.9 y todos los demás detalles …

Este es uno de los casos de uso para dzPrepBuild: http://www.dummzeuch.de/delphi/dzprepbuild/englisch.html

(Nota: el proyecto se ha movido a sourceforge porque berlios iba a cerrarse el año pasado. http://sourceforge.net/projects/dzprepbuild/ )