上一篇 介绍了Delphi 的各个版本,本文开始分析.dproj文件。.dproj是一个XML文件,里边包含了我们在Delphi开发环境中对项目设置的所有参数(位于IDE:Project -> Options 中),包括并不限于:
版本信息;
图标信息;
编译生成的目标文件存放路径;
编译目标平台(windows,android,ios, .....);
配置信息(Debug,Release)
.....
由于官方没有提供任何关于.dproj文档的说明,本文是根据Delphi 各个项目对比分析的结果,如有任何疏漏甚至错误,欢迎交流指正!所有分析基于Delphi 11.2
对于.dproj 官方并没有给出任何文档介绍,那么为什么要分析研究.dproj文件呢,目的就是想实现delphi程序的自动构建,自动构建,自动构建!
由于.dproj涉及的项目参数非常多,对于自动构建,我们只需要上面的5个参数信息就可以,其他的参数都使用项目原来的。
一、.dproj 文件结构
下面是一个缩减了的.dproj 文件结构框架:
//整体使用 Project 节点,所有内容在这个节点中
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
//第一个 PropertyGroup 节点,不包含任何 Attributes 属性,包含框架VCL/FMX、配置Relase/Debug、平台Win32/Win64/Andoird...、程序类型Application/Dll等主要信息
<PropertyGroup>
<ProjectGuid>{A524FB1B-A9A8-4FB6-A680-1D05B7B5E1BF}</ProjectGuid>
<ProjectVersion>19.5</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Release</Config>
<Platform Condition="'$(Platform)'==''">Win64</Platform>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
<MainSource>VCL_DEMO.dpr</MainSource>
</PropertyGroup>
//随后包含n个PropertyGroup节点,含有不同Condition属性(Attributes),包含程序的版本,图标等信息
<PropertyGroup Condition="xxx">
...
</PropertyGroup>
....
//包含一个ItemGroup节点,定义一些本工程需要的属性参数,例如Cfg_1对应Debug,Cfg_2对应Release
<ItemGroup>
...
</ItemGroup>
//包含一个ProjectExtensions节点,内有n多项目参数节点
<ProjectExtensions>
...
</ProjectExtensions>
//包含n个Import节点,定义项目需要的一些文件
<Import Project=" xxx "/>
</Project>
二、.dproj 文件分析
1). 通用参数节点
第一个 <PropertyGroup> 节点,包含有项目的通用设置参数。这个节点特点是:
该节点是整个项目节点 <Project>的第一个子节点;
该节点是唯一没有包含任何 Attributes 属性的<PropertyGroup> 节点;
是唯一包含<ProjectGuid>子节点的节点;
序号 | 子节点 | 含义 |
1 | <ProjectGuid> | 包含Delphi项目的Guid,每个项目是唯一的,如果在一个项目组中,出现两个ProjectGuid 一样,系统会提示,要求一个项目必须更改。正常情况,Delphi开发环境IDE创建的项目会自动生成这个节点内容,并且保证每个项目是唯一的。 |
2 | <ProjectVersion> | 表示Delphi的版本,和实际Delphi的发行版本是不一样的。例如上面样例数据为19.5,就表示是Delphi 11.2版本开发的。具体的版本对应关系请参见.dproj 版本对应表 。 |
3 | <FrameworkType> | 表示Delphi项目框架,值是 VCL 、FMX或者None(dll和控制台程序该值为None)。 |
4 | <Base> | 表示.dproj文件中是否使用 Base 参数,默认是True,表示使用。该参数不要修改! |
5 | <Config> | 表示Delphi项目中的Build Configurations 配置。Debug或者Release |
6 | <Platform> | 表示Delphi项目的目标平台。 对应的参数值:Android、Android64、iOSDevice64、iOSSimARM64、Linux64、OSX64、OSXARM64、Win32、Win64 |
7 | <AppType> | 表示是应用程序还是控制台程序或者是DLL等。参数值如下:
|
8 | <MainSource> | 工程文件名称,主工程源文件名称,后缀.dpr。对于包项目,没有这个节点。 |
2). <ItemGroup>节点说明
该节点定义整个项目中使用的源文件,项目Debug和Release的宏变量定义。
序号 | 子节点 | 含义 |
1 | <DCCReference> | 定义本工程中需要的源文件,每个源文件对应一个这样的节点,该节点内包含不同的字节点,用来标识本源文件的属性,例如是否是Form单元等。 |
2 | <BuildConfiguration> | 分别定义了基本的(Base)、调试(Debug)、发行(Release)等宏变量。默认值:
|
节点样例:
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="uMainForm.pas">
<Form>Form1</Form>
<FormType>dfm</FormType>
</DCCReference>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
3). <PropertyGroup Condition=" xxx "> 节点说明
对于 Condition属性不同的值定义不同的参数。
序号 | Condition中xxx | 含义 |
1 | '$(Base)'!='' | 表示项目的默认配置,包括以下节点:
如果是FMX框架,还包括权限参数的定义。不过自动构建一般不修改这些参数,由IDE生成。 |
2 | $(Base_Win32)'!='' | 表示Win32的默认基本配置,VCL框架默认是这个平台,里边包含默认的版本信息等。 |
3 | '$(Base_Win64)'!='' | 表示Win64的默认基本配置,VCL框架有这个平台,如果在IDE界面没有增加这个平台,只是有这个节点的简单信息,并没有详细信息。 |
4 | '$(Cfg_1)'!='' | Debug模式的默认配置。 |
5 | '$(Cfg_2)'!='' | Release模式的默认配置 |
6 | '$(Cfg_1_Win32)'!='' | Debug模式下的Win32配置 |
7 | '$(Cfg_2_Win32)'!='' | Release模式下的Win32配置 |
8 | '$(Cfg_1_Win64)'!='' | Debug模式下的Win64配置 |
9 | '$(Cfg_2_Win64)'!='' | Release模式下的Win64配置 |
10 | '$(Base_Android)'!='' | 表示Android32的默认基本配置,FMX框架支持。 |
11 | '$(Base_Android64)'!='' | 表示Android64的默认基本配置,FMX框架支持。 |
13 | '$(Base_iOSDevice64)'!='' | 表示IOS64设备的默认基本配置,FMX框架支持。IOS已经放弃32位,所以只有64位。 |
14 | '$(Base_iOSSimARM64)'!='' | 表示IOS64设备的ARM模拟器的默认基本配置,FMX框架支持。 |
15 | '$(Base_Linux64)'!='' | 表示Linux64的默认配置 |
17 | '$(Base_OSX64)'!='' | 表示Mac OS 在intel平台上的默认配置 |
18 | '$(Base_OSXARM64)'!='' | 表示Mac OS 在Arm平台上的默认配置 |
19 | ..... | ..... |
对于Delphi IDE创建好的.dproj文件,如果我们需要修改项目工程的版本信息和图标,只需要关注修改一个<PropertyGroup Condition=" xxx ">节点,具体是那个节点呢?
需要根据Conifg,PlatForm确定。
例如,当我们配置Config是Debug,开发的平台PlatForm是Win64。那么我们就需要修改Condition 等于 '$(Cfg_1_Win64)'!='' 的节点。
4). 举例说明 '$(Cfg_1_Win64)'!='' 节点
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_MajorVer>8</VerInfo_MajorVer>
<VerInfo_MinorVer>8</VerInfo_MinorVer>
<VerInfo_Release>8</VerInfo_Release>
<VerInfo_Build>8</VerInfo_Build>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=8.8.8.8;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=8.8.8.8;Comments=</VerInfo_Keys>
<DCC_ExeOutput>.\$(Platform)\$(Config)\Win64_DebugEXE</DCC_ExeOutput>
<DCC_DcuOutput>.\$(Platform)\$(Config)\Win64_DebugDCU</DCC_DcuOutput>
<Icon_MainIcon>VCL_DEMO_Icon.ico</Icon_MainIcon>
</PropertyGroup>
如果需要在编译前修改版本以及图标,就在这个节点中修改。
序号 | 节点 | 说明 |
1 | <VerInfo_Keys> | 包含的版本信息,对应IDE如下: |
2 | <DCC_ExeOutput> <DCC_DcuOutput> | Exe的输出路径 |
3 | <Icon_MainIcon> | 程序图标 |
三、总结
.dproj文件是项目入口总控文件,由Delphi开发环境创建的,不清楚不要轻易修改;
在Delphi的开发环境已经都编译通过,然后需要自动构建,发布版本、图标等,就可以动态修改.dproj。
对于自动构建,需要修改的也就是版本信息和图标,其他不用动。
以上分析仅是个人分析结果,疏漏和错误必然存在,希望有共同需求的的朋友一起完善,需要时可以交流。
今天是2022年大年30,明天就是2023年,兔年!愿大家在新的一年身体健康,喜乐平安!