Delphi XE 自定义生成目标始终处于禁用状态

我已经创建了一个自定义 MSBuild .targets文件,我已经通过 IDE 将其包含在 Delphi XE 项目中,并从 Project Manager 的上下文菜单中启用了它。尽管该文件有效,但在重新保存项目文件后,它总是被禁用。

下面是目标文件的简化版本,名为 Custom.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Hello">
<Message Text="Hello from custom target"/>
</Target>
</Project>

作为一个独立文件,它的工作方式与预期的一样: 键入..。

MSBuild Custom.target /t:Hello

... 在命令行发出预期的消息。

通过 IDE 将 Custom.targets添加到 Delphi 项目中,按照预期在 Project Manager 中显示该文件,并且 .dproj文件现在包含以下行..。

<TargetsFile Include="Custom.targets"/>

我在 IDE 的项目管理器中右键单击该文件并选择了 Enable。但是,当项目建立时,Build消息窗口显示:

[ MSBuild 警告] Custom.target (1) : 忽略禁用的导入: PathToProjectSource\\Custom.targets

在 ProjectManager 中再次右键单击仍然显示 Enable选项,而不是预期的 Disable选项。

在命令行 MSBuild ProjectName.dproj /t:Hello也失败。

我试过黑进 .dproj文件,添加一行..。

<Import Project="Custom.targets"/>

输入 MSBuild ProjectName.dproj /t:Hello现在可以工作了。但是下次我从 IDE 中保存项目文件时,<Import>语句将被删除。

有人知道出了什么问题吗?

3327 次浏览

Delphi 生成整个 dproj 内容本身,并且这个自定义导入将始终被删除。

您可以编写自己的 msbuild xml 文件,但是 dproj 属于 Delphi。

除非你有源代码或愿意猴子补丁的想法,你不能这样做。

如果您真的想要一种灵活的 xml 方式来构建 delphi 项目和创建目标,那么可以尝试使用 want 或 want vnext (my fork on bitbucket)

我会手动包含目标文件,并在外部使用 MSBuild 而不是 IDE 进行构建,因为在从 IDE 编译时,要知道应用了哪个配置和目标有点麻烦(是否在项目上单击了这个配置和目标?还是激活目标的那个?您不会得到启用自定义目标的任何视觉提示)。

我通常在 Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"之前做,这样它们就不会显示在 IDE 上(它们存在,但是对于开发人员来说是隐藏的)。

例如,我的 Delphi XE4项目的结尾是:

    <Import Project="..\BuildServer.Targets"/>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>

我的。Target 文件定义了一个带条件的自定义“ PropertyGroup”和“ Target”,因此它们只在从 MSBuild 调用时应用:

  <PropertyGroup  Condition="'$(Config)'=='CustomConfig'">
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
...
</PropertyGroup>
<Target Name="DisplayProjectInfo">
<Message Text="Project File Name = $(MSBuildProjectFile)"/>
<Message Text="Version = $(VerInfo_Keys)"/>
<Message Text="OutputDir = $(DCC_ExeOutput)"/>
</Target>
<Target Name="CustomTarget" Condition="'$(Config)'=='CustomConfig'">
<MSBuild Projects="$(MSBuildProjectFile)" Targets="Clean" />
<MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" />
<CallTarget Targets="DisplayProjectInfo"/>
</Target>

然后用以下方法编译:

msbuild /t:CustomTarget /p:config=CustomConfig poject.dproj

使用这种方法可以自定义构建目标,以确保每个应用程序都获得正确的设置,而不会受到任何人所做更改的影响。