始终禁用Delphi XE自定义生成目标

时间:2013-09-02 14:25:20

标签: delphi msbuild delphi-xe

我已经创建了一个自定义的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>语句将被删除。

任何人都知道出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

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

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

除非你有源代码或者愿意修补你不能做到这一点。

如果你真的想要一个灵活的xml方式来构建delphi项目并创建目标,那么尝试想要或想要vnext(我在bitbucket上的fork)

答案 1 :(得分:1)

我将手动包含目标文件,并使用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>

我的.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

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