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?

Odpowiedzi:



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"

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


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.