我正在研究构建过程的自定义,并且我遇到了一个有趣的行为。当使用字符串属性函数并更改某些字符串时,构建开始中断。
例如,我正在尝试做这件事:
<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()
函数中。
有什么想法吗?
编辑:我试图调试并找出问题,我遇到过这个问题:
在执行BuildDependsOn
方法之前检查属性Trim()
时,其值如下所示:
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
可能是分号(;&lt; =&gt;%3b)打破了构建?我该如何解决这个问题?
答案 0 :(得分:4)
我尝试了你做的事情(为BuildDependsOn添加一个修剪)并且它正在工作。
<BuildDependsOn>
ConfigBeforeBuild;
$(BuildDependsOn.Trim());
ConfigAfterBuild
</BuildDependsOn>
您是否为msbuild启用了调试功能?如果不是,所有内容都会被解释here。
好的,这是解决方案(我的工作也没有,我的测试不正确):
<BuildDependsOn>
$([MSBuild]::Unescape($(BuildDependsOn.Replace(";MyTarget", ""))))
</BuildDependsOn>
您必须取消对字符串的删除才能删除%3b。