Delphi 11:以编程方式查找MSBuild的正确工具版本

0kjbasz6  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(175)

我们正在从Delphi 10.4升级到 Delphi 11.1。
我们有几个构建和部署Android项目的脚本,它们组合了一个msbuild命令,如下所示:

msbuild someproject.dproj /v:q   /p:Platform=Android /t:Build;Deploy  /p:Config=Release /p:BT_BuildType=AppStore

在11.1中,这会抛出一条错误消息:
C:\程序文件(x86)\商场\工作室\22.0\bin\代码齿轮.公用.目标(940,7):错误MSB4036:找不到“XmlPeek”工作。请检查下列项目:1.)项目文件中的任务名称与任务类的名称相同。2.)任务类为“public”,并实现Microsoft.Build.Framework.ITask接口。3.)在项目文件中或在“C:\Windows\Microsoft.NET\Framework\v2.0.50727”目录下的 *.tasks文件中正确声明了任务。[someproject.dproj]
现在,所有构建脚本都使用的C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\rsvars.bat显式设置.NET框架如下:

@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v4.0.30319
@SET FrameworkVersion=v4.5

经过一番研究之后,我想到了在msbuild命令中添加一个toolsversion参数的想法,如下所示,并且成功了:

msbuild someproject.dproj /v:q   /p:Platform=Android /t:Build;Deploy  /p:Config=Release /p:BT_BuildType=AppStore  /toolsversion:4.0

这一切都很好,但我不希望在脚本中硬编码toolsversion数字。
有没有一种方法可以通过编程方式获得 Delphi 在生成构建等时使用的toolsversion的正确值?
我认为仅仅找到安装的最高.NET版本是不够的(即使这样,也必须将其“翻译”为toolsversion)。它必须与 Delphi 正在做的任何事情结合起来(例如,在原始错误消息中引用的CodeGear.Common.Targets文件中)。

avwztpqn

avwztpqn1#

这是 Delphi 11.1中的一个错误,至少有3个错误报告:抗肿瘤药物
您可以将/tv:4.0加入至MSBuild命令列,或将.dproj档案中的第一行修改为:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">
mbzjlibv

mbzjlibv2#

假设已经运行了rsvars.bat

FOR %%v IN ("%frameworkdir%") DO SET "toolsversion=%%~nv"
ECHO msbuild ...blah...  /toolsversion:%toolsversion:~1%

变量frameworkdir将由rsvars.bat设置。for命令解析其值(例如,将C:\Windows\Microsoft.NET\Framework\v4.0.30319当作文件名,并选择v4.0作为“文件名”(元变量%%v~n修饰符[文件名])
然后使用指定给toolsversion的值,从字符1开始(其中第一个字符是“字符0”)
---在注解中提供更多信息

FOR %%v IN ("%frameworkdir%") DO ECHO %%~nxv|FINDSTR /R ".*\..*\.">nul&IF ERRORLEVEL 1 (SET "toolsversion=%%~nxv") ELSE SET "toolsversion=%%~nv"

哦,你们的小信仰:)

相关问题