Property函数的奇怪行为
本文关键字:函数 Property | 更新日期: 2023-09-27 18:30:09
我正在定制我的构建过程,我遇到了一个有趣的行为。当使用字符串属性函数并更改某些字符串时,构建开始中断。
例如,我正在尝试这样做:
<PropertyGroup>
<BuildDependsOn>$(BuildDependsOn.Replace(";MyTarget", ""))</BuildDependsOn>
</PropertyGroup>
MyTarget是我要从BuildDependsOn属性中删除的自定义目标。当我尝试这样做时,字符串似乎被正确地删除了,但我得到了目标不存在的错误(这种情况在Visual Studio 2010和命令行MSBuild中都会发生)。
错误如下:
The target "EntityDeploy;
BeforeBuild;
CoreBuild;
AfterBuild" does not exist in the project.
我认为,一旦我修改了这个属性,MSBuild就会停止解析它的值,并试图寻找一个名为的目标(包括空格、回车和换行)
"EntityDeploy;
BeforeBuild;
CoreBuild;
AfterBuild"
并且抛出这样的目标不存在的错误。
我也尝试过执行一些更琐碎的事情来了解更多关于这个问题的信息,我尝试过执行以下操作:
<PropertyGroup>
<BuildDependsOn>$(BuildDependsOn.Trim())</BuildDependsOn>
</PropertyGroup>
Trim()
函数也再次出现错误。知道吗?
编辑:我试图调试并找出问题,但我遇到了以下问题:在执行Trim()
方法之前检查属性BuildDependsOn
时,其值如下所示:
Value "BuildDependsOn"="'r'n EntityDeploy;'r'n 'r'n BeforeBuild;'r'n CoreBuild;'r'n AfterBuild'r'n 'r'n "
EvaluatedValue "'r'n EntityDeploy;'r'n 'r'n BeforeBuild;'r'n CoreBuild;'r'n AfterBuild'r'n 'r'n " string
escapedValue "'r'n EntityDeploy;'r'n 'r'n BeforeBuild;'r'n CoreBuild;'r'n AfterBuild'r'n 'r'n " string
在Trim()
方法之后,属性值如下所示:
Value "BuildDependsOn"="EntityDeploy%3b'r'n 'r'n BeforeBuild%3b'r'n CoreBuild%3b'r'n AfterBuild"
EvaluatedValue "EntityDeploy;'r'n 'r'n BeforeBuild;'r'n CoreBuild;'r'n AfterBuild" string
escapedValue "EntityDeploy%3b'r'n 'r'n BeforeBuild%3b'r'n CoreBuild%3b'r'n AfterBuild" string
可能是分号(;<=>%3b)破坏了构建?我该怎么解决这个问题?
我试过你所做的(向BuildDependsOn添加了一个修剪),它很有效。
<BuildDependsOn>
ConfigBeforeBuild;
$(BuildDependsOn.Trim());
ConfigAfterBuild
</BuildDependsOn>
是否启用msbuild调试?如果不是所有的事情都在这里解释。
好吧,这是解决方案(我的也不起作用,我的测试不正确):
<BuildDependsOn>
$([MSBuild]::Unescape($(BuildDependsOn.Replace(";MyTarget", ""))))
</BuildDependsOn>
为了删除%3b,您必须取消对字符串的捕获。