delphi - 如何让MSBuild从DProj文件中获取DCU输出路径?

标签 delphi msbuild delphi-11-alexandria

我有一个启动 msbuild 并编译一堆库的脚本。这是其中之一的测试脚本:

CALL _whereIsDelphi.cmd Alex
CALL "%DelphiPath%\bin\rsvars.bat"
msbuild "c:\source\TOOLS\Lib1\Lib1.dproj" /t:Build /p:DCC_BuildAllUnits=true /p:Configuration=Release /p:platform=Win32 

PS:最后,我想将整个 .ProjGroup 文件传递​​给脚本,而不是仅一个 .dropj 文件。


但是我的输出文件夹有问题。即使 .dproj 文件是这样的:

<PropertyGroup Condition="'$(Base)'!=''">
<DCC_BplOutput>.\$(ProductVersion)\$(Platform)\$(Config)</DCC_BplOutput>
<DCC_DcpOutput>.\$(ProductVersion)\$(Platform)\$(Config)</DCC_DcpOutput>
<DCC_DcuOutput>.\$(ProductVersion)\$(Platform)\$(Config)</DCC_DcuOutput>

输出(DCU)转到:

c:\source\TOOLS\Lib1\Win32\Release 

而不是预期的:

c:\source\TOOLS\Lib1\22.0\Win32\Release

知道如何将要创建的输出(DCU)放入正确的文件夹中吗?


请注意,尽管大多数库都使用 $(ProductVersion)$(Platform)$(Config) 格式进行输出,但其中一些库并不这样做。这就是为什么我不能使用硬编码的输出路径。我真的很想使用 $(ProductVersion) 因为这样我就可以并行运行 Delphi 10、11、12 的库。


更新:

实验:

DPROJ 文件

  1. 在“项目选项”中,我将“单元输出目录”设置为“测试”,MS Build 可以识别这一点。

  2. 然后我将其设置为 $(Config)\$(Config) 并且它也可以工作。

  3. 我还尝试了 MS Build 是否可以解析 DProj 文件中的其他字段。我尝试了 map 文件(0 和 3)并且它有效。

结论:问题仅出在 $(ProductVersion) 变量上,该变量无法识别。

脚本

  1. 在我的脚本中,我尝试使用 /p:DCC_DcuOutput="Test",它有效,但是 /p:DCC_DcuOutput="$(ProductVersion)\$( Platform)\$(Config)" 将不起作用。它不会解析 $() 变量。它将创建完全相同的文件夹:“$(ProductVersion)”。

  2. 这也不起作用:/p:DCC_DcuOutput="$(ProductVersion)\出错:无法创建输出文件“$\DebugForm.dcu”`

结论:问题出在所有 $() 变量上。没有一个被识别。

但是,即使脚本能够解析 $() 变量,此解决方案仍然无法实现我的最终目标:传递给 MS Build 一个 ProjGroup 文件,因为那里不再涉及脚本。 MS Build 一次性遍历整个 ProjGroup。

而且我真的不想通过项目组文件和脚本进行编译,因为两者会在某一时刻失去同步!无论我们在小组中做什么改变,都必须进入脚本。

最佳答案

我遇到了类似的问题,无论项目如何配置,我都希望生成 map 文件。我发现我可以这样做:

MSBuild.exe myproject.dproj/t:Build/p:platform=Win64/p:Configuration=Debug/p:DCC_MapFile=3;DCC_Hints=false;DCC_Warnings=false

我使用 /p 命令行参数专门设置了这些属性:DCC_MapFileDCC_HintsDCC_Warnings .

我还没有尝试过这个,但也许你可以对DCC_DcuOutput做同样的事情。

关于delphi - 如何让MSBuild从DProj文件中获取DCU输出路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77820307/

相关文章:

delphi - 如何在不打开菜单的情况下在MouseOver上显示一级TMainMenu项的提示?

listview - 检查当前是否在 Delphi VCL TListView 中显示编辑

delphi - 从 LocalSystem 服务运行非可视化 GUI 应用程序

delphi - 我应该如何在Virtual TreeView中更新节点?

string - Delphi 翻译字符串

visual-studio-2010 - 使用解决方案的配置名称作为MSBuild Target的测试条件

当 maxcpucount 大于 1 时,MSBUILD 失败并显示 "The process cannot access the file xxxxx because it is being used by another process."

visual-studio - 为什么我的 TeamCity 构建失败,即使 MSBuild 没有错误?

delphi - 在文件打开对话框中包含多选选项