2017-06-29 12 views
2

Die Frage

Ich gehe davon aus, wenn msbuild über ist Quellcodedateien zu kompilieren, erzeugt es eine Liste von Dateien, auf Include und Exclude Regeln des Projektes auf Basis aufzubauen.Gibt es eine .NET Core CLI vor der Build-Aufgabe?

Gibt es eine Möglichkeit, eine Aufgabe auszuführen, bevor die Liste der zu kompilierenden Dateien ausgewertet wird?

Dies ist in der Lage, eine Quellcodedatei zu generieren und es in den Build genommen werden.

Aktuelle Forschung und Studien

Ich bin ein .NET-Core-CLI-Tool machen, die vor dem Build des Projekts ausgeführt werden muss, die er verwendet, weil es (das CLI-Tool) eine Datei erzeugt, hat in den Build aufgenommen werden.

Das Projekt wurde mit dem neuen System .csproj erstellt, nicht das alte project.json.

Zusammen mit meinem .NET Core CLI-Toolprojekt habe ich ein Bibliotheksprojekt zu Testzwecken erstellt.

Wenn ich hinzufügen, das in den .csproj der Test Bibliothek:

<ItemGroup> 
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" /> 
    <!-- here x.x.x is just a placeholder --> 
</ItemGroup> 

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-cli-tool" /> 
</Target> 

dann die Datei vom CLI-Tool generiert wird nicht berücksichtigt bei der Zusammenstellung getroffen werden, wenn es vorher nicht existiert. Das heißt, wenn die Datei existiert, ist es in Ordnung, aber es bedeutet auch, dass der allererste Build (nach einem Clone, Cleanup oder was) immer fehlschlägt.

Ich habe mehrere verschiedene Ziele für BeforeTargets ausprobiert, aber ich konnte keinen Weg finden, es zum Laufen zu bringen. Ich habe versucht, mein Ziel in der InitialTargets der Project-Knoten zu setzen, aber es hat auch nicht funktioniert. Ich habe versucht, die Outputs-Eigenschaft des Knotens Target auf den vom CLI-Tool generierten Dateinamen zu setzen, aber es schlägt fehl.

Die einzige Lösung, die ich arbeitete gefunden ist manuell eine Compile Richtlinie hinzuzufügen, wie folgt:

<ItemGroup> 
    <Compile Include="MyGeneratedFile.cs" /> 
</ItemGroup> 

Diese Lösung ist für den Moment in Ordnung, aber der Dateiname kann auf den CLI-Tool-Optionen basierend ändern und dies würde zwei stellen machen, wo ein Dateiname auf Änderung aktualisiert werden müssten, wie die folgenden:

<ItemGroup> 
    <Compile Include="PATH\TO\CUSTOM_FILENAME_HERE.CS" /> 
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" /> 
</ItemGroup> 

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-cli-tool --output PATH\TO\CUSTOM_FILENAME_HERE.CS" /> 
</Target> 

(siehe CUSTOM_FILENAME_HERE.CS zweimal erscheint)

Ich weiß, dass ich eine Konstante verwenden könnte, wie folgt:

<PropertyGroup> 
    <MyFilename>PATH\TO\CUSTOM_FILENAME_HERE.CS</MyFilename> 
</PropertyGroup> 

<ItemGroup> 
    <Compile Condition="!Exists('$(MyFilename)')" Include="$(MyFilename)" /> 
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" /> 
</ItemGroup> 

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-cli-tool --output $(MyFilename)" /> 
</Target> 

aber ich bin nicht zufrieden mit diesem Ansatz macht es die Dinge viel zu kompliziert für einen Lambda-Anwender zu integrieren, unter der Annahme, dass dies immer noch ein vereinfachte Version, weil das CLI-Tool mehrere andere Optionen annehmen kann, dh andere Variablen haben, bla bla bla.

Ich benutze .NET Core SDK 1.0.1.

Sorry für die langwierige Frage und meine Noobness mit Msbuild.

Vielen Dank im Voraus für Ihre Zeit und Hilfe.




Randbemerkung:dotnet my-cli-tool in Pre-Build-Ereignis aufrufen, wie in:

<PropertyGroup> 
    <PreBuildEvent>dotnet my-cli-tool</PreBuildEvent> 
</PropertyGroup> 

überhaupt nicht arbeiten, erhalte ich folgende Fehlermeldung:

Code: MSB3073 Beschreibung: T Der Befehl "dotnet my-cli-tool" wurde mit Code 1 beendet. Projekt: das Testbibliotheksprojekt, nicht das Tool eins Datei: C: \ Programme (x86) \ Microsoft Visual Studio \ 2017 \ Community \ MSBuild \ 15.0 \ Bin \ Microsoft.Common.CurrentVersion.targets Line: 4935

Obwohl, fein folgende Arbeiten:

<PropertyGroup> 
    <PreBuildEvent>echo meh</PreBuildEvent> 
</PropertyGroup> 

so ist dies kein Fehler mit der Pre Build Ereignisse.

Wie auch immer, das ist eine andere Geschichte, die mich im Moment nicht interessiert.

Antwort

3

Die "Standardelemente", wie das .NET SDK es aufruft, sind Teil der statischen Auswertung der Projektdatei - bevor ein Ziel ausgeführt wird. Sie benötigen also ein Ziel, das ausgeführt wird, bevor die @(Compile) Elemente benötigt werden.

Der Trick besteht darin, Dateien in das Dateisystem einzufügen, nachdem das benutzerdefinierte Tool ausgeführt wurde. Dies kann durch erneutes Scannen aller Dateien und durch Ausschluss der bereits im Projekt enthaltenen Objekte in einem Ziel, das vor dem Build ausgeführt wird, ausgeführt werden:

+0

Diese Lösung funktioniert einwandfrei! Danke vielmals. Ich werde diesen Beitrag aktualisieren, wenn ich in Zukunft Probleme mit komplexeren Fällen als nur einen einfachen Integrationstest finde. –

+0

btw Ich habe einige Probleme mit '$ (DefaultExcludesInProjectFolder) ', also ich files ein [Problem auf GitHub darauf] (https://github.com/dotnet/sdk/issues/1375). Das Snippet enthielt bereits meine Problemumgehung. –

Verwandte Themen