2012-04-05 2 views
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(). Любая идея?

EDIT: Я пытался отладки и выяснить проблему, и я пришел через это: При проверке свойства 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) нарушают сборку? Как я могу это исправить?

+0

Возможно, эти ссылки могут вам помочь: http: //stackoverflow.com/questions/5103026/in-msbuild-can-i-use-the-string-replace-function-on-a-metadata-item, и этот тоже http://msdn.microsoft.com/en-us/library/ms171458(v=vs.100).aspx – lnu

+0

Я знаю этот OOB, но вы не можете сделать идиоматическую статью msbuild и определить одну группу свойств с помощью target и one out out, а затем использовать конфигурацию, чтобы выбрать, какой из них включен? –

+0

@RitchMelton В обычных случаях я мог бы ... Фактически, я опубликовал упрощенную версию проблемы, которая у меня есть. Дело в том, что когда я включаю сторонний файл .Targets, сторонняя цель автоматически добавляется к свойству BuildDependsOn. Я хочу удалить его из этого свойства (чтобы он не запускался когда-либо, когда был построен проект) и решить в другом условии, должна ли цель выполняться. –

ответ

4

Я попробовал то, что вы сделали (добавив отделку BuildDependsOn), и он работает.

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

Включена ли отладка для msbuild? если не все объяснено here.

Хорошо, вот решение (у меня не работает, либо, мой тест не был правильно):

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

Вы должны вашу строку экранирования в для того, чтобы удалить% 3b.

+0

Теперь это действительно странно, в моей среде, которая определенно не работает ... Я обновил вопрос с некоторыми результатами, которые я обнаружил во время отладки ... Кажется, что точки с запятой каким-то образом разрушают сборку, по крайней мере, это то, что у меня есть узнал как единственную разницу ... –

+0

Спасибо, сейчас работает, Unescape отлично работает ... –

+0

Спасибо - я боролся с этой точной проблемой часами! –

Смежные вопросы