Wydarzenie kompilacji Visual Studio - Skopiuj do względnej lokalizacji katalogu

228

Po udanej kompilacji chcę skopiować zawartość katalogu wyjściowego do innej lokalizacji w tym samym folderze „podstawowym” . Ten folder nadrzędny jest częścią względną i może się różnić w zależności od ustawień Kontroli źródła.

Wymieniłem kilka dostępnych dla mnie wartości makr ...

$ (SolutionDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

Chcę skopiować zawartość Output Dir do następującego folderu:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dependency

Podstawową lokalizację „D: \ GlobalDir \ Version \ AppName” należy pobrać z jednego z powyższych makr. Żadna z wartości makr nie zawiera jednak tylko lokalizacji nadrzędnej.

Jak wyodrębnić tylko lokalizację podstawową dla polecenia kopiowania po kompilacji?

Preets
źródło

Odpowiedzi:

188

Jeśli żaden z TargetDir lub innych makr nie wskazuje na właściwe miejsce, użyj katalogu „..”, aby przejść wstecz w górę hierarchii folderów.

to znaczy. Użyj, $(SolutionDir)\..\..aby uzyskać katalog podstawowy.


Aby zobaczyć listę wszystkich makr, zobacz tutaj:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx

gbjbaanb
źródło
Dzięki!! Dobra wskazówka
Merlyn007
293

Oto, co chcesz umieścić w wierszu polecenia Zdarzenie po kompilacji projektu:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

EDYCJA: Lub jeśli nazwa docelowa jest inna niż nazwa projektu.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"
Lucas B.
źródło
1
Dobra wskazówka. Zapomniałem cytatów.
Matt Montag,
3
Nie działało to dla mnie, ponieważ zapomniałem /Y. Dzięki za pokazanie całego polecenia.
Mark
10
Można użyć xcopysymboli wieloznacznych i odpowiednich przełączników, aby osiągnąć podobny wynik, zachowując jednocześnie strukturę folderu (drzewa) źródłowego, na przykład:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku
4
Sugerowałbym użycie $ (TargetName) zamiast $ (ProjectName) w części źródłowej.
Alexander Schmidt,
2
zaktualizuj do mojej poprzedniej. komentarz: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"bez dodatkowego ukośnika odwrotnego, ponieważ $ (SolutionDir) zawiera ukośnik końcowy (przynajmniej w VS2012)
lodowaty
40

Możesz spróbować:

$(SolutionDir)..\..\
ichiban
źródło
8
Należy pamiętać, że zmienna $ (SolutionDir) ma już odwrotny ukośnik. Źródło: „Katalog rozwiązania (zdefiniowany z dyskiem i ścieżką); zawiera końcowy ukośnik odwrotny„ \ ”.” msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker
10

Myślę, że jest to powiązane, ale miałem problem podczas budowania bezpośrednio przy użyciu msbuildwiersza polecenia (z pliku wsadowego) vs budowanie z poziomu VS.

Korzystanie z czegoś takiego:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(uwaga: start XCOPYzamiast XCOPYominąć problem z uprawnieniami, który uniemożliwił kopiowanie)

Makro $(SolutionDir)obliczane ..\podczas wykonywania msbuild z pliku wsadowego, co spowodowało XCOPYniepowodzenie polecenia. W przeciwnym razie działało dobrze, gdy zostało zbudowane z Visual Studio. Potwierdzono za pomocą, /verbosity:diagnosticaby zobaczyć oszacowane dane wyjściowe.

$(ProjectDir)..\Zamiast tego użycie makra , co oznacza to samo, działało dobrze i zachowało pełną ścieżkę w obu scenariuszach kompilacji.

drzaus
źródło
1
linkowanie do tego samego hacka na wypadek, gdy zapomniałem przyznać kredyt ...
drzaus
Startpracował dla mnie ( xcopyw folderze udostępnionym).
AgentFire
4

Czy nie ma sensu bezpośrednio używać msbuild? Jeśli robisz to przy każdej kompilacji, możesz dodać zadanie msbuild na końcu? Jeśli chcesz tylko sprawdzić, czy nie możesz znaleźć innej wartości makra, która nie jest wyświetlana w programie Visual Studio IDE, możesz włączyć opcje msbuild do diagnostyki, która pokaże wszystkie zmienne, których możesz użyć, ponieważ jak również ich aktualna wartość.

Aby włączyć to w Visual Studio, przejdź do Narzędzia / Opcje, a następnie przewiń widok drzewa do sekcji o nazwie Projekty i rozwiązania, rozwiń to i kliknij Kompiluj i uruchom, po prawej stronie znajduje się lista rozwijana określająca szczegółowość wyników kompilacji , ustawienie tego na diagnostyczne pokaże, jakich innych wartości makr można użyć.

Ponieważ nie do końca wiem, do jakiego poziomu chciałbyś przejść i jak skomplikowana powinna być twoja kompilacja, może to dać ci pewien pomysł. Ostatnio robiłem skrypty kompilacji, które nawet wykonują kod SQL jako część kompilacji. Jeśli potrzebujesz dodatkowej pomocy lub nawet przykładowych skryptów kompilacji, daj mi znać, ale jeśli jest to tylko mały proces, który chcesz uruchomić na końcu kompilacji, być może przejście pełnego skryptu msbuild jest trochę przesadzone .

Mam nadzieję, że to pomoże Rihan

Rihan Meij
źródło
dzięki Rihan, ale najwyraźniej VS 2003 nie wydaje się to wspierać! Oczywiście jestem zadowolony z wydarzenia po kompilacji ;-)
Preets
Nie zdawałem sobie sprawy, że to był vs2003, a zatem użycie msbuild jako możliwego rozwiązania, jeśli przypominam sobie, że vs2003 był przed erą msbuild? Dzięki za odpowiedzi. Powodzenia z VS 2003, nie oglądałem się za siebie po przejściu do VS2005
Rihan Meij