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.

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


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

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.


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.


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.


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.


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>

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.


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.


-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.