Visual Studio: Beberapa perintah pasca-bangun?

101

Visual Studio 2008 memungkinkan saya mendeklarasikan perintah dan melampirkannya ke acara pasca-pembuatan untuk sebuah proyek. Seperti kebanyakan pengembang, saya menggunakannya secara teratur untuk menyalin file ke direktori keluaran aplikasi.

Saya sedang mengerjakan proyek di mana saya perlu menyalin file dari dua tempat berbeda ke dua tujuan berbeda, semuanya dalam satu proyek. Dengan kata lain, saya perlu menjalankan dua perintah xcopy yang berbeda dari acara pasca-pembangunan yang sama. Sepertinya event post-build hanya akan mengambil satu perintah, dan jika saya perlu memanggil beberapa perintah, saya harus meletakkan perintah di file * .bat dan memanggilnya dari event post-build.

Apakah itu benar, atau adakah cara yang lebih sederhana untuk memanggil dua perintah dari event post-build? Terima kasih sebelumnya atas bantuan Anda.

David Veeneman
sumber

Jawaban:

124

Anda dapat mengetikkan perintah post build sebanyak yang Anda inginkan. Pisahkan saja dengan baris baru.

Inilah contoh dari salah satu proyek saya.

Post Build Event Commandline

womp
sumber
3
Menyertakan tangkapan layar hanya berguna jika Anda ingin menyimpannya selamanya.
Amandalishus
1
@ OWenJ23 ... atau 'imageshack' dalam kasus ini;)
Anthony Walsh
28
Meskipun berada di baris terpisah, perintah saya dijalankan bersama seolah-olah berada di satu baris.
Trevor
6
Sayangnya, tampaknya setidaknya VS2015 tidak melaporkan kesalahan jika salah satu perintah perantara gagal ... ini melaporkan hasil dari perintah terakhir sebagai hasil dari langkah pasca-pembuatan.
Johannes S.
3
Tampaknya ini berfungsi dari dalam Visual Studio - tetapi tidak didukung jika Anda menggunakan MsBuild di mesin build TFS. MsBuild menghapus jeda baris dan kemudian gagal perintah karena sintaks yang buruk.
Jeff B
107

Penting: Saat menjalankan file batch, Anda harus menggunakan pernyataan "call" untuk menjalankan baris berikut. Jika Anda tidak menggunakan "call", eksekusi akan masuk ke .bat dan tidak kembali ke baris berikut. Sama seperti pada DOS prompt.

misalnya:

call MyBatch1.bat
call MyBatch2.bat
huha
sumber
3
Tip ini berlaku untuk perintah grunt dan npm karena keduanya dijalankan melalui file batch (grunt.cmd dan npm.cmd).
Matt Varblow
16

Ada opsi lain: Anda dapat memisahkan perintah dengan &&. Misalnya

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Ini tidak persis sama dengan memisahkan dengan baris baru: dengan &&, jika perintah sebelumnya gagal, perintah berikutnya tidak akan dijalankan.

Memisahkan dengan baris baru lebih mudah dibaca, jadi Anda harus lebih memilihnya. Namun saya tahu setidaknya satu kasus bila &&berguna. Ini adalah skenario, ketika Anda menggunakan lembar properti untuk memiliki langkah pasca-pembuatan yang berbeda pada mesin yang berbeda. VS 2008 tidak mengizinkan pengaturan PostBuildStep di lembar properti secara langsung, tetapi Anda dapat menambahkan makro pengguna dengan perintah Anda dan memanggilnya dari pengaturan proyek utama. Makro adalah satu baris, sehingga Anda dapat menggunakan &&beberapa perintah di sana.

Kuda
sumber
11

Setiap perintah harus berada di baris terpisah. Apa yang saya temukan adalah bahwa jika ada kesalahan dalam mengeksekusi salah satu dari perintah tersebut, keseluruhan post-build gagal dan Anda harus mencoba setiap perintah post-build satu per satu untuk men-debug.

