我已经创建了一个自定义的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>
语句将被删除。
任何人都知道出了什么问题吗?
答案 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
使用这种方法,您可以自定义构建目标,以确保每个应用程序都获得正确的设置,而不受任何人所做更改的影响。