我有一个 Delphi 11.2 项目,可以在 Delphi 中正常构建,但在命令行上失败。
简而言之,通过 IDE 构建时使用的 MSBuild 版本与通过
Rad Studio Command Prompt
构建时似乎不同。
这很容易重新创建。只需创建一个新的 Delphi 11.2 Windows VCL 项目,仅使用一个空表单以保持简单。然后右键单击
Projects View
中的项目并选择Add New->Other
菜单选项。在 New Items
窗口类型 Target
的搜索编辑中,将左侧的树视图放到左侧并选择 MSBuild Targets File
。这会将新的 MSBuild Targets 文件添加到项目中。右键单击这个新文件并选择 Enable
。
现在编辑新的 Targets 文件,如下所示:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="MyNewTarget">
<Target Name="MyNewTarget" BeforeTargets="Build;Make">
<Message Text="MSBuildToolsPath: $(MSBuildToolsPath)" Importance="High"/>
<Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)" Importance="High"/>
<Message Text="MSBuildBinPath: $(MSBuildBinPath)" Importance="High"/>
<Exec Command="echo MyOutput" ConsoleToMSBuild="true" StandardOutputImportance="low">
<Output TaskParameter="ConsoleOutput" PropertyName="MyProperty"/>
</Exec>
<Message Text="MyProperty: $(MyProperty)" Importance="High"/>
</Target>
</Project>
我为各种 MSBuild 变量添加了消息输出,这样我就可以将 Delphi 中发生的情况与通过
Rad Studio Command Prompt
发生的情况进行比较。
构建项目并检查
Output pane
。您应该看到类似于以下内容的消息:
MSBuildTools路径:C:\Windows\Microsoft.NET\Framework 4.0.30319
MSBuildTools版本:2.0
MSBuildBinPath:C:\ Windows \ Microsoft.NET \ Framework 4.0.30319
注意这里框架显示为 v4.0 并且项目构建成功。
现在尝试通过
Rad Studio Command Prompt
进行构建。将文件夹更改为您的项目文件夹,然后只需键入 msbuild Project1.dproj
。显然将名称更改为您的项目名称。
您会注意到这将失败并显示以下消息:
Target1.targets(7,35):错误MSB4064:“ConsoleToMSBuild”参数 “Exec”任务不支持。验证该参数存在于 任务,它是一个可设置的公共实例属性。
此外,如果您查看我从目标输出的消息,您将看到以下内容:
MSBuildTools路径:C:\Windows\Microsoft.NET\Framework 2.0.50727
MSBuildTools版本:2.0
MSBuildBinPath:C:\ Windows \ Microsoft.NET \ Framework 2.0.50727
注意
MSBuildBinPath
和 MSBuildToolsPath
显示为 v2.0,而 IDE 中构建的输出显示为 v4.0。
我使用
<Exec Command="echo MyOutput" ConsoleToMSBuild="true" StandardOutputImportance="low">
命令(这是通过命令行失败的原因)的原因是为了获取 GIT 提交哈希。除了这个特定的命令之外,我的真实项目在属性中包含所有版本控制信息,可以通过我们的 CI 服务器轻松覆盖这些信息。
有人知道为什么/如何通过 Delphi IDE 构建使用 v4.0,而通过
Rad Studio Command Prompt
构建则使用 v2.0?
我发现可以通过使用
msbuild Project1.dproj /tv:4.0
在命令行上指定工具版本来强制命令提示符使用 MSBuild 工具版本 4.0。
但是,我真的不想这样做,因为这意味着任何检查代码并通过命令行构建的人(包括我们的 CI 服务器)都必须记住指定工具版本。
我发现的另一种方法是,我可以在 Delphi 主项目文件(本例中为 Project1.dproj)中指定工具版本,方法是修改第一行如下
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
,请注意显式 ToolsVersion="4.0"
的使用。
再次,我真的不想在 Delphi 项目中明确指定工具版本 - 我已经看到很多很多次 Delphi 自动更改 dproj 文件,因此如果不需要的话我宁愿不修改它,在如果我的编辑被自动删除。
非常感谢任何帮助/想法。
我不使用 RAD Studio 命令提示符或调整 .dproj 文件中的参数。然而,当我刚刚尝试从命令提示符(Delphi 11.3)进行构建时,它按预期工作,并且我得到了正确的 MSBuild 版本。我不确定为什么你的没有。
根据文档,Delphi 使用一些环境变量。我创建了一个简单的构建脚本,该脚本调用 rsvars.bat 并在调用 MSBuild 之前设置这些脚本。例如:
@echo off
setlocal
call "C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\rsvars.bat"
msbuild "MyProject.dproj" /target:Build /p:Config=Debug /p:Platform=Win64
endlocal
echo.
pause