Не удается заставить задачу сообщества MSBuild RegexReplace работать - PullRequest
3 голосов
/ 24 августа 2011

Я пытаюсь скопировать группу файлов, имена которых начинаются с префикса DR__, но копии должны быть удалены из этого префикса.То есть DR__foo должно быть скопировано как foo.Я пытаюсь это, что основано на примере, приведенном в документации (. CHM):

<Target Name="CopyAuxiliaryFiles">
    <MakeDir Directories="$(TargetDir)Parameters" Condition="!Exists('$(TargetDir)Parameters')" />
    <ItemGroup>
      <ContextVisionParameterFiles Include="$(SolutionDir)CVParameters\DR__*" />
    </ItemGroup>
    <Message Text="Files to copy and rename: @(ContextVisionParameterFiles)"/>
    <RegexReplace Input="@(ContextVisionParametersFiles)" Expression="DR__" Replacement="">
      <Output ItemName ="DestinationFullPath" TaskParameter="Output" />
    </RegexReplace>
    <Message Text="Renamed Files: @(DestinationFullPath)"/>
    <Copy SourceFiles="@(ContextVisionParameterFiles)" DestinationFiles="@(DestinationFullPath)" />
  </Target>

DestinationFullPath выходит пустым (или это то, что я вижу, когда я отображаю его с Message).Таким образом, Copy терпит неудачу, потому что DestinationFiles не указано.Что здесь не так?

Редактировать : ContextVisionParameterFiles не пустой, он содержит следующее:

D:\SVN.DRA.WorkingCopy\CVParameters\DR__big_bone.alut;D:\SVN.DRA.WorkingCopy\CVParameters\DR__big_medium.gop

На самом деле это 40 файлов, ноЯ обрезал это ради ясности

1 Ответ

2 голосов
/ 24 августа 2011

Понял! Кажется, это была комбинация глупой ошибки и, казалось бы, обязательного параметра. Что касается первого, было две цели под названием CopyAuxiliaryFiles. Что касается второго, то, похоже, параметр Count необходим.

Финальная, рабочая версия:

<Target Name="CopyCvParameters">
    <ItemGroup>
      <CvParamFiles Include="$(SolutionDir)CVParameters\DR__*" />
    </ItemGroup>
    <Message Text="Input:&#xA;@(CvParamFiles, '&#xA;')"/>
    <!-- Replaces first occurance of "foo." with empty string-->
    <RegexReplace Input="@(CvParamFiles)" Expression="^.*DR__" Replacement="$(TargetDir)Parameters\" Count="1">
      <Output ItemName ="RenamedCvParamFiles" TaskParameter="Output" />
    </RegexReplace>
    <Message Text="&#xA;Output RenamedCvParamFiles:&#xA;@(RenamedCvParamFiles, '&#xA;')" />
    <Copy SourceFiles="@(CvParamFiles)" DestinationFiles="@(RenamedCvParamFiles)" SkipUnchangedFiles="True" />
  </Target>

Обратите внимание, что:

  • Я переименовал цель, чтобы устранить конфликт имен (почему Visual Studio не распознает это как ошибку?)
  • Я красиво напечатал ItemGroups с синтаксисом @(CvParamFiles, '&#xA;'), который, кажется, заменяет ; переносами строк
  • Мое регулярное выражение заменяет абсолютный путь и префикс
  • Count="1" теперь передается в RegexReplace
...