Как использовать точное значение элемента msbuild "нерасширенное выражение шаблона"

У меня есть следующее содержимое файла MSBuild .proj:

<ItemGroup>
  <Exclude Include="*2.*"></Exclude>
</ItemGroup>

<ItemGroup>
  <!-- I have 3 files in the current directory: File1.cpp, File2.cpp and File3.cpp -->
  <ModuleInclude Include="*.cpp" Exclude="@(Exclude)"></ModuleInclude>

  <!-- I have 3 files in the Subfolder directory: eFile1.h, eFile2.h and eFile3.h -->
  <ModuleInclude Include="Subfolder\*.h" Exclude="@(Exclude->'Subfolder\%(identity)')"></ModuleInclude>
</ItemGroup>

<Target Name="Default">
  <Message Text="ModuleIncludes: %(ModuleInclude.identity)" />
  <Message Text="Excluded Items: @(Exclude)" />
  <Message Text="Excluded Subfolder Items: @(Exclude->'Subfolder\%(identity)')" />
</Target>

Я вижу следующий вывод:

ModuleIncludes: File1.cpp
ModuleIncludes: File3.cpp
ModuleIncludes: Subfolder\eFile1.h
ModuleIncludes: Subfolder\eFile2.h
ModuleIncludes: Subfolder\eFile3.h
Excluded Items: File2.cpp
Excluded Subfolder Items: Subfolder\File2.cpp

Что мне действительно нужно, так это включить следующие файлы подпапок

ModuleIncludes: Subfolder\eFile1.h
ModuleIncludes: Subfolder\eFile3.h

Поэтому исключенные подпапки должны быть:

Excluded Subfolder Items: Subfolder\eFile2.h

Чтобы получить такой вывод, мне нужно выражение

Subfolder\*2.*

Синтаксис, который я использую

@(Exclude->'Subfolder\%(identity)')

не дает мне то, что мне нужно. Какой будет правильный синтаксис? Или это невозможно?

1 ответ

Если вы хотите иметь дело с подстановочными знаками в качестве текста, используйте свойства вместо элементов:

<PropertyGroup>
  <FileExcludes>*2.*</FileExcludes>
</PropertyGroup>
<ItemGroup>
  <ModuleInclude Include="*.cpp" Exclude="$(FileExcludes)"></ModuleInclude>
  <ModuleInclude Include="Subfolder\*.h" Exclude="Subfolder\$(FileExcludes)"></ModuleInclude>
</ItemGroup>

Вы даже можете использовать шаблон исключения, который будет соответствовать независимо от подпапки:

<PropertyGroup>
  <FileExcludes>**\*2.*</FileExcludes>
</PropertyGroup>
<ItemGroup>
  <ModuleInclude Include="*.cpp" Exclude="$(FileExcludes)"></ModuleInclude>
  <ModuleInclude Include="Subfolder\*.h" Exclude="$(FileExcludes)"></ModuleInclude>
</ItemGroup>

Если вам действительно нужно использовать его как список для добавления нелокальных папок, используйте элементы метаданных:

<PropertyGroup>
  <FileExclude Include="2">
    <Pattern>**\*2.*</Pattern>
  </FileExclude>
</PropertyGroup>
<ItemGroup>
  <ModuleInclude Include="*.cpp" Exclude="@(FileExclude)"></ModuleInclude>
  <ModuleInclude Include="..\shared-folder\*.h" Exclude="@(FileExclude->'shared-folder\%(Pattern)')"></ModuleInclude>
</ItemGroup>
Другие вопросы по тегам