2013-02-08 21 views
5

Mam wiele projektów, które są połączone w rozwiązanie. Każdy projekt ma swoją własną strukturę katalogów, a pliki csproj znajdują się na innym poziomie struktury folderów. Każde csproj ma określoną właściwość OutputPath. OutputPath - jest ścieżką względną i różni się w zależności od projektu w taki sposób, że wszystkie projekty mają ten sam katalog wyjściowy. To działa dobrze, jeśli zbuduję oddzielny projekt. Ale wszystko się zmienia, jeśli próbuję zbudować plik rozwiązania. W tym przypadku każdy folder wyjściowy projektu różni się (zależy od liczby ".. \" w OutputPath tego projektu).Ścieżki względne z projektem MSBuild kontra rozwiązanie

Wiem, że przed chwilą wszystko działało dobrze. Nikt nie zmienił pliku build.cmd ani żadnych plików sln ani csproj. Ale teraz mam sytuację opisaną powyżej.

Moje pytanie brzmi: co wpływa na ocenę ścieżki względnej? Mam na myśli, jak mogę wymusić względną OutputPath do oceny począwszy od folderu, w którym znajduje się plik csproj tego konkretnego projektu. Nie z folderu, w którym znajduje się plik .sln.

Let's assume I have following directory structure: 

dir1 
    a.sln 
    dir2 
    a.csproj 
    dir21 
    dir3 
     b.csproj 

a.csproj ma ścieżkę wyjściową ustawioną na „../../_bin', która jest tuż nad dir1 jeśli liczy się od a.csproj folderze b.csproj ma ścieżkę wyjściową ustawioną na” ../. ./../_bin ', która jest taka sama - tylko około dir1, jeśli policzono z b.csproj

a.sln zawiera oba - a.csproj i b.csproj.

Po uruchomieniu msbuild uzyskuję kompilację projektu do "dir1 /../../_ bin", a b do "dir1 /../../../_ bin" - obie ścieżki względne plików projektów są liczone z lokalizacji pliku rozwiązania, a nie plików projektu.

Odpowiedz

3

Cóż, udało mi się dowiedzieć, co było przyczyną tego. To był niestandardowy plik .targets, który sugerował właściwość SolutionDir na początku każdego msbuild. Znalazłem, że za pomocą MSBuild Explorer. Narzędzie okazało się bardzo przydatne w moim przypadku - nie wiedziałem o plikach .target innych firm w moim systemie.

+0

+1000 Miałem tę samą główną przyczynę (nadpisanie $ (OutputPath)), ale bardzo odmienny problem (pliki .designer.cs przestały się regenerować) - zdiagnozowano MSBuild Explorer w 5 minut. –

2

Od Msbuild Import Element description

Względne ścieżki w projektach importowanych są interpretowane w stosunku do katalogu projektu importowania . Dlatego jeśli plik projektu jest importowany do kilku plików projektu w różnych lokalizacjach, względne ścieżki w importowanym pliku projektu będą interpretowane inaczej dla każdego zaimportowanego projektu.

Wszystkie MSBuild zastrzeżone właściwości, które odnoszą się do pliku projektu, na przykład, MSBuildProjectDirectory i MSBuildProjectFile, które są wymienione w importowanym projekcie są przypisane wartości oparte na importowanie pliku projektu.

Jeśli dodasz więcej szczegółów lub kilka próbek do swojego pytania - łatwiej będzie zrozumieć dokładny problem.

Edytuj: Dobra, spróbujmy wskazać tę tajemnicę. Przede wszystkim - zmienne środowiskowe mogą mieć wpływ na OutputPath.

2nd - podczas kompilacji pliku sln przekształconego do formatu pliku projektu msbuild i zapisanego w pliku tymczasowym. Możesz uzyskać ten plik tymczasowy, jeśli wykonasz polecenie cmd "set msbuildemitsolution = 1", a następnie uruchom kompilację za pomocą wiersza poleceń. Tam możesz sprawdzić ten plik i zobaczyć, jak nazywają się twoje projekty. Ale przypuszczam, że zobaczysz wiele wpisów .csproj />. I globalne właściwości msbuild dziedziczone przez te połączenia.

Podejrzewam, że jeśli wszystko było w porządku przed jakimś okresem i nie wprowadzono żadnych zmian - brakuje zmiennej środowiskowej OutputPath lub innej zmiennej, która przyczyniła się do konstrukcji OutputPath.

BTW - Myślę, że jeśli chcesz naprawić swój problem poprzez wymuszenie względnego katalogu - możesz również użyć $ (MSBuildProjectDirectory). Jest to jedna z zastrzeżonych właściwości msbuild (od here), ale będzie to wymagało korekty OutputPath w każdym pliku csproj. To, co ja osobiście wolę unikać, ponieważ może wpłynąć na inne cele i wprowadzić subtelne problemy.

+0

Nie wiesz, co masz na myśli przez zaimportowane projekty, ale w moim przypadku wszystkie ścieżki względne są interpretowane w odniesieniu do katalogu plików rozwiązania. I nie jestem pewien, jak to zmienić ... – DarkDeny

+0

Dzięki za pomoc, ale rozwiązałem problem i wspomniałem o tym w mojej własnej odpowiedzi powyżej. Ale dzięki za uczestnictwo i tak! – DarkDeny

Powiązane problemy