Frage

Ich habe eine nette Power-Shell angetrieben Post-Build-Skript bekam, die für das Ziehen alle unsere Plugins in die richtige Lage etwas Magie Hokuspokus tut, nachdem sie zusammengestellt sind und thier Abhängigkeiten Aussortieren mit dem Master-Projekt der Lösung.

Mein Problem ist, gelegentlich, wenn ich etwas Dummes zu tun, ich kann in einem Zustand landen, wo mein Skript kann seinen Betrieb nicht richtig ausgeführt werden, und löst eine Ausnahme in Powershell mit den Details von dem, was falsch gelaufen ist.

Gibt es eine Möglichkeit, diese Ausnahmen zu bekommen, um die Visual Studio Fehlerfenster zu ziehen, so dass, wenn mein Post-Build fehlschlägt, VStudio eine Benachrichtigung Ausfall wird und formatiert es schön im Fenster neben allen anderen Warnungen / Fehlern

Edit:. Dies ist eine Klarstellung, was ich im Idealfall auf der Suche nach

entfernt tot Images Link

Hinweis: Wenn Sie schon hier gelandet suchen, wie Nachrichten individuelle Fehler in Visual Studio zeigen, bis zu machen (wenn Sie die Kontrolle über die Fehlermeldungen haben ) können Sie Roy Tinkers Antwort sehen zu lernen, wie Schneider Ihre Nachrichten zu zeigen. Wenn Sie fangen unerwartete Fehler interessiert Sie nicht kontrollieren können, oder eine vollständigere Lösung zu finden, nutzen Sie bitte die akzeptierte Antwort sehen.

War es hilfreich?

Lösung

Hier sind zwei Ansätze zur Unterbrechung des Build, wenn ein Powershell-Skript Fehler.

Mit exit() den Powershell-Prozess beenden

Um einen Statuscode aus dem Skript zurück zu kehren, wenn nicht Null ist, wird in der Fehlerliste angezeigt, die folgende:

exit(45) # or any other non-zero number, for that matter.

Dies ist nicht genau den Fehlertext auf Ihre Fehlerliste bekommen, aber es hat das Skript zu beenden und ein wenig etwas in Ihrer Fehlerliste erhalten, um anzuzeigen, welche vor oder nach dem Build-Befehl ist fehlgeschlagen.

eine benutzerdefinierte MSBuild Aufgabe Verwenden Sie das Powershell-Skript

auszuführen

Ich verbrachte eine wenig Zeit, um die Details ausarbeitet von einem Powershell-Skript in einer MSBuild-Aufgabe ausgeführt wird. Ich habe rel="noreferrer">. Sie probieren Sie es aus, da es mehr Diskussion enthält, und eine Erklärung, wie die Beispielprojekte zu handhaben. Es ist wahrscheinlich keine vollständige oder perfekte Lösung, aber ich habe es funktioniert auf meinem Rechner TM mit einem sehr einfachen Skript.

Dieser Ansatz liefert Zeilen- und Spalten Präzision bei der Powershell-Meldung von Fehlern und unterstützt auch die Doppelklick-takes-me-to-the-Datei Verhalten wir in Visual Studio gewöhnt sind. Wenn es fehlt, ich bin sicher, dass Sie in der Lage sein werden, sie zu verlängern, um Ihre Bedürfnisse zu erfüllen. Auch auf Ihrer Version von Visual Studio abhängig, müssen Sie möglicherweise Details wie Montagereferenz Versionen massieren.

Zunächst einmal, eine benutzerdefinierte MSBuild-Aufgaben in einer Klassenbibliothek Projekt. Die Bibliothek sollte folgende Baugruppen für MSBuild und Powershell Integration verweisen. (Beachten Sie, dass dieses Beispiel erfordert Powershell 2.0.)

  • Microsoft.Build.Framework (GAC)
  • Microsoft.Build.Utilities.v3.5 (GAC)
  • System.Management.Automation (von C: \ Programme \ Reference Assemblies \ Microsoft \ Windows \ v1.0)

