Visual Studio Post Build Event - Salin ke Lokasi Direktori Relatif

228

Pada build yang berhasil, saya ingin menyalin isi direktori output ke lokasi yang berbeda di bawah folder "base" yang sama . Folder induk ini adalah bagian relatif dan dapat bervariasi berdasarkan pengaturan Kontrol Sumber.

Saya telah mendaftarkan beberapa nilai Makro yang tersedia untuk saya ...

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

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

Saya ingin menyalin konten Output Dir ke folder berikut:

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

Lokasi dasar "D: \ GlobalDir \ Version \ AppName" perlu diambil dari salah satu makro di atas. Namun, tidak ada nilai makro yang mencantumkan hanya lokasi induk.

Bagaimana cara mengekstrak hanya lokasi dasar untuk perintah copy build post?

Preet
sumber

Jawaban:

188

Jika tidak ada TargetDir atau makro lain menunjuk ke tempat yang tepat, gunakan direktori ".." untuk naik kembali ke hierarki folder.

yaitu. Gunakan $(SolutionDir)\..\..untuk mendapatkan direktori basis Anda.


Untuk daftar semua makro, lihat di sini:

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

gbjbaanb
sumber
Terima kasih!! Tip yang bagus
Merlyn007
293

Inilah yang ingin Anda masukkan ke dalam baris perintah acara pasca-bangun proyek:

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

EDIT: Atau jika nama target Anda berbeda dari Nama Proyek.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"
Lucas B
sumber
1
Tip yang bagus. Saya lupa tanda kutip.
Matt Montag
3
Itu tidak bekerja untuk saya karena saya lupa /Y. Terima kasih telah menunjukkan seluruh perintah.
Tandai
10
Satu dapat digunakan xcopydengan wildcard dan switch yang sesuai untuk mencapai hasil yang sama, sambil mempertahankan struktur (folder) folder sumber, seperti:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku
4
Saya akan menyarankan untuk menggunakan $ (TargetName) daripada $ (ProjectName) di bagian-sumber.
Alexander Schmidt
2
perbarui ke saya sebelumnya. komentar copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\":, tanpa backslash tambahan, karena $ (SolutionDir) termasuk backslash tambahan (setidaknya dalam VS2012)
es
40

Kamu bisa mencoba:

$(SolutionDir)..\..\
Ichiban
sumber
8
Harap diingat bahwa variabel $ (SolutionDir) sudah memiliki back slash. Sumber: "Direktori solusi (didefinisikan dengan drive dan path); termasuk trailing backslash '\'." msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker
10

Saya pikir ini terkait, tapi saya punya masalah ketika membangun langsung menggunakan msbuildbaris perintah (dari file batch) vs membangun dari dalam VS.

Menggunakan sesuatu seperti berikut:

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

(catatan: start XCOPYdaripada XCOPYdigunakan untuk mengatasi masalah izin yang mencegah penyalinan)

Makro $(SolutionDir)dievaluasi ..\ketika mengeksekusi msbuild dari batchfile, yang mengakibatkan XCOPYperintah gagal. Jika tidak berfungsi dengan baik ketika dibangun dari dalam Visual Studio. Dikonfirmasi menggunakan /verbosity:diagnosticuntuk melihat output yang dievaluasi.

Menggunakan makro $(ProjectDir)..\sebagai gantinya, yang berjumlah hal yang sama, bekerja dengan baik dan mempertahankan jalur penuh di kedua skenario pembuatan.

drzaus
sumber
1
tautan silang ke
retasan
Startbekerja untuk saya (untuk xcopydi folder bersama).
AgentFire
4

Tidakkah masuk akal untuk menggunakan msbuild secara langsung? Jika Anda melakukan ini dengan setiap build, maka Anda dapat menambahkan tugas msbuild di akhir? Jika Anda hanya ingin melihat apakah Anda tidak dapat menemukan nilai makro lain yang tidak ditampilkan pada Visual Studio IDE, Anda bisa mengaktifkan opsi msbuild untuk diagnostik dan yang akan menunjukkan kepada Anda semua variabel yang bisa Anda gunakan, seperti serta nilai mereka saat ini.

Untuk mengaktifkan ini di dalam studio visual, pergi ke Alat / Opsi kemudian gulir ke bawah tampilan pohon ke bagian yang disebut Proyek dan Solusi, perluas itu dan klik Build and Run, di sebelah kanan mereka adalah drop down yang menentukan verbosity output build , mengaturnya ke diagnostik, akan menunjukkan kepada Anda nilai makro apa yang bisa Anda gunakan.

Karena saya tidak tahu sampai tingkat apa yang ingin Anda tuju, dan seberapa kompleks Anda ingin membangun Anda, ini mungkin memberi Anda beberapa ide. Saya baru-baru ini melakukan skrip build, yang bahkan mengeksekusi kode SQL sebagai bagian dari build. Jika Anda ingin bantuan lagi atau bahkan beberapa contoh skrip build, beri tahu saya, tetapi jika itu hanya proses kecil yang ingin Anda jalankan di akhir build, skrip msbuild lengkap yang sedang berjalan mungkin sedikit berlebihan. .

Semoga ini membantu Rihan

Rihan Meij
sumber
thx Rihan, tetapi tampaknya VS 2003 tampaknya tidak mendukung ini! Tentu saja saya cukup puas dengan acara post build ;-)
Preets
Saya tidak menyadari itu vs2003, dan karenanya menggunakan msbuild sebagai solusi yang memungkinkan, jika saya ingat vs2003 adalah pra era msbuild? Terima kasih atas tanggapannya. Best of luck with VS 2003, saya tidak melihat ke belakang setelah pindah ke VS2005
Rihan Meij