为不同的delphiide创建Delphi包的最佳实践
我坚持。我想为所有Delphi XE系列编译器提供一个最小的项目文件理想情况下,我需要一个工具来为XE-XE-6创建一个项目文件,并自动删除所有冗余信息并为XE-XE-5创建相应的项目文件。有什么聪明的方法来实现这一点吗 这是我当前的项目文件,其中包含很多冗余信息。例如,它包含Android/iOS等的虚拟配置,但我的项目针对的是传统的Windows应用程序。如果我手动删除此信息,它将在项目更改时返回。另外,我知道为不同的delphiide创建Delphi包的最佳实践,delphi,project-files,Delphi,Project Files,我坚持。我想为所有Delphi XE系列编译器提供一个最小的项目文件理想情况下,我需要一个工具来为XE-XE-6创建一个项目文件,并自动删除所有冗余信息并为XE-XE-5创建相应的项目文件。有什么聪明的方法来实现这一点吗 这是我当前的项目文件,其中包含很多冗余信息。例如,它包含Android/iOS等的虚拟配置,但我的项目针对的是传统的Windows应用程序。如果我手动删除此信息,它将在项目更改时返回。另外,我知道DebugInformation的值在XE4中是布尔值,但在XE5中是整数 <
DebugInformation
的值在XE4中是布尔值,但在XE5中是整数
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{1118D87C-9E72-4D93-9098-E70AD237493A}</ProjectGuid>
<MainSource>dutil_rtl.dpk</MainSource>
<ProjectVersion>15.1</ProjectVersion>
<FrameworkType>None</FrameworkType>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Release</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Package</AppType>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
<Cfg_2_Win64>true</Cfg_2_Win64>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_DUPLICATE_CTOR_DTOR>false</DCC_DUPLICATE_CTOR_DTOR>
<GenPackage>true</GenPackage>
<GenDll>true</GenDll>
<RuntimeOnlyPackage>true</RuntimeOnlyPackage>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
<DCC_DcuOutput>..\lib\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_RemoteDebug>false</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>false</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="rtl.dcp"/>
<DCCReference Include="..\src\dutil.core.Exception.pas"/>
<DCCReference Include="..\src\dutil.core.NonRefCountedInterfacedObject.pas"/>
<DCCReference Include="..\src\dutil.io.device.File_.pas"/>
<DCCReference Include="..\src\dutil.io.device.TempFile.pas"/>
<DCCReference Include="..\src\dutil.io.FileVersion.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.MessageWindowThread.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.Platform.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.Process.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.registry.Reader.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.registry.Validation.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.registry.Writer.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.SpecialPath.pas"/>
<DCCReference Include="..\src\dutil.sys.win32.SubclassingWindow.pas"/>
<DCCReference Include="..\src\dutil.text.arg.Arg.pas"/>
<DCCReference Include="..\src\dutil.text.arg.Arguments.pas"/>
<DCCReference Include="..\src\dutil.text.arg.Builder.pas"/>
<DCCReference Include="..\src\dutil.text.Convert.pas"/>
<DCCReference Include="..\src\dutil.text.json.Json.pas"/>
<DCCReference Include="..\src\dutil.text.json.Reader.pas"/>
<DCCReference Include="..\src\dutil.text.json.Validation.pas"/>
<DCCReference Include="..\src\dutil.text.Util.pas"/>
<DCCReference Include="..\src\dutil.text.xml.Validation.pas"/>
<DCCReference Include="..\src\dutil.time.Time.pas"/>
<DCCReference Include="..\src\dutil.util.concurrent.BlockingQueue.pas"/>
<DCCReference Include="..\src\dutil.util.concurrent.FailSafeThread.pas"/>
<DCCReference Include="..\src\dutil.util.concurrent.Result.pas"/>
<DCCReference Include="..\src\dutil.util.concurrent.Timer.pas"/>
<DCCReference Include="..\src\dutil.util.concurrent.TimerImpl.pas"/>
<DCCReference Include="..\src\dutil.util.concurrent.TimerQueue.pas"/>
<DCCReference Include="..\src\dutil.util.container.DynArray.pas"/>
<DCCReference Include="..\src\dutil.util.digest.Crc32.pas"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>Package</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1033</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<Source>
<Source Name="MainSource">dutil_rtl.dpk</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k190.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp190.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Deployment/>
<Platforms>
<Platform value="iOSDevice">False</Platform>
<Platform value="iOSSimulator">False</Platform>
<Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
</Project>
{1118D87C-9E72-4D93-9098-E70AD237493A}
dutil_rtl.dpk
15.1
没有一个
真的
释放
Win32
3.
包裹
真的
真的
基础
真的
真的
基础
真的
真的
基础
真的
真的
Cfg_1
真的
真的
真的
Cfg_1
真的
真的
真的
基础
真的
真的
Cfg_2
真的
真的
真的
Cfg_2
真的
真的
公司名称=;FileDescription=;FileVersion=1.0.0.0;内部名称=;LegalCopyright=;LegalTrademarks=;原始文件名=;产品名称=;ProductVersion=1.0.0.0;评论=
1033
假的
真的
真的
真的
制度;Xml;数据;数据捕捉;网状物肥皂$(DCC_名称空间)
..\lib\$(平台)\$(配置)
.\$(平台)\$(配置)
假的
假的
假的
假的
假的
Winapi;系统赢;数据赢;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;溴化二苯醚$(DCC_名称空间)
真的
真的
Winapi;系统赢;数据赢;Datasnap.Win;Web.Win;Soap.Win;Xml.Win$(DCC_名称空间)
调试$(DCC_定义)
假的
真的
真的
真的
真的
假的
真的
假的
释放$(DCC_定义)
0
假的
真的
真的
主要来源
Cfg_2
基础
基础
Cfg_1
基础
Delphi.Personality.12
包裹
真的
假的
1.
0
0
0
假的
假的
假的
假的
假的
1033
1252
1.0.0.0
1.0.0.0
dutil_rtl.dpk
Microsoft Office 2000自动化服务器包装组件示例
Microsoft Office XP自动化服务器包装组件示例
假的
假的
真的
真的
12
在过去,所有内容都仅基于DPR/DPK文件,但由于引入了DPROJ文件,单个项目可能无法继续工作。这是因为DPROJ文件包含版本信息,在某些情况下还包含不同IDE版本的节点结构。如果您在较新的IDE中打开了DPROJ,并且该文件包含较旧的版本/结构,则IDE将升级该项目。如果随后将更改保存到同一个文件中,则该文件将不再适用于较旧的IDE
如果您查看任何主要的第三方组件包,出于这个原因,它们为每个IDE版本维护不同的项目。您也需要这样做。大多数商业软件包(如DevExpress)和开源组件/软件包(如SynEdit和Jedi库)在相同的源代码上为每个版本的IDE使用单独的项目文件。D7、D2010、DXE2……等 这允许提供者使用条件定义来处理IDE/平台的不同版本,以便他们的代码能够为开发人员工作 您可能需要执行同样的操作,以避免为使用库的用户提供复杂的安装说明 此外,这几乎是完成此操作的标准方式,使用您的库的用户可能会寻找适当命名的项目文件
希望这能有所帮助。I如果你想保持心理健康,你应该为每个IDE版本使用一个单独的文件夹,并使用LIBSUFFIX来确定正确的版本。这只适用于输出文件。项目文件本身不能在多个IDE版本之间共享。@RemyLebeau,这就是为什么我建议“每个IDE版本都有一个单独的文件夹”。问题是我没有安装所有的Delphi编译器。如何单独创建项目文件?理想情况下,您应该拥有一个主文件,并从该主文件生成特定于版本的.dproj文件。然后你可以在母版中进行更改,并让它传播