Erstellen Sie eine Task-Klasse, und eine Eigenschaft aussetzen, um den Pfad zu dem Powershell-Skript angeben, etwa so:

using System.IO;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

public class PsBuildTask : Task
{
    [Required]
    public string ScriptPath { get; set; }

    public override bool Execute()
    {
        // ...
    }
}

Im Rahmen der Execute() Methode, starten Sie die Laufzeit Powershell, führen Sie das Skript, und collect Fehler. Verwenden Sie die Log Eigenschaft, die Fehler zu protokollieren. Wenn Sie fertig sind, schließen die Runspace und return true, wenn das Skript keine Fehler protokolliert.

// create Powershell runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();

// create a pipeline and feed it the script text
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(". " + ScriptPath);

// execute the script and extract errors
pipeline.Invoke();
var errors = pipeline.Error;

// log an MSBuild error for each error.
foreach (PSObject error in errors.Read(errors.Count))
{
    var invocationInfo = ((ErrorRecord)(error.BaseObject)).InvocationInfo;
    Log.LogError(
        "Script",
        string.Empty,
        string.Empty,
        new FileInfo(ScriptPath).FullName,
        invocationInfo.ScriptLineNumber,
        invocationInfo.OffsetInLine,
        0,
        0,
        error.ToString());
}

// close the runspace
runspace.Close();

return !Log.HasLoggedErrors;

Und das ist es. Mit dieser Anordnung in der Hand, können wir ein anderes Projekt so konfigurieren, dass die MSBuild-Aufgabe zu verbrauchen.

Betrachten wir zum Beispiel eine C # -basierte Klassenbibliotheksprojekt (CSPROJ). in einem Beitrag Buildereignis die Aufgabe, die Integration erfordert nur ein paar Dinge.

Als erstes registrieren die Aufgabe, gerade innerhalb des <Project> Knoten der CSPROJ Datei wie folgt:

<UsingTask TaskName="PsBuildTask"
           AssemblyFile="..\Noc.PsBuild\bin\Debug\Noc.PsBuild.dll" />

Taskname sollte der Name der Task-Klasse sein, obwohl es den Namespace scheinen würde, ist nicht erforderlich. AssemblyFile ist ein absoluter Pfad zu der benutzerdefinierten MSBuild Aufgabe Anordnung oder relativer Pfad in Bezug auf die CSPROJ Datei. Bei Baugruppen im GAC, können Sie das Attribut AssemblyName stattdessen verwenden.

Nach der Registrierung kann die Aufgabe in Pre- und Post-Build-Ereignissen verwendet werden. Konfigurieren eines Build-Ereignis innerhalb des <Project> Element der CSPROJ Datei wie folgt:

<Target Name="AfterBuild">
    <PsBuildTask ScriptPath=".\script.ps1" />
</Target>

Und das ist es. Wenn Visual Studio das Projekt kompiliert wird, lädt es die benutzerdefinierte Assembly und Task-Objekt und führt die Aufgabe. Fehler, die durch die Pipeline angehoben werden abgerufen und gemeldet werden.

Screenshot

Andere Tipps

eine Fehler, Warnung oder Nachricht erstellen, die im Fenster Fehlerliste erscheinen, melden Sie sich einfach eine Nachricht an stdout oder stderr in folgendem Format aus einem durch ein Pre- oder Post-Build-Ereignis initiiert Skript. Bitte Kommentar oder bearbeiten, wenn es eine offizielle Spezifikation ist; dies ist nur das, was ich herzuleiten durch Versuch und Irrtum konnte und durch die Ausgabe von MSBuild zu beobachten. Eckige Klammern bezeichnen "optional":

FilePath[(LineNumber[,ColumnNumber])]: MessageType[ MessageCode]: Description

Als Beispiel:

E:\Projects\SampleProject\Program.cs(18,5): error CS1519: Invalid token '}' in class, struct, or interface member declaration

Weitere Beispiele finden Sie im Ausgabefenster für Fehler / Warnung / Meldung, die auftreten kann, wenn Sie einen Build in Visual Studio ausgeführt werden.

scroll top