Menyalin file ke dalam folder aplikasi pada waktu kompilasi

96

Jika saya memiliki beberapa file yang ingin saya salin dari proyek saya ke dalam .\bin\debug\folder saat kompilasi, maka sepertinya saya harus meletakkannya di root proyek. Menempatkannya ke dalam subfolder tampaknya akan menyalinnya ke .\bin\debug\folder dalam struktur yang sama dengan tempat penyimpanannya.

Apakah ada cara untuk menghindari hal ini?

Hanya untuk memperjelas: jika saya memiliki MyFirstConfigFile.txtdan MySecondConfigFile.txtdi dalam ConfigFilesfolder dan saya mengatur Salin ke Output menjadi Salin ... , maka mereka akan muncul di .\bin\debug\ConfigFiles\folder. Saya ingin mereka muncul di .\bin\debug\folder.

Andrew Ducker
sumber

Jawaban:

94

Anda dapat melakukan ini dengan acara pasca membangun. Setel file ke tanpa tindakan pada kompilasi, lalu di makro salin file ke direktori yang Anda inginkan.

Berikut adalah post build Macro yang menurut saya akan berfungsi dengan menyalin semua file dalam direktori bernama Konfigurasi ke folder root build:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)
JoshBerke
sumber
1
Untuk tujuan, bukankah seharusnya $ (ProjectDir) \% (OutDir)?
Ed Greaves
11
Makro yang benar dan diuji (Vs2010) adalah: salin "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot
Anda juga dapat melakukan file relatif untuk keluaran: salin "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen
3
Saya pikir penggunaan tanda kutip perlu:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus
1
Di MSVS2017 (15.4) seharusnya $(OutDir)(yaitu tanpa $(ProjectDir)) tampaknya ... jika tidak, Anda akan mendapatkan kesalahan jalur ganda
JHBonarius
51

Anda dapat menggunakan tugas MSBuild di csproj Anda, seperti itu.

Edit file csproj Anda

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>
Jhonny D. Cano -Leftware-
sumber
Ini adalah solusi terbaik karena Anda dapat menggunakan wildcard untuk menyalin banyak file, dan mereka tidak perlu berada dalam proyek.
Chris Bordeman
38

Anda juga dapat meletakkan file atau tautan ke root explorer solusi dan kemudian mengatur properti file:

Build action = Content

dan

Copy to Output Directory = Copy if newer (sebagai contoh)

Untuk tautan seret file dari windows explorer ke explorer solusi dengan menahan tombol shift dan kontrol.

masukkan deskripsi gambar di sini

Georg
sumber
3
Ini akan mempertahankan jalur relatif asli, yang tidak dapat diterima oleh OP
jlee
Jika Anda meletakkan file tersebut ke node tingkat atas proyek Anda, maka file tersebut akan disalin langsung ke folder output $ (OutputPath).
Georg
1
Lihat posting ini untuk alternatif yang dapat diterima
Zoey Hewll
5

Secara pribadi saya lebih suka cara ini.

Ubah .csprojuntuk menambahkan

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
Jérôme MEVEL
sumber
1
Menurut saya jauh lebih baik daripada event event post-build. Terima kasih!
khlr
Bukankah ini sama dengan mengklik kanan proyek dan memilih "Add | Existing Item" dari Solution Explorer, kemudian mengatur properti File "Salin ke Direktori Output" menjadi "Salin jika lebih baru". Tidak perlu mengubah XML secara langsung.
Antony Booth
1
@AntonyBooth setelah beberapa saat Anda akan menyadari bahwa selalu lebih mudah untuk memahami apa yang terjadi dan memodifikasi kode secara langsung daripada mempelajari cara melakukan hal yang sama dengan IDE Anda. Hari ini Anda menggunakan Visual Studio, besok mungkin JetBrains Rider dan lusa VS Code. Pada akhirnya, Anda selalu lebih menguasai suatu bahasa daripada IDE. PS: Saya tidak tahu apa yang Saudara gambarkan itu sama karena saya hanya tahu bagaimana melakukannya dalam XML, jauh lebih baik seperti ini.
Jérôme MEVEL
Selain itu, saat ini tidak ada cara untuk menyetel jalur target dalam IDE, jadi untuk saat ini kami harus mengedit XML.
Zoey Hewll
3

salin dari subfolder ke subfolder

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

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"
Ehsäɳ Khʌɳ
sumber
7
Selamat datang di StackOverflow dan terima kasih telah berkontribusi. Anda telah menjawab pertanyaan yang sangat lama yang sudah memiliki banyak jawaban yang sangat disukai. Jika menurut Anda jawaban Anda bermanfaat untuk dimiliki selain jawaban positif yang ada, Anda harus menambahkan sedikit penjelasan mengapa jawaban Anda menyelesaikan masalah dan mengapa lebih baik / berbeda dari yang lain.
Matthijs Wessels
1

Anda ingin menggunakan acara Pasca-Bangun pada proyek Anda. Anda dapat menentukan output di sana dan ada nilai makro untuk hal-hal yang sering digunakan seperti jalur proyek, nama item, dll.

Mark Sherretta
sumber
0

Anda dapat menggunakan acara PostBuild dari proyek tersebut. Setelah build selesai, Anda dapat menjalankan file batch DOS dan menyalin file yang diinginkan ke folder yang Anda inginkan.

Kirtan
sumber
0

Saya menemukan pertanyaan ini mencari "salin file ke folder aplikasi pada waktu kompilasi". OP tampaknya sudah mengurutkan ini, tetapi jika Anda tidak:

Di Visual Studio klik kanan file tersebut, pilih properties, kemudian ubah opsi 'copy to output' menjadi 'always'. Lihat http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx

Kolonel Panic
sumber
5
OP meminta penyalinan ke direktori kompilasi tanpa menjaga struktur direktori relatif dari lokasi file yang disalin
Áxel Costas Pena