2015-09-21 7 views
7

Ho il seguente set up (XML poco interessante rimossa per brevità):Scegliete la posizione del file ItemGroup generati in una destinazione tramite una task

MyProject.fsproj

<Project ...> 
    <Import Project="MyTask.props" /> 
    ... 
    <ItemGroup> 
    <Compile Include="Program.fs" /> 
    </ItemGroup> 
</Project> 

MyTask.props

<Project ...> 
    <UsingTask XXX.UpdateAssemblyInfo /> 
    <Target Name="UpdateAssemblyInfo" 
      BeforeTargets="CoreCompile"> 
    <UpdateAssemblyInfo ...> 
     <Output 
     TaskParameter="AssemblyInfoTempFilePath" 
     PropertyName="AssemblyInfoTempFilePath" /> 
    </UpdateAssemblyInfo> 

    <ItemGroup> 
     <Compile Include="$(AssemblyInfoTempFilePath)" /> 
    </ItemGroup> 
    </Target> 
</Project> 

il problema è che l'ItemGroup aggiunto da MyTask.props si aggiunge scorso, pur essendo importato proprio proprio all'inizio del pro Ject. Presumo che ciò sia dovuto al fatto che l'ItemGroup non viene effettivamente importato, quindi viene aggiunto da quando viene eseguita l'attività.

Questa non è una buona cosa in F #, dato che l'ordine dei file è importante - incluso il file alla fine della lista di costruzione significa che è impossibile creare un EXE, ad esempio (come il punto di accesso deve essere nell'ultimo file).

Da qui la mia domanda: c'è un modo per me di generare un ItemGroup come parte di un Target e avere quel Gruppo Oggetti generato essere il primo?

risposta

1

Un po 'tardi, ma questo può aiutare qualcuno in futuro, non sto usando il tag di importazione su questo campione, ma funzionerà allo stesso modo, la parte importante è il target "UpdateAssemblyInfo", l'idea principale è quello di cancellare e rigenerare il Gruppo Oggetti Compilare usando l'ordinamento appropriato.

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <Compile Include="Program.cs" /> 
    <Compile Include="Properties\AssemblyInfo.cs" /> 
    </ItemGroup> 

    <Target Name="Build" DependsOnTargets="UpdateAssemblyInfo"> 

    </Target> 

    <Target Name="UpdateAssemblyInfo"> 
    <!-- Generate your property --> 
    <PropertyGroup> 
     <AssemblyInfoTempFilePath>ABC.xyz</AssemblyInfoTempFilePath> 
    </PropertyGroup> 

    <!-- Copy current Compile ItemGroup to TempCompile --> 
    <ItemGroup> 
     <TempCompile Include="@(Compile)"></TempCompile> 
    </ItemGroup> 

    <!-- Clear the Compile ItemGroup--> 
    <ItemGroup> 
     <Compile Remove="@(Compile)"/> 
    </ItemGroup> 

    <!-- Create the new Compile ItemGroup using the required order -->  
    <ItemGroup> 
     <Compile Include="$(AssemblyInfoTempFilePath)"/> 
     <Compile Include="@(TempCompile)"/> 
    </ItemGroup> 

    <!-- Display the Compile ItemGroup ordered --> 
    <Message Text="Compile %(Compile.Identity)"/> 
    </Target> 
</Project>