tentukan file proyek solusi menggunakan msbuild

116

Saya ingin baris perintah untuk membangun proyek tertentu dari solusi menggunakan msbuild seperti yang kita lakukan dengan devenv.com. Di devenv.com kita dapat menentukan proyek solusi menggunakan baris perintah berikut

devenv.com /Build Release|x86 test.sln /project "testproject"

Menggunakan baris perintah di atas saya dapat membangun proyek uji di test.sln menggunakan devenv.com. Apa baris perintah untuk msbuild untuk solusi yang sama.

Terima kasih

tjdoubts
sumber
Adakah alasan mengapa Anda tidak hanya meneruskan testproject itu sendiri ke msbuild?
Mark Smith
2
Karena saya tidak bisa lagi mengedit komentar saya. Yang saya maksud adalah mereferensikan proyek secara langsung, bukan solusinya. "msbuild testproject / p: Konfigurasi = Rilis / p: Platform = x86"
Mark Smith
waktu yang berbeda saya harus membangun proyek yang berbeda. menggunakan devenv.com mudah dengan menentukan proyek solusi itu
tjdoubts
Jika itu satu-satunya masalah yang Anda hadapi, Anda harus dapat menggunakan msbuild untuk membangun proyek yang diperlukan pada waktu yang tepat. Anda sudah memiliki perintah berbeda yang Anda jalankan pada waktu yang berbeda pada solusi, jadi mengapa tidak merujuk proyek pada waktu yang tepat dengan perintah msbuild yang berbeda? Jika proyek Anda disiapkan dengan benar, mereka harus mencari tahu semua referensinya tanpa menggunakan file sln.
Mark Smith

Jawaban:

202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Perhatikan bahwa yang ditugaskan /tadalah nama proyek dalam solusi, itu bisa berbeda dari nama file proyek.

Juga, seperti yang dinyatakan di Cara: Membangun target spesifik dalam solusi menggunakan MSBuild.exe :

Jika nama proyek berisi salah satu karakter %, $, @, ;, ., (, ), atau ', menggantinya dengan _nama target yang ditentukan.

Anda juga dapat membangun banyak proyek sekaligus:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Untuk membangun kembali atau membersihkan, ubah /t:projectke /t:project:cleanatau/t:project:rebuild

Easton L.
sumber
99
Satu catatan penting: jika proyek Anda memiliki '.' dalam nama, Anda harus menggantinya dengan '_' saat menentukannya dengan / t
Watusimoto
4
@easton Untuk membangun beberapa proyek, synthax adalah untuk msbuild saya mengulangi /tparameter untuk setiap proyek yang akan dibangun:msbuild test.sln /t:project /t:project2
Philippe
46
Selain itu, jika Anda menggunakan folder solusi, Anda harus mengawali nama proyek dengan nama folder dan garis miring. Seperti @Watusimoto yang disebutkan di atas, jika Anda memiliki titik (.) Pada nama, Anda harus menggantinya dengan garis bawah (_). Saya berakhir dengan sesuatu seperti ini: /t:SlnFolder\My_Project_name.
Travis Parks
28
@TravisParks: Mungkin juga perlu disebutkan bahwa "folder solusi" tidak merujuk ke folder sistem file melainkan folder dalam tampilan Solution Explorer.
joshbodily
4
Saya juga harus mengganti '(' dan ')' dengan '_' di nama folder (proyek yang dihasilkan GYP). Saya kira itu semua karakter khusus diganti dengan garis bawah.
Maxime Viargues
15

MSBuild sebenarnya bekerja melalui penggunaan proyek bukan solusinya. Solusinya hanya digunakan untuk mengurai menjadi file proyek sementara di MSBuild secara internal. Anda seharusnya dapat membangun proyek yang diminati secara langsung melalui MSBuild dengan menjalankan perintah berikut.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Ada satu masalah besar yang saya tahu Anda dapat menggunakan proyek secara langsung daripada solusinya: jika Anda menggunakan solusi untuk mengekspresikan ketergantungan antar proyek, alih-alih menambahkan referensi ke proyek dan membiarkan sistem build mengerjakan dependensi secara otomatis .

