2012-02-17 13 views
7

Próbuję ustalić, czy jest możliwe, aby przy użyciu niestandardowego narzędzia w Visual Studio, aby zmienić zawartość jednego pliku, uruchom narzędzie niestandardowe innego.W Visual Studio, czy mogę utworzyć jeden plik niestandardowego narzędzia innego? (w tym przypadku przy użyciu Xsd2Code)

Mój scenariusz jest taki:

W projekcie Visual Studio C#, mam "master.xsd" schematu XML, który zawiera kilka innych innych plików xsd. Korzystam z narzędzia niestandardowego Visual Studio Custom Tool w celu wygenerowania pliku .cs ze schematu. Działa to dobrze, gdy sama master.xsd się zmienia, ale chciałbym, aby narzędzie niestandardowe działało na pliku master.xsd, gdy zmieni się jeden z pozostałych xsd.

Czy istnieje jakiś sposób wywołania jednego pliku przez narzędzie niestandardowe innego?

[EDIT - bardziej szczegółowo, dlaczego szukam w użyciu narzędzia niestandardowe tej]

Obecnie mamy plik GenerateFiles.bat który wywołuje Xsd2Code z wiersza polecenia do generowania kodu fiels ze schematów (jak sugeruje MattDavey poniżej). To działa, jest po prostu zbyt wolne.

Problem polega na tym, że przy każdej kompilacji Xsd2Code będzie działał, ale ponieważ wiele innych projektów zależy od tego projektu ze schematami, wszystkie one będą rekompilowane zbyt, chociaż prawdopodobnie nic się nie zmieniło. Praktyczny wynik jest taki, że nawet niewielka zmiana w teście jednostkowym obejmuje połowę rekompilacji projektów. Właśnie dlatego przyglądaliśmy się niestandardowemu podejściu do narzędzia, które generuje pliki kodu tylko wtedy, gdy zmienia się schemat.

Odpowiedz

4

używam Xsd2Code dużo w ten sposób, ale moje podejście jest dodanie zdarzenia pre-build, który wywołuje wiersz polecenia Xsd2Code i regeneruje xml na każdej budowie ..

Mój pre-build zdarzenie wygląda to:

$(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+ 

W twoim przypadku można uruchomić ten etap pre-build tylko na xsd master (który Zgaduję xsd: Importuje innych schematów), lub można uruchomić komendę na każdym schemacie pliki pojedynczo.

Zaletą tego jest to, że jeśli zmienię schematu XSD, mam bardzo użyteczne błędy w czasie kompilacji :)

nadzieję, że daje jakieś pomysły!

EDIT

Spędziłem trochę czasu na myślenie o problemie podświetlonego dotyczących czas budowy i zmodyfikowany skrypt pre-build tak:

$(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 

Więc Xsd2Code jest teraz generowanie kodu źródłowego do plik tymczasowy, który tylko zastępuje istniejący plik .cs, jeśli jest inny. To powinno być oznacza, że ​​jeśli .xsd w ogóle się nie zmieniło, ani wygenerowany plik .cs :)

Nadal atakujesz kod xsd2code, ale nie bierzesz udziału w msbuild przebudowanie całego łańcucha projektów, jeśli wygenerowane źródło było takie samo.

+0

Dzięki za sugestię. Niestety, tak to teraz robimy i jest to zbyt powolne.Problem polega na tym, że przy każdej kompilacji Xsd2Code będzie działał, ale ponieważ wiele innych projektów zależy od tego projektu ze schematami, wszystkie one będą rekompilowały się zbyt, chociaż prawdopodobnie nic się nie zmieniło. Właśnie dlatego szukałem niestandardowego narzędzia do generowania plików kodu tylko wtedy, gdy zmienia się schemat. Jednak w innych scenariuszach uważam, że podejście, które ty szczegółowo określasz, jest dobre. –

+0

ooh twarde. Pierwszą rzeczą, która przychodzi do głowy jest pominięcie kroku xsd2code, gdy plik xsd pozostaje niezmieniony. Może to wymagać nieco bardziej złożonego wstępnego tworzenia skryptu wsadowego, prawdopodobnie generując skrót pliku xsd i porównując go z wcześniej zapisanym hashem. Ale teraz tylko spekuluję :) – MattDavey

+0

@RobLevine patrz edytuj – MattDavey