2009-08-13 19 views
6

Piszę zadanie MSBuild, który dodaje generowanie kodu do standardowego projektu C# (.csproj). Zadanie musi uzyskać dostęp do typów w zestawach, do których odwołuje się ten projekt.MSBuild get reference reference from ProjectReference

To proste o referencje montażowych (uzyskać wszystkie przedmioty w <Reference>), ale coraz trudniej o referencje do innych projektów (<ProjectReference>)

Czy MSBuild zapewnić sposób pobierania skompilowany odwołania do zestawu z a <ProjectReference>?

Jeśli nie, czy istnieje prosty sposób na rozwiązanie tej nazwy, czytając plik .csproj?

Plik .csproj nie dostarcza bezpośrednio skompilowanej ścieżki złożenia, musi zostać zrekonstruowany z innych właściwości. Ponadto niektóre właściwości są warunkowe (w zależności od konfiguracji debugowania/wydawania), więc użycie prostego czytnika XPath nie zadziałałoby:

Nazwa pliku DLL jest dostępna od <AssemblyName>, ale ścieżka do pliku DLL opisana jest w

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <OutputPath>;bin\Release</OutputPath> 
<PropertyGroup> 

Czy istnieje sposób programowo odczytać pliku .csproj i rozwiązać poprawną wartość OutputPath oceniając wszystkie warunki?

muszę rozwiązanie, w którym przywoływane .csproj pliki pozostają Plain Old pliki projektu (bez modyfikacji plików csproj które dodają niezbędne informacje w bardziej przystępny sposób)

Odpowiedz

6

można umieścić coś takiego:

<Target Name="CopyDllsFromDependentProjects"> 
<MSBuild Projects="@(ProjectReference)" Targets="Build" BuildInParallel="true" Condition="'%(Name)'=='ProjectA' Or '%(Name)'=='ProjectB'"> 
    <Output TaskParameter="TargetOutputs" ItemName="OutputAssemblies" /> 
</MSBuild> 
<Copy SourceFiles="@(OutputAssemblies)" DestinationFolder="$(PostBuildDir)" SkipUnchangedFiles="true" /> 

się do swojego projektu i nazwać tak:

<Target Name="AfterCompile" DependsOnTargets="CopyDllsFromDependentProjects" /> 

Dodaj przyprawy do smaku.

Wymaga to MSBuilding zależności w celu opracowania wyników (informacja nie może statycznie wyprowadzić ze względu na sposób, w jaki przetwarzane są w MSBuild - np. Gdzie TeamBuild umieścić wyniki?).

Książka Inside the MSBuild Engine świetnie nadaje się do tego rodzaju nonsensów.