Lisa
sumber
2
"xcopy / f" akan menampilkan sumber lengkap dan nama file target, yang akan dicetak sebelum kegagalan, membuat beberapa perintah xcopy lebih mudah didiagnosis daripada beberapa perintah salin.
yoyo
9

Memisahkan perintah dengan & atau && atau; tidak berfungsi di VS2017. Tidak dapat mempercayai fungsi sederhana seperti itu tidak tersedia di VS2017. Visual studio mencoba mengeksekusi seluruh teks di jendela event post build sebagai satu string. Satu-satunya pilihan bagi saya sekarang adalah membuat skrip batch yang tidak terlalu saya sukai.

Indera
sumber
1
Memisahkan perintah dengan && berfungsi untuk saya di VS2017. Menentukan setiap perintah pada baris terpisah di editor VS2017 tidak berfungsi untuk saya.
Codesniffer
5

Menambah Womp 's jawabannya :

Jika Anda memiliki beberapa lembar properti dengan sesuatu yang harus dilakukan pada peristiwa build yang sama, Anda dapat melakukan hal berikut untuk merangkai perintah:

%(Command)
echo foo

dimana %(Command)mengembang ke nilai sebelumnya dari perintah.

Secara pribadi saya melakukan ini untuk semua acara pembangunan, meskipun saat ini saya tidak memiliki perintah yang diwariskan, karena ini memastikan tidak akan ada masalah jika saya menambahkan lembar properti nanti.

Max Truxa
sumber
1
Ini juga berfungsi dengan Langkah Pembuatan Kustom. Selain itu, menjalankan exitpernyataan batch di mana saja di sepanjang rantai menyebabkan rantai tersebut dibatalkan. Memang exit 1menyebabkan build gagal sementara exit 0hanya membatalkan langkah dan build berlanjut.
Martin Connell
3

Di Visual Studio 2017 Anda dapat melakukan ini:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>
Jonathan Weesner
sumber
1
Saya mengedit .csproj dan menambahkan <Command> </Command> di sekitar dua perintah event postbuild saya. Sepertinya itu tidak berhasil. Ketika saya melihat Build Events di Visual Studio, itu memiliki <Command> </Command> di sekitar dua perintah, tetapi memberikan kesalahan build: Perintah "<Command xmlns =" ​​.. "> command1 command2 </Command>" keluar dengan kode 255.
Jimmy
1

Pendekatan yang disarankan oleh womp berfungsi di Visual Studio 2015/2017 (Windows), tetapi tidak berfungsi di Visual Studio untuk Mac (Pratinjau), yang tampaknya hanya menjalankan perintah pertama. Satu-satunya pendekatan yang saya temukan berfungsi di Visual Studio versi Mac dan Windows adalah merangkai 2 perintah MSBuild:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

Contoh di atas menggunakan acara "AfterResolveReferences" tetapi seharusnya juga berfungsi untuk acara PostBuild.

Crulex
sumber
1

Tidak ada solusi yang baik untuk masalah ini. Gagasan panggilan menyebabkan skrip lain berjalan. Saya perhatikan bahwa deteksi kesalahan tidak akan berfungsi. Masukkan 'exit / b 1' ke FailMe.cmd. Gunakan 'panggil FailMe.cmd' di langkah-langkah pembuatan posting. Perhatikan bahwa build tidak gagal? Saya menggunakan VS 2017 untuk membangun proyek C #. Sekarang coba dengan 'FailMe.cmd'. Build sekarang melaporkan kesalahan.

Jadi, Anda mungkin lebih baik hanya menggunakan satu skrip, jika pelaporan kesalahan itu penting.

Richard Meadows
sumber
-4

Cukup awali "panggilan" ke skrip batch Anda. Sehingga pernyataan di bawah skrip Batch juga dijalankan setelah mengembalikan panggilan dari skrip batch.

call Script1.cmd
call Script2.bat
msKing
sumber