Включая файлы с каталогом, указанным отдельно в MSBuild - PullRequest
0 голосов
/ 04 марта 2011

Кажется, это должно быть просто, но я не могу понять это из справочника, и мой google-fu явно слабый.

Я просто хочу указать имена файлов и базовую папку отдельно в файле сборки ...

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <TestFilesWithFolder>
      B:\Root\Test1.*;
      B:\Root\Test2.*
    </TestFilesWithFolder>
    <TestFiles>Test1.*;Test2.*</TestFiles>
    <TestFileRoot>B:\Root</TestFileRoot>
  </PropertyGroup>
  <Target Name="Build">
    <ItemGroup>
      <TestFilesGroupWithFolder Include="$(TestFilesWithFolder)" />
      <TestFilesGroup Include="$(TestFileRoot)\$(TestFiles)" />
    </ItemGroup>
    <Warning Text="Source files with folder: @(TestFilesGroupWithFolder)" />
    <Warning Text="Source files: @(TestFilesGroup)" />
  </Target>
</Project>

Когда я запускаю это, первое предупреждение показывает оба файла, как и ожидалось, но второе предупреждение показывает только первый файл (поскольку прямая строка concat ставит имя папки на первом, но не на втором).

Как мне заставить ItemGroup "TestFilesGroup" включить оба файла, обладающих свойствами "TestFiles" и "TestFileRoot"?

1 Ответ

3 голосов
/ 04 марта 2011

Можно преобразовать список вещей, разделенных точкой с запятой, в элемент, что сделало бы это возможным, за исключением того, что элементы в вашем свойстве содержат символы подстановки, поэтому, если вы хотите, чтобы MSBuild рассматривал их как элементы в списке, по адресув тот момент, когда MSBuild впервые увидит его, путь должен быть действительным.Может быть, есть способ сделать это, но я не могу придумать один.Другими словами ...

<ItemGroup>
    <TestFiles Include="$(TestFiles)" />
</ItemGroup>

... работает только в том случае, если $ (TestFiles) содержит разделенный список либо вещей без подстановочных знаков, либо определенных путей, которые действительно существуют.

ДалееMSBuild не может составить путь с подстановочным знаком внутри атрибута Include и одновременно оценить его, поэтому вам понадобится хитрость, чтобы сначала составить полный путь отдельно, а затем передать его в атрибут Include.Следующее будет работать, но оно требует изменения вашего свойства с разделителями в набор элементов.Он группирует зависимую цель в этом списке элементов, при этом каждое выполнение пакетной цели вычисляет мета-значение для одного элемента, которое сохраняется в новом мета-значении.Когда исходная цель выполняется, она может использовать это мета-значение в последующем включении.

<PropertyGroup>
  <TestFilesWithFolder>
    D:\Code\Test1.*;
    D:\Code\Test2.*
  </TestFilesWithFolder>
  <TestFileRoot>D:\Code</TestFileRoot>
</PropertyGroup>
<ItemGroup>
  <TestFilePattern Include="TestFilePattern">
    <Pattern>Test1.*</Pattern>
  </TestFilePattern>
  <TestFilePattern Include="TestFilePattern">
    <Pattern>Test2.*</Pattern>
  </TestFilePattern>
</ItemGroup>
<Target Name="Compose" Outputs="%(TestFilePattern.Pattern)">
  <ItemGroup>
     <TestFilePattern Include="TestFilePattern">
        <ComposedPath>@(TestFilePattern->'$(TestFileRoot)\%(Pattern)')</ComposedPath>
     </TestFilePattern>
  </ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="Compose">
  <ItemGroup>    
    <TestFilesGroupWithFolder Include="$(TestFilesWithFolder)" /> 
  </ItemGroup>
  <Warning Text="Source files with folder: @(TestFilesGroupWithFolder)" />
  <ItemGroup>
    <ComposedTestFiles Include="%(TestFilePattern.ComposedPath)" />   
  </ItemGroup>
  <Warning Text="Source files: @(ComposedTestFiles)" />
</Target>

, которое выдает следующий вывод:

(Build target) ->
d:\Code\My.proj(80,5): warning : Source files with folder:
   D:\Code\Test1.txt;D:\Code\Test2.txt
d:\Code\My.proj(84,5): warning : Source files:
   D:\Code\Test1.txt;D:\Code\Test2.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...