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


177

我已经.targets通过IDE 创建了一个自定义MSBuild 文件,该文件已包含在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

...在命令行中给出了预期的消息。

Custom.targets通过IDE 添加到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>语句将被删除。

任何人都知道发生了什么事吗?


10
在从命令行使用msbuild的示例中,您显示Custom.target,而其他所有地方都使用Custom.targets。哪有
肯尼斯·科克伦

4
好地方-尽管经常盯着代码,但我没有注意到。我几天都无法进入装有Delphi的机器(在医院!),但是我会尽可能使用“ target”或“ targets”尝试代码。
delphidabbler 2014年

6
不是Delphi用户,但根据此, 所有.targets文件必须包含没有错误的有效MSBuild脚本。如果该文件有任何错误,则会通知您,并且如果项目引用了无效的.targets文件,则该文件将被禁用,并且在纠正错误之前无法重新启用。可能值得仔细检查所有内容是否正确,因为这可以解释您得到的症状。
Daniel Morritt

不幸的是,在XE7中,我无法重现您的问题,一切似乎都按预期进行:从命令行提示符/t:Hello以及从IDE中进行构建,并在Project Manager-Targets-Hello中单击鼠标右键。我已经Custom.targets通过右键单击“项目管理器”-“添加”-(已浏览该文件)将其添加到项目中。该路径与.dproj文件位于同一目录。
Ondrej Kelle 2015年

Answers:


1

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

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

除非您有源代码或不愿意打补丁,否则您将无法做到。

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


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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.