我有一个启动 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 文件
在“项目选项”中,我将“单元输出目录”设置为“测试”,MS Build 可以识别这一点。
然后我将其设置为
$(Config)\$(Config)
并且它也可以工作。我还尝试了 MS Build 是否可以解析 DProj 文件中的其他字段。我尝试了 map 文件(0 和 3)并且它有效。
结论:问题仅出在 $(ProductVersion) 变量上,该变量无法识别。
脚本
在我的脚本中,我尝试使用
/p:DCC_DcuOutput="Test"
,它有效,但是/p:DCC_DcuOutput="$(ProductVersion)\$( Platform)\$(Config)"
将不起作用。它不会解析$()
变量。它将创建完全相同的文件夹:“$(ProductVersion)”。这也不起作用:
/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_MapFile、DCC_Hints 和 DCC_Warnings .
我还没有尝试过这个,但也许你可以对DCC_DcuOutput做同样的事情。
关于delphi - 如何让MSBuild从DProj文件中获取DCU输出路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77820307/