Kopiowanie plików do folderu aplikacji w czasie kompilacji

95

Jeśli mam jakieś pliki, które chcę skopiować z mojego projektu do .\bin\debug\folderu podczas kompilacji, wydaje się, że muszę je umieścić w katalogu głównym projektu. Umieszczenie ich w podfolderze wydaje się kopiować je do .\bin\debug\folderu w tej samej strukturze, w której są przechowywane.

Czy jest sposób, aby tego uniknąć?

Dla jasności: jeśli mam MyFirstConfigFile.txti MySecondConfigFile.txtw ConfigFilesfolderze i ustawię ich Copy to Output na Copy ... , pojawią się w .\bin\debug\ConfigFiles\folderze. Chcę, aby pojawiły się w .\bin\debug\folderze.

Andrew Ducker
źródło

Odpowiedzi:

93

Możesz to zrobić za pomocą zdarzenia po kompilacji. Ustaw pliki na brak akcji podczas kompilacji, a następnie w makrze skopiuj pliki do odpowiedniego katalogu.

Oto makro po kompilacji, które moim zdaniem zadziała, kopiując wszystkie pliki z katalogu o nazwie Konfiguracja do głównego folderu kompilacji:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)
JoshBerke
źródło
1
Czy w przypadku miejsca docelowego nie powinien to być $ (ProjectDir) \% (OutDir)?
Ed Greaves
11
Poprawne i przetestowane makro (Vs2010) to: copy "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot
Możesz również po prostu zrobić plik względny do wyjścia: skopiuj "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen
3
Myślę, że użycie cytatów jest konieczne:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus
1
Wydaje się, że w MSVS2017 (15.4) powinno być $(OutDir)(tj. Bez $(ProjectDir)) ... w przeciwnym razie otrzymujesz błędy podwójnej ścieżki
JHBonarius
51

Możesz użyć zadania MSBuild na swoim csproj, w ten sposób.

Edytuj swój plik csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>
Jhonny D. Cano -Leftware-
źródło
Jest to najlepsze rozwiązanie, ponieważ do kopiowania wielu plików można używać symboli wieloznacznych i nie muszą one znajdować się w projekcie.
Chris Bordeman
38

Możesz również umieścić pliki lub łącza w katalogu głównym eksploratora rozwiązań, a następnie ustawić właściwości plików:

Build action = Content

i

Copy to Output Directory = Copy if newer (na przykład)

Aby uzyskać łącze, przeciągnij plik z eksploratora Windows do eksploratora rozwiązań, przytrzymując klawisz Shift i Control.

wprowadź opis obrazu tutaj

Georg
źródło
3
Pozwoli to zachować oryginalną ścieżkę względną, która nie jest akceptowana dla OP
jlee
Jeśli umieścisz plik w węźle najwyższego poziomu projektu, zostanie on skopiowany bezpośrednio do folderu wyjściowego $ (OutputPath).
Georg
1
Zobacz ten post, aby
poznać
5

Osobiście wolę ten sposób.

Zmodyfikuj, .csprojaby dodać

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
Jérôme MEVEL
źródło
1
Moim zdaniem o wiele lepsze niż wydarzenie post-build. Dziękuję Ci!
khlr
Czy to nie to samo, co kliknięcie projektu prawym przyciskiem myszy i wybranie opcji „Dodaj | istniejący element” w Eksploratorze rozwiązań, a następnie ustawienie właściwości pliku „Kopiuj do katalogu wyjściowego” na „Kopiuj, jeśli nowszy”. Nie ma potrzeby bezpośredniego modyfikowania XML.
Antony Booth
1
@AntonyBooth po chwili zdasz sobie sprawę, że zawsze łatwiej jest zrozumieć, co się dzieje i zmodyfikować kod bezpośrednio, zamiast uczyć się, jak zrobić to samo ze swoim IDE. Dziś używasz Visual Studio, jutro może to być JetBrains Rider, a pojutrze VS Code. Na koniec zawsze lepiej opanujesz język niż IDE. PS: Nie wiem, czy to, co opisujesz, jest takie samo, ponieważ wiem tylko, jak to zrobić w XML, o wiele lepiej.
Jérôme MEVEL
Ponadto nie ma obecnie możliwości ustawienia ścieżki docelowej w IDE, więc na razie musimy edytować XML.
Zoey Hewll
3

skopiuj z podfolderu do podfolderu

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"
Ehsäɳ Khʌɳ
źródło
7
Witamy w StackOverflow i dziękujemy za wkład. Odpowiedziałeś na naprawdę stare pytanie, które ma już kilka bardzo pozytywnych odpowiedzi. Jeśli uważasz, że twoja odpowiedź jest przydatna oprócz istniejących zaopiniowanych odpowiedzi, powinieneś dodać małe wyjaśnienie, dlaczego twoja odpowiedź rozwiązuje problem i dlaczego jest lepsza / różni się od innych.
Matthijs Wessels
1

Chcesz użyć wydarzenia Post-Build w swoim projekcie. Możesz tam określić dane wyjściowe i istnieją wartości makr dla często używanych rzeczy, takich jak ścieżka projektu, nazwa elementu itp.

Mark Sherretta
źródło
0

Możesz użyć zdarzenia PostBuild projektu. Po zakończeniu kompilacji możesz uruchomić plik wsadowy DOS i skopiować żądane pliki do żądanego folderu.

Kirtan
źródło
0

Znalazłem to pytanie podczas wyszukiwania hasła „skopiuj pliki do folderu aplikacji w czasie kompilacji”. Wygląda na to, że OP już to załatwiło, ale jeśli nie:

W programie Visual Studio kliknij plik prawym przyciskiem myszy, wybierz właściwości, a następnie zmień opcję „kopiuj na dane wyjściowe” na „zawsze”. Zobacz http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx

Colonel Panic
źródło
5
OP prosi o skopiowanie do katalogu kompilacji bez zachowania względnej struktury katalogów lokalizacji skopiowanego pliku
Áxel Costas Pena,