2009-06-26 13 views
15

Czy można uzyskać listę wszystkich wszystkich plików wyjściowych z projektu MSBuild?Uzyskiwanie plików wyjściowych z projektu MSBuild

W prostym projektem, mógłby zrobić coś jak

<CreateItem Include="$(OutputDir)**\*"> 
     <Output ItemName="AllOutputs" TaskParameter="Include"/> 
</CreateItem> 

ale moje projekty są częścią większej konstrukcji, a wszystkie wyjścia przechodzą do wspólnej lokalizacji, chcę móc exculde bibliotek DLL i treści które nie należą.

Wszelkie pomysły?

Odpowiedz

23

Po ponownym przeanalizowaniu twojego komentarza uświadomiłem sobie, że źle wymyśliłem to, czego naprawdę potrzebujesz. To jest interesujący problem, który masz na ręku.

Jeśli nie masz nic przeciwko edycji samego pliku projektu, być może uda Ci się uzyskać całkiem niezłe zamknij do tego, co chcesz. Istnieje element FileWrites, który śledzi wszystkie pliki zapisane podczas procesu kompilacji. Aby rozpocząć odtwarzanie z tej edytować plik projektu, aby ten AfterBuild TARGET

<Target Name="AfterBuild"> 
    <Message Text="FileWrites: @(FileWrites)" Importance="high"/> 
</Target> 

Są pewne problemy z tym podejściem a także

  • Musisz edytować plik projektu samego
  • To będzie zawierało pliki zapisane w pośrednim katalogu wyjściowym (tj. obj) i katalog wyjściowy (tj. bin)
  • Jeśli nie budować dostosowania, nie są one wymagane do napisania tej pozycji

Można by pomyśleć, że można rozwiązać pierwszy problem z techniką i wyjście MSBuild: Find Many Project References element FileWrites po wykonaniu kompilacji. To zadziała tylko wtedy, gdy opakowanie proj zostało umieszczone w tym samym folderze, co oryginalny projekt, ponieważ wszystkie elementy w pliku .csproj są zadeklarowane ze ścieżką względną.Tak więc dzieje się to w przeważającej części.

Możesz przekroczyć drugie ograniczenie, korzystając z zadania FindUnderPath, aby pobrać tylko pliki umieszczone w folderze OutputPath.

Co można zrobić, ale nie jest tak naprawdę niezawodny, albo jest zbadanie OutputPath na początku kompilacji, a następnie jeszcze raz na końcu kompilacji i zobacz, co zostało dodane. Powiedzmy, że można umieścić oryginalne pliki do StartFiles element i na koniec kompilacji umieścić wszystkie pliki w Element o nazwie EndFiles można The Do:

<Target Name="SomeTargetHere"> 

<ItemGroup> 
    <FilesWritten Include="@(EndFiles)" /> 
    <FilesWritten Remove="@(StartFiles)"/> 
</ItemGroup> 

<!-- Now FilesWritten contains the difference between EndFiles & StartFiles --> 

</Target> 

Krótko mówiąc nie jestem pewien, czy istnieje dobre rozwiązanie, które nie wymaga ani zadanie niestandardowe lub :(zwyczaj rejestratora

Sayed Ibrahim Hashimi

my Book. Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Dzięki za szczegółową odpowiedź. –

11

Jeśli używasz MSBuild task, możesz pobrać pliki, które zostały zbudowane za pomocą wyjścia TargetOutputs. Oto przykład

<MSBuild Projects="YourProject.csproj"> 
     <Output ItemName="YourProjectOutputs" TaskParameter="TargetOutputs"/> 
</MSBuild> 

Więc w tym przypadku, gdy YourProject.csproj jest zbudowany pliki, które zostały utworzone zostaną umieszczone wewnątrz YourProjectOutputs poz.

Niedawno napisałem wpis na blogu, który szczegółowo omawia tę kwestię: MSBuild: How to Get All Generated Outputs.

Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Dzięki za sugestię, problem polega na tym, że TargetOutputs tylko zawiera zespół wyjściowy, a zadanie GetOutputs zawiera wszystko w katalogu wyjściowym, nawet jeśli projekt msbuild nie utworzył/nie skopiował. –

3

Spójrz na mojego poprzedniego wpisu na blogu MSBuild: Find Many Project References. W tym poście opisuję, w jaki sposób można utworzyć plik MSBuild, który może wyodrębnić wartości dla ReferenceGruppe. W twoim przypadku wystarczy zamienić utworzony cel na taki, który wypełnił element ze wszystkich plików znajdujących się w OutputPath. Daj mi znać, jeśli chcesz, bym to rozwinął.

0

Co robimy zwalczania tego scenariusza jest to, że każdy build tworzy dyrektor "Deploy" y (możesz nazwać to, co chcesz).

Katalog wdrażania zawiera tylko te pliki wykonywalne i biblioteki dll, które są potrzebne dla rzeczywistej aplikacji (np. Testowe biblioteki dll nie zostaną tam umieszczone). Każdy projekt musiałby włożyć do niego pliki "Rozlokowalne" (Dodajemy nawet podkatalogi (np. WWW, Usługi, itp.).)

Powielono niektóre bity, ale pozwala to na dostęp do wszystkich bibliotek dll z budować, jeśli są potrzebne.

+0

Chcę mieć wspólny katalog "Rozmieść", ale być w stanie określić, które pliki są tworzone przez każdy projekt –

Powiązane problemy