Derleme zamanında dosyaları uygulama klasörüne kopyalama


98

.\bin\debug\Projemden derleme klasörüne kopyalamak istediğim bazı dosyalarım varsa, onları projenin köküne koymam gerekiyor gibi görünüyor. Bunları bir alt klasöre koymak, onları .\bin\debug\depoladıkları yapıdaki klasöre kopyalar gibi görünüyor .

Bundan kaçınmamın bir yolu var mı?

Daha açıkçası: Bir varsa MyFirstConfigFile.txtve MySecondConfigFile.txtbir de ConfigFilesklasöre ve ben onların set Çıktı kopyala olmak Kopyala ... , o zaman görünür .\bin\debug\ConfigFiles\klasöre. .\bin\debug\Klasörde görünmelerini istiyorum .

Yanıtlar:


94

Bunu bir post build olayı ile yapabilirsiniz. Dosyaları derleme eylemi olmayacak şekilde ayarlayın, ardından makroda dosyaları istediğiniz dizine kopyalayın.

İşte Configuration adlı bir dizindeki tüm dosyaları kök yapı klasörüne kopyalayarak çalışacağını düşündüğüm bir post build Macro:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)

1
Hedef için $ (ProjectDir) \% (OutDir) olması gerekmez mi?
Ed Greaves

11
Doğru ve test edilmiş (Vs2010) makrosu: "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
kopyala

Ayrıca çıktı için göreli bir dosya da yapabilirsiniz: "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)" kopyasını kopyalayın
Elendurwen

3
Alıntıların kullanılmasının gerekli olduğunu düşünüyorum:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
MSVS2017'de (15.4) sadece olmalı $(OutDir)(yani olmadan $(ProjectDir)) öyle görünüyor ... aksi takdirde çift yol hataları
alıyorsunuz

51

Bunun gibi csproj'unuzda bir MSBuild görevi kullanabilirsiniz.

Csproj dosyanızı düzenleyin

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>

Bu, birçok dosyayı kopyalamak için joker karakterleri kullanabileceğiniz için en iyi çözümdür ve projede bulunmaları gerekmez.
Chris Bordeman

38

Dosyaları veya bağlantıları çözüm gezgininin kök dizinine de yerleştirebilir ve ardından dosya özelliklerini ayarlayabilirsiniz:

Build action = Content

ve

Copy to Output Directory = Copy if newer (Örneğin)

Bir bağlantı için, dosyayı Windows gezgininden, shift ve kontrol tuşlarını basılı tutarak çözüm gezginine sürükleyin.

görüntü açıklamasını buraya girin


3
Bu, OP için kabul edilmeyen orijinal göreceli yolu koruyacaktır
jlee

Dosyayı projenizin en üst düzey düğümüne koyarsanız, doğrudan $ (OutputPath) çıktı klasörüne kopyalanacaktır.
Georg

1
Kabul

7

Şahsen ben bu yolu tercih ediyorum.

.csprojEklemek için değiştirin

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

veya genelleme, tüm alt klasörleri ve dosyaları kopyalamak istiyorsanız, şunları yapabilirsiniz:

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\**">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(RecursiveDIr)\%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

1
Bence inşa sonrası etkinlikten çok daha iyi. Teşekkür ederim!
khlr

Bu, projeye sağ tıklayıp Çözüm Gezgini'nden "Var Olan Öğe Ekle" yi seçip ardından "Çıktı Dizinine Kopyala" özelliğini "Daha yeniyse kopyala" olarak ayarlamakla aynı şey değil mi? XML'yi doğrudan değiştirmeye gerek yoktur.
Antony Booth

1
@AntonyBooth bir süre sonra, IDE'nizle aynı şeyi nasıl yapacağınızı öğrenmek yerine, neler olup bittiğini anlamanın ve kodu doğrudan değiştirmenin her zaman daha kolay olduğunu fark edeceksiniz. Bugün Visual Studio kullanıyorsunuz, yarın JetBrains Rider ve yarın VS Code'dan sonraki gün olabilir. Sonunda, bir IDE yerine bir dili öğrenmek her zaman daha iyidir. Not: Tanımladığınız şeyin aynı olup olmadığını bilmiyorum çünkü sadece XML'de nasıl yapılacağını biliyorum, bunun gibi çok daha iyi.
Jérôme MEVEL

Ek olarak, IDE içinde hedef yolu belirlemenin şu anda bir yolu yoktur, bu nedenle şimdilik XML'yi düzenlememiz gerekiyor.
Zoey Hewll

3

alt klasörden alt klasöre kopyala

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

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"

8
StackOverflow'a hoş geldiniz ve katkıda bulunduğunuz için teşekkürler. Halihazırda yüksek oy alan bir sürü yanıtı olan gerçekten eski bir soruyu yanıtladınız. Cevabınızın mevcut yükseltilmiş cevaplara ek olarak sahip olmanın yararlı olduğunu düşünüyorsanız, cevabınızın sorunu neden çözdüğüne ve diğerlerinden neden daha iyi / farklı olduğuna dair küçük bir açıklama eklemelisiniz.
Matthijs Wessels

1

Projenizde Post-Build olayı kullanmak istiyorsunuz. Çıktıyı orada belirtebilirsiniz ve proje yolu, öğe adı vb. Gibi sık kullanılan şeyler için makro değerleri vardır.


0

Projenin PostBuild olayını kullanabilirsiniz. Oluşturma tamamlandıktan sonra, bir DOS toplu iş dosyası çalıştırabilir ve istediğiniz dosyaları istediğiniz klasöre kopyalayabilirsiniz.


0

Bu soruyu "dosyaları derleme sırasında uygulama klasörüne kopyala" aramasıyla buldum. OP bunu zaten sıraladı gibi görünüyor, ancak yapmazsanız:

Visual Studio'da dosyaya sağ tıklayın, özellikleri seçin, ardından 'çıktıya kopyala' seçeneğini 'her zaman' olarak değiştirin. Bkz. Http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP, kopyalanan dosya konumunun ilgili dizin yapısını korumadan dizini derlemek için kopyalamayı ister
Áxel Costas Pena
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.