webentwicklung-frage-antwort-db.com.de

führen Sie in VisualStudio ein benutzerdefiniertes msbuild-Ziel aus

Angenommen, ich füge einer csproj-Datei ein benutzerdefiniertes Ziel hinzu. Gibt es eine Möglichkeit, dieses Ziel vom Visual Studio aus zu steuern? Ich möchte nicht, dass es sich um einen Pre-Build- oder Post-Build-Schritt handelt. Ich möchte nur in der Lage sein, dieses Ziel (und seine Abhängigkeiten) in Visual Studio auszuführen.

33

Es gibt eine einfache (wenn auch nicht allzu befriedigende) Möglichkeit, ein benutzerdefiniertes externes Tool zu verwenden.

Angenommen, Ihre Projektdatei hat die folgende Änderung:

  <Target Name="CalledFromIde">
    <Error Text="Called from the IDE!" />
  </Target>

Gehen Sie zu Extras | Externe Tools und füge eines davon hinzu:

  Title:      Called from IDE
  Command:    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
  Arguments:  $(ProjectDir)$(ProjectFileName) /t:CalledFromIde
  Initial directory:  $(ProjectDir)
  Use Output window:  checked

Wenn Sie dies ausführen, erfolgt die Ausgabe wie folgt:

  Build FAILED.

  "F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) ->
  (CalledFromIde target) -> 
    F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE!

Sie rufen MSBuild als externes Tool auf und lassen es das Ziel direkt ausführen. Sie müssen den vollständigen Pfad zu MSBuild angeben, da das IDE nicht die gleichen Eigenschaften beibehält, die in der von ihm erstellten Build-Umgebung verfügbar sind.

Sie können dies mit einer Verknüpfung verknüpfen, indem Sie herausfinden, welcher Befehl # in der Gruppe Tools.ExternalCommand # enthalten ist.

Wenn Sie nach einer Lösung mit mehr Raffinesse suchen, ist diese etwas komplizierter. Hier ist es auf den Punkt gebracht (für VS2010):

1) Erstellen Sie ein VS-Add-In (Datei | Neu | Projekt | Andere Projekttypen | Erweiterbarkeit | Visual Studio-Add-In). Ich bin nicht sicher, ob Sie das VS SDK installiert haben müssen, um dies zu erhalten, es ist im Erweiterungsmanager verfügbar.

Wählen Sie im Assistenten die folgenden Optionen aus: - Microsoft Visual Studio 2010 - Ja, erstellen Sie ein Menüelement "Extras" - Laden beim Start der Anwendung - Mein Add-In erstellt niemals eine modale Benutzeroberfläche und kann mit Befehlszeilen-Builds verwendet werden.

2) Fügen Sie Verweise auf Microsoft.Build und Microsoft.Build.Framework hinzu

3) Suchen Sie die Implementierung von Exec in der Datei Connect.cs

4) Ersetzen Sie es durch diesen Code:

public void Exec(
    string commandName,
    vsCommandExecOption executeOption,
    ref object varIn,
    ref object varOut,
    ref bool handled)
{
    handled = false;
    if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault)
        return;
    if (commandName != "BuildAddin.Connect.BuildAddin")
        return;

    var doc = _applicationObject.ActiveDocument;
    var projectItem = doc.ProjectItem;
    var project = projectItem.ContainingProject;
    var evalProject =
        Microsoft.Build.Evaluation.ProjectCollection
        .GlobalProjectCollection.LoadProject(project.FullName);
    var execProject = evalProject.CreateProjectInstance();

    bool success = execProject.Build("CalledFromIde", null);

    var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput);
    var output = (OutputWindow)window.Object;
    OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin");
    pane.OutputString(success ? "built /t:CalledFromIde" : "build failed");

    handled = true;
    return;
}

5) Ein besseres benutzerdefiniertes Ziel beim Debuggen, da der vorherige Fehler:

  <Target Name="CalledFromIde">
    <WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
  </Target>

6) Der obige Code enthält keine Fehler bei der Überprüfung der Kürze. Sie sollten viel sauberer sein, da er in der IDE ausgeführt wird. Das Add-In fügt einen Menüpunkt in das Menü Extras ein. Wie oben beschrieben, sucht es einfach nach dem Projekt, das das derzeit aktive Editor-Dokument enthält, und benötigt für alles, was Sie gerade kochen, eine bessere Installation.

Mit dieser Technik wird die Build-Engine-Instanz aus dem IDE abgerufen und auf einer separaten Instanz des Projekts erstellt.

39
Brian Kretzler

Wenn Sie den Build in Visual Studio ausführen, wird während des Builds eine Buildvariable von VisualStudioDir erstellt.

Um nur eine VS-Build-Sitzung auszuführen, gehen Sie wie folgt vor:

<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''>
</Target>

Gehen Sie folgendermaßen vor, um nur in einem Build außerhalb von VS auszuführen:

<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''>
</Target>

Sie müssen Ihre benutzerdefinierte Zieldatei auf zwei Arten einbinden.

  1. Legen Sie die Umgebungsvariable CustomBeforeMicrosoftCommonTargets fest
  2. Bearbeiten Sie Ihre Projektdatei, um Ihre benutzerdefinierte Zieldatei einzuschließen, indem Sie einen Import hinzufügen

    <Imports Project="CustomBuildTasks.Targets"><Imports/>
    
5
Tim Schruben

Sie müssen nicht mit Exec programmieren, obwohl dies eine Möglichkeit ist, dies zu tun. Der einfachere Weg ist, Folgendes zu tun:

Ändern Sie das Attribut DefaultTargets="Build" in ein benutzerdefiniertes Ziel, das Sie erstellen, und sagen Sie "All" folgendermaßen:

DefaultTargets="All"

Dann können Sie in Ihrem benutzerdefinierten "All" -Ziel das DependsOnTargets-Attribut wie folgt verwenden:

"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
  </Target>"

Dadurch werden Zip-Dateien erstellt und in Ihrem benutzerdefinierten "All"-Ziel abgelegt.

3
user3995631

Vor einiger Zeit hatte ich das gleiche Problem und beschloss, VS-Add-In zu schreiben. Versuch es:

 MsBuildTaskExplorer

https://github.com/Serg046/MsBuildTaskExplorer

https://marketplace.visualstudio.com/items?itemName=saaseev.MsBuildTaskExplorer

0
Serg046