Jika Anda menerapkan urutan build menggunakan file sln, saya sarankan untuk mengerjakan dependensi tersebut langsung ke file proj dan menghapusnya dari sln. Ini akan memungkinkan Anda untuk memanggil file proj dari MSBuild secara langsung dan semua proyek akan dibangun secara independen tanpa pekerjaan tambahan. Anda benar-benar harus memperlakukan file sln sebagai sekelompok proyek untuk membuat pekerjaan di Visual Studio lebih mudah dan bukan sebagai input build.

Mark Smith
sumber
4
Harap tunjukkan bagaimana urutan build dapat diterapkan dari file proj. Terima kasih.
ProgramCpp
4
Berikut adalah masalah lain dengan menggunakan nama proyek secara langsung. Misalnya, Anda memiliki 5 proyek dalam solusi Anda. Beberapa proyek memiliki konfigurasi DebugPro dan proyek lain tidak memilikinya. Jika Anda membuat proyek dengan konfigurasi bahwa semua proyek memiliki semuanya adalah file tetapi hanya file solusi yang tahu konfigurasi proyek mana yang akan digunakan untuk setiap proyek jika Anda memilih konfigurasi solusi DebugPro.
Alex
@ProgramCpp Saat Anda menambahkan referensi dari satu proyek ke proyek lainnya, secara otomatis akan mengetahui bahwa proyek yang direferensikan perlu dibangun terlebih dahulu.
jpaugh
Kerugian lain dari pendekatan ini adalah bahwa jalur relatif dalam proyek diselesaikan relatif terhadap file solusi. Setelah Anda membangun proyek, jalur relatif secara langsung akan berubah. Output mungkin ada di tempat lain dan pengujian unit mungkin mencari direktori yang salah.
Tomas Kubes
Masalah juga dapat muncul jika Anda menggunakan variabel solusi dalam konfigurasi proyek, seperti $ (SolutionDir)
Alex Che
8

Posting sebagai informasi untuk pencari masa depan

Tambahkan yang berikut ini ke skrip build dan jalankan sekali. Ini akan menghasilkan target yang tepat dan informasi lain yang benar-benar akan digunakan msbuild.

Contoh: Jika Anda memiliki .nama proyek atau folder, msbuild akan mengharapkan _di tempat ..

set MSBuildEmitSolution=1

Setelah mendapatkan informasi, perbarui skrip build dengan detail yang diperlukan.

freshprinze
sumber
6
`Jika Anda memiliki '.' dalam nama proyek atau folder msbuild akan mengharapkan '_' menggantikan '.'. `
dhcgn
2

Untuk melakukan ini, Anda perlu tahu apa nama target proyek , tidak harus nama proyek.

Salah satu cara untuk mengetahuinya adalah dengan menggunakan MSBuild terhadap SLN Anda dengan parameter yang dimaksudkan setelah menyetel variabel lingkungan khusus yang dipanggil MSBuildEmitSolutionke nilai 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Saya baru-baru ini harus melakukan ini karena nama yang sangat spesifik untuk target di direktori bersarang. Jadi dari file yang saya buat, my_stuff.sln.metaprojsaya menemukan baris ini:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Itu berarti baris perintah yang akan digunakan akhirnya menjadi,

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64
kayleeFrye_onDeck
sumber
2
Inilah yang saya butuhkan. Petunjuk jika Anda tidak ingin menjalankan ini: target Anda adalah struktur folder dari jalur saat ini ke file proyek Anda, tanpa ekstensi file proyek ( .csprojdalam kasus saya). AKU <3 JADI!
Tidak Ada Pengembalian Dana Tidak Ada Pengembalian
1

Hanya untuk menambahkan informasi tambahan, menjalankan msbuild di folder proyek secara default akan membangun file proyek karena satu-satunya di sana.

>msbuild

Ada banyak variasi penggunaan msbuild dengan cara ini. Anda dapat menentukan file proj secara langsung.

>msbuild helloworld.csproj -t:Build.

Tinjau dokumentasi msbuild untuk penggunaan, persyaratan file proj, serta manfaat membangun proyek alih-alih solusinya.

Dokumentasi MS MSBuild

Ada keuntungan membangun dengan cara ini seperti yang disebutkan oleh mark-smith di atas.

CJ
sumber