MSBuild имеет два отдельных свойства метаданных: %(Filename)
(это имя файла без расширения) и %(Extension)
, которые в вашем примере будут ".cs".Итак, мне интересно, возможно ли это:
<ItemGroup>
<Compile Include="Pages\*.cs">
<DependentUpon>%(Directory)%(Filename)</DependentUpon>
</Compile>
</ItemGroup>
Но я не думаю, что вам понравится то, что он собирается делать, или даже делать то, что вы хотите, чтобы он делал.
У вас действительно должны быть когда-либо только предметы типа "глобус" (* .cs) в пределах цели - вы не должны объявлять ее как группу предметов верхнего уровня, иначе она будет делать забавные вещив Visual Studio и (например) добавит все файлы .cs для контроля версий и, возможно, даже расширит * .cs на отдельные элементы в вашем проекте.
Вот что я хотел бы предложить в проекте MSNbuild NON Visual Studio:
<Target Name="PrepareCompileItems">
<XamlFiles Include="Pages\*.cs">
<DependentUpon>%(Directory)%(Filename)</DependentUpon>
</XamlFiles>
<Compile Include="@(XamlFiles)" />
</Target>
Если вы делали это в проекте VS, то это сложнее - потому что вы хотите добавить метаданные для уже существующей группы элементов, чтобы принудительно установить ассоциацию зависимого бонуса перед компиляцией:
<Target Name="AddDependentUponMetadata">
<CsFiles Include="Pages\*.cs" />
<XamlFiles Include="@(CsFiles)">
<DependentUpon>%(Directory)%(Filename)</DependentUpon>
</XamlFiles>
<Compile Remove="@(CsFiles)" />
<Compile Include="@(XamlFiles)" />
</Target>
Хотя я набираю это без проверки моих утверждений, поэтому YMMV ...