Property函数的奇怪行为

时间:2012-04-05 06:30:15

标签: c# msbuild

我正在研究构建过程的自定义,并且我遇到了一个有趣的行为。当使用字符串属性函数并更改某些字符串时,构建开始中断。

例如,我正在尝试做这件事:

<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)打破了构建?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

我尝试了你做的事情(为BuildDependsOn添加一个修剪)并且它正在工作。

 <BuildDependsOn>
  ConfigBeforeBuild;
  $(BuildDependsOn.Trim());
  ConfigAfterBuild
</BuildDependsOn>

您是否为msbuild启用了调试功能?如果不是,所有内容都会被解释here

好的,这是解决方案(我的工作也没有,我的测试不正确):

<BuildDependsOn>
  $([MSBuild]::Unescape($(BuildDependsOn.Replace(";MyTarget", ""))))
</BuildDependsOn>   

您必须取消对字符串的删除才能删除%3b。