177

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

这是目标文件的简化版本,名为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 项目会按预期在项目管理器中显示该文件,并且该.dproj文件现在包含以下行...

<TargetsFile Include="Custom.targets"/>

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

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

在项目管理器中再次右键单击仍然显示Enable选项而不是预期的Disable.

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

我已经尝试破解.dproj文件以添加该行...

<Import Project="Custom.targets"/>

打字MSBuild ProjectName.dproj /t:Hello现在有效。但是下次我从 IDE 保存项目文件时,该<Import>语句将被删除。

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

4

2 回答 2

1

我将手动包含目标文件并使用 MSBuild 而不是从 IDE 进行外部构建,因为从 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>

我的 .targets 文件定义了带有条件的自定义“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

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

于 2018-07-24T16:05:32.937 回答
1

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

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

除非您有源代码或愿意修补 ide,否则您无法做到这一点。

如果您真的想要一种灵活的 xml 方式来构建 delphi 项目并创建大量目标,请尝试想要或想要 vnext(我在 bitbucket 上的叉子)

于 2015-11-26T23:42:19.510 回答