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)破坏了构建?我该怎么解决这个问题?

Property函数的奇怪行为

我试过你所做的(向BuildDependsOn添加了一个修剪),它很有效。

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

是否启用msbuild调试?如果不是所有的事情都在这里解释。

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

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

为了删除%3b,您必须取消对字符串的捕获。