2010-08-10 2 views
5

Я хочу использовать MSBuild для захвата и создания релевантных элементов для 2-х файлов. Если бы это был только один файл с расширением, я хотел бы использовать:MSBuild: Как включить «* .xaml» и «* .cs» в сборке Silverlight?

<ItemGroup> 
    <Compile Include="\Pages\*.cs" /> 
</ItemGroup> 

В файле .csproj для Silverlight сборки, каждый UserControl устанавливается как с собственным <Compile> элементом и ребенок <DependentUpon> элемент:

<ItemGroup> 
    <Compile Include="Pages\SilverlightControl1.xaml.cs"> 
     <DependentUpon>SilverlightControl1.xaml</DependentUpon> 
    </Compile> 
    <Compile Include="Pages\SilverlightControl2.xaml.cs"> 
     <DependentUpon>SilverlightControl2.xaml</DependentUpon> 
    </Compile> 
</ItemGroup> 

в файле MSBuild, я хотел бы уточнить:

захватить все .cs файлы и поставить те, в Include и получите одно и то же имя файла - минус .cs и поместите его в элемент <DependentUpon>.

Так что это просто что-то вроде (псевдо), чтобы соответствовать пары файлов:

<ItemGroup> 
    <Compile Include="Pages\*.cs"> 
     <DependentUpon>Pages\*.xaml</DependentUpon> 
    </Compile> 
</ItemGroup> 

Есть ли способ сделать поставить выше в MSBuild?

ответ

4

MSBuild имеет два отдельных свойства метаданных: %(Filename) (который является именем файла без расширения) и %(Extension), который будет «.cs» в вашем примере. Итак, мне интересно, если это возможно:

<ItemGroup> 
    <Compile Include="Pages\*.cs"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </Compile> 
</ItemGroup> 

Но, я не думаю, что вам понравится то, что он собирается делать или даже делать то, что вы хотите, чтобы это сделать.

Вы действительно должны иметь предметы типа «glob» (* .cs) в пределах цель - вы не должны объявлять ее как группу элементов верхнего уровня, иначе она будет делать забавные вещи в визуальной студии и (для пример) добавит все файлы .cs в управление версиями и, возможно, даже расширит * .cs на отдельные элементы в вашем проекте.

Вот что я хотел бы предложить в NON проекта Visual Studio MSBuild:

<Target Name="PrepareCompileItems"> 
    <XamlFiles Include="Pages\*.cs"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </XamlFiles> 

    <Compile Include="@(XamlFiles)" /> 
</Target> 

Если вы делали это в рамках проекта VS, то это Tricker - потому вы хотите добавить метаданные к уже существующему ItemGroup заставить ассоциацию dependentUpon перед тем компиляцией:

<Target Name="AddDependentUponMetadata"> 
    <CsFiles Include="Pages\*.cs" /> 

    <XamlFiles Include="@(CsFiles)"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </XamlFiles> 

    <Compile Remove="@(CsFiles)" />  
    <Compile Include="@(XamlFiles)" /> 
</Target> 

Хотя, я печатаю это фактически не испытывая мои утверждения так YMMV ...

+0

Спасибо, Питер, я буду играть с этим и посмотреть, смогу ли я заставить его работать. –

2

В MSBuild вы можете сделать как ниже:

<ItemGroup> 
     <ClassFiles Include="**\*.cs"/> 
     <XamlFiles Include="**\*.xaml"/> 
     <Compile Include="@(ClassFiles)" > 
      <DependentUpon>"@(XamlFiles)"</DependentUpon> 
     </Compile> 
    </ItemGroup> 

Является ли это то, что вы хотите, или я нахожусь далеко от вашего вопроса?

+0

Спасибо Малкольму, я посмотрю, смогу ли я заставить это работать. –

Смежные вопросы