1

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

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

<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

可能是分号 (; <=> %3b) 破坏了构建?我怎样才能解决这个问题?

4

1 回答 1

4

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

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

您是否为 msbuild 启用了调试?如果没有在这里解释一切。

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

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

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

于 2012-04-05T07:32:56.287 回答