как получить расширение имени (без точки) в MSBuild - PullRequest
2 голосов
/ 11 августа 2010

У меня есть ItemGroup, и я использую ее метаданные в качестве идентификаторов в своем проекте MSBuild для пакетной обработки. Например:

        <BuildStep
          TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
          BuildUri="$(BuildUri)"
          Name="RunUnitTestsStep-%(TestSuite.Filename)-%(TestSuite.Extension)"
          Message=" - Unit Tests: %(TestSuite.Filename): %(TestSuite.Extension)">

          <Output
            TaskParameter="Id"
            PropertyName="RunUnitTestsStepId-%(TestSuite.Filename)-%(TestSuite.Extension)" />
        </BuildStep>

Однако это не будет работать, поскольку в Расширении есть точка, которая является недопустимым символом для идентификатора (в задаче BuildStep). Таким образом, MSBuild всегда терпит неудачу в задаче BuildStep.

Я пытался удалить точку, но безуспешно. Может быть, есть способ добавить некоторые метаданные в существующую ItemGroup? В идеале я хотел бы иметь что-то вроде% (TestSuite.ExtensionWithoutDot). Как мне этого добиться?

1 Ответ

3 голосов
/ 12 августа 2010

Я думаю, вы немного озадачены тем, что здесь делает элемент <Output> - он создаст свойство с именем в значении атрибута PropertyName и установит значение этого свойства какзначение Id , выводимого из задачи BuildStep.Вы не можете влиять на значение Id - вы просто сохраняете его в свойстве для дальнейшего использования, чтобы установить статус шага сборки

. Учитывая это, я не могу понять, почему вы обеспокоенычто созданное свойство будет иметь имя, которое будет включать конкатенацию расширения.Пока имя свойства уникально, вы можете ссылаться на него позже в последующей задаче BuildStep, и я предполагаю, что вашего имени файла testsuite достаточно, чтобы указать уникальность.

Фактически, вы можете избежать создания уникальных свойств, которыеОтслеживайте каждую пару тестов / buildstep, если вы выполнили пакетное задание:

<Target Name="Build"
        Inputs="@(TestSuite)"
        Outputs="%(Identity).Dummy">
    <!--
    Note that even though it looks like we have the entire TestSuite itemgroup here,
    We will only have ONE - ie we will execute this target *foreach* item in the group
    See http://beaucrawford.net/post/MSBuild-Batching.aspx
    -->


    <BuildStep
          TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
          BuildUri="$(BuildUri)"
          Name="RunUnitTestsStep-%(TestSuite.Filename)-%(TestSuite.Extension)"
          Message=" - Unit Tests: %(TestSuite.Filename): %(TestSuite.Extension)">

          <Output
            TaskParameter="Id"
            PropertyName="TestStepId" />
        </BuildStep>

    <!--
    ..Do some stuff here..
    -->

    <BuildStep Condition=" Evaluate Success Condition Here "
           TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
           BuildUri="$(BuildUri)"
           Id="$(TestStepId)"
           Status="Succeeded" />
    <BuildStep Condition=" Evaluate Failed Condition Here "
           TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
           BuildUri="$(BuildUri)"
           Id="$(TestStepId)"
           Status="Failed" />
</Target>
...