2010-08-10 7 views
5

Quiero usar MSBuild para tomar y crear los elementos relevantes para 2 archivos. Si fuera sólo una única extensión de archivo, usaría:MSBuild: ¿Cómo incluir ambos "* .xaml" y "* .cs" en la compilación de Silverlight?

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

En un archivo .csproj por una acumulación de Silverlight, cada control de usuario se establece como con su propio <Compile> elemento y un elemento secundario <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> 

en el archivo de MSBuild, me gustaría especificar:

agarrar todos los archivos .cs y poner los de la Include atributo y obtener el mismo nombre de archivo - menos el .cs y ponerlo en el elemento <DependentUpon>.

Así que sólo sería algo así como (pseudo) para que coincida con los pares de archivos:

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

¿Hay una manera de hacerlo poner lo anterior en MSBuild?

Respuesta

4

MSBuild tiene dos propiedades de metadatos separadas llamadas %(Filename) (que es el nombre del archivo sin la extensión) y %(Extension) que serían los ".cs" en su ejemplo. Por lo tanto, me pregunto si esto es posible:

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

Pero, no creo que le va a gustar lo que va a hacer o incluso hacer lo que quieres que haga.

que realmente debe sólo tenga elementos "glob" tipo (* cs) dentro un objetivo - no se debe declarar como un grupo de artículos de alto nivel, de lo contrario, hacer cosas divertidas en el estudio visual y (para ejemplo) agregará todos los archivos .cs al control de versiones y tal vez incluso expanda los * .cs en elementos individuales en su proyecto.

Esto es lo que sugeriría en un proyecto de estudio msbuild Visual NO:

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

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

si estuviera haciendo esto dentro de un proyecto de VS, entonces es Tricker - cos desea añadir metadatos a una ya existente ItemGroup para forzar la asociación dependentUpon antes de compilación:

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

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

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

Aunque, estoy escribiendo esto sin llegar a probar mis afirmaciones por lo que tu caso es distinto ...

+0

Gracias Peter, jugaré con esto y veré si puedo hacer que funcione. –

2

En MSBUILD usted puede hacer como el siguiente:

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

¿Es esto lo que quiere o estoy lejos de su pregunta?

+0

Gracias Malcolm, veré si puedo hacer que esto funcione. –

Cuestiones relacionadas