2010-08-10 10 views
5

Voglio utilizzare MSBuild per afferrare e creare gli elementi pertinenti per 2 file. Se fosse solo un singolo file con estensione, vorrei utilizzare:MSBuild: Come includere sia "* .xaml" che "* .cs" nella build di Silverlight?

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

In un file csproj per una build di Silverlight, ogni UserControl è impostato come con esso la propria <Compile> elemento e un elemento figlio <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> 

nel file MSBuild, vorrei precisare:

afferrare tutti i file .cs e mettere quelli del Include attributo e ottenere lo stesso nome file - meno lo .cs e inserirlo nell'elemento <DependentUpon>.

In modo che sarebbe solo qualcosa di simile (pseudo) per abbinare le coppie di file:

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

Esiste un modo per fare mettere quanto sopra in MSBuild?

risposta

4

MSBuild ha due proprietà di metadati separate denominate %(Filename) (che è il nome file senza estensione) e %(Extension) che sarebbe il ".cs" nell'esempio. Quindi, mi chiedo se questo è possibile:

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

Ma, non credo che sarà come quello che è gonna do o anche fare quello che vuoi che faccia.

Dovresti sempre avere solo oggetti di tipo "glob" (* .cs) all'interno di un target - non dovresti dichiararlo come gruppo di articoli di livello superiore, altrimenti farà cose divertenti in Visual Studio e (per esempio) aggiungerà tutti i file .cs al controllo della versione e forse addirittura espanderà * .cs in singoli elementi del progetto.

Ecco cosa vorrei suggerire in un non progetto di Visual Studio msbuild:

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

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

Se stavi facendo questo all'interno di un progetto di VS, allora è Tricker - cos si desidera aggiungere metadati ad un già esistente ItemGroup per forzare l'associazione dependentUpon prima compilazione:

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

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

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

Anche se, io sto scrivendo questo senza in realtà testando le mie affermazioni in modo YMMV ...

+0

Grazie Peter, mi divertirò con questo e vedrò se riesco a farlo funzionare. –

2

In MsBuild si può fare come di seguito:

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

E 'questo ciò che si desidera o sono lontano dalla tua domanda?

+0

Grazie Malcolm, vedrò se riesco a farlo funzionare. –

Problemi correlati