Kann ich in Visual Studio eine Datei ein das benutzerdefinierte Tool eines anderen ausführen? (In diesem Fall mit XSD2Code)

StackOverflow https://stackoverflow.com/questions/9325165

Frage

Ich versuche herauszufinden, ob es möglich ist, wenn es möglich ist, ein benutzerdefiniertes Tool in Visual Studio zu verwenden, um den Inhalt einer Datei zu ändern, und das benutzerdefinierte Tool eines anderen auszulösen.

Mein Szenario ist Folgendes:

In einem Visual Studio C# -Projekt habe ich ein "master.xsd" -RexML -Schema, das mehrere andere XSD -Dateien enthält. Ich benutze das Xsd2Code Visual Studio Custom Tool zum Generieren eines .cs aus dem Schema. Dies funktioniert gut, wenn sich der Master.xsd selbst ändert, aber ich möchte, dass das benutzerdefinierte Tool auf der Datei master.xsd ausgeführt wird, wenn sich eines der anderen XSDs ändert.

Gibt es eine Möglichkeit, eine Datei zu lindern, die das benutzerdefinierte Tool eines anderen ausgelöst hat?

Bearbeiten - Weitere Details darüber, warum ich ein benutzerdefiniertes Tool dafür verwenden möchte

Derzeit haben wir eine Datei für generateFiles.bat, in der XSD2Code aus der Befehlszeile aufgerufen wird, um die Codefelder aus den Schemata (wie von Mattdavey unten vorgeschlagen) zu generieren. Das funktioniert einfach zu langsam.

Das Problem ist, dass in jedem Build XSD2Code läuft, aber weil viele andere Projekte mit den Schemas von diesem Projekt abhängen, werden sie alle auch neu kompilieren, obwohl sich wahrscheinlich nichts geändert hat. Das praktische Ergebnis ist, dass selbst eine geringfügige Änderung eines Unit -Tests die halbe Projekte umfasst. Aus diesem Grund haben wir uns mit dem benutzerdefinierten Tool -Ansatz befasst, um nur die Codedateien zu generieren, wenn sich das Schema ändert.

War es hilfreich?

Lösung

Ich verwende XSD2Code auf diese Weise sehr, aber mein Ansatz ist es, ein Ereignis vor dem Bau hinzuzufügen, das die Befehlszeile XSD2Code aufruft und die XML in jedem Build regeneriert.

Mein Ereignis vor dem Bau sieht folgt aus:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs /platform Net40 /collection Array  /sc+ /ap+ /if- /xa+

In Ihrem Fall können Sie diesen Schritt vor dem Bau nur auf dem Master XSD ausführen (was ich vermute, XSD: Importiert die anderen Schemas) oder Sie können den Befehl in jeder Ihrer Schema-Dateien einzeln ausführen.

Der Vorteil dafür ist, dass ich, wenn ich das XSD -Schema ändere, sehr nützliche Kompilierungszeitfehler bekomme :)

Hoffe das gibt dir einige Ideen!

BEARBEITEN

Ich habe einige Zeit damit verbracht, über das Problem nachzudenken, das Sie in Bezug auf die Build-Zeit hervorgehoben haben, und das vorbildliche Skript wie SO geändert:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs.temp /platform Net40 /collection Array  /sc+ /ap+ /if- /xa+

fc $(ProjectDir)Api\Schemas\MySchema.cs  $(ProjectDir)Api\Schemas\MySchema.cs.temp

if errorlevel 1 copy $(ProjectDir)Api\Schemas\MySchema.cs.temp $(ProjectDir)Api\Schemas\MySchema.cs /Y

del $(ProjectDir)Api\Schemas\MySchema.cs.temp

XSD2Code generiert jetzt den Quellcode jetzt in eine temporäre Datei, die nur die vorhandene .cs -Datei überschreibt, wenn sie unterschiedlich ist. Dies sollte meine, wenn sich der .xsd überhaupt nicht verändert hat, wird der generierte .cs auch nicht :)

Sie nehmen immer noch den Treffer, XSD2Code auszuführen, aber Sie nehmen nicht den Hit des MSBuild -Wiederaufbaus eine ganze Kette von Projekten, wenn die generierte Quelle gleich war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top