2015-09-21 9 views
7

Ich habe folgende Komponenten eingerichtet (uninteressant XML entfernt der Kürze halber):Wählen Sie Position ItemGroup Dateien in einem Ziel über eine Aufgabe erzeugt

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> 

das Problem ist, dass die ItemGroup von MyTask.props hinzugefügt wird letzte hinzugefügt, trotz gleich zu Beginn des pro importiert ject. Ich nehme an, dass dies daran liegt, dass die ItemGroup tatsächlich nicht importiert wird - sie wird hinzugefügt, wenn die Aufgabe ausgeführt wird.

Das ist in F # nicht gut, da die Dateireihenfolge wichtig ist - die Datei am Ende der Build-Liste bedeutet, dass es beispielsweise unmöglich ist, eine EXE zu erstellen (da der Einstiegspunkt in der letzten Datei sein muss)).

Daher meine Frage - gibt es eine Möglichkeit für mich, eine ItemGroup als Teil eines Ziels auszugeben und diese generierte ItemGroup an erster Stelle zu haben?

Antwort

1

Ein bisschen spät, aber das kann jemand in der Zukunft helfen, ich verwende nicht das Import-Tag für dieses Beispiel, aber es wird auf die gleiche Weise funktionieren, der wichtige Teil ist das "UpdateAssemblyInfo" Ziel, die Hauptidee besteht darin, die Compile ItemGroup mit der entsprechenden Sortierreihenfolge zu löschen und neu zu generieren.

<?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>