Mengapa saya harus menggunakan file MSBuild bukannya Visual Studio Solution?

21

Kami menggunakan TeamCity untuk integrasi berkesinambungan dan ini membangun rilis kami melalui file solusi (.sln). Saya telah menggunakan Makefiles di masa lalu untuk berbagai sistem tetapi tidak pernah msbuild (yang saya dengar agak mirip dengan Makefiles + XML mashup). Saya telah melihat banyak posting tentang cara menggunakan msbuild secara langsung daripada file solusi tetapi saya tidak melihat jawaban yang sangat jelas tentang mengapa melakukannya.

Jadi, mengapa kita harus repot bermigrasi dari file solusi ke 'makefile' MSBuild? Kami memang memiliki beberapa rilis yang berbeda dengan #define (build khusus) tetapi untuk sebagian besar semuanya berfungsi.

Kekhawatiran yang lebih besar adalah bahwa sekarang kita harus memelihara dua sistem ketika menambahkan proyek / kode sumber.

MEMPERBARUI:

Bisakah orang menjelaskan siklus hidup dan saling mempengaruhi dari tiga komponen berikut?

  1. File .sln Visual Studio
  2. Banyak file .csproj tingkat proyek (yang saya pahami skrip msbuild "sub")
  3. Skrip msbuild khusus

Apakah aman untuk mengatakan bahwa .sln dan .csproj dikonsumsi / dipelihara seperti biasa dari dalam Visual Studio IDE GUI sementara skrip msbuild kustom ditulis tangan dan biasanya mengkonsumsi .csproj individual yang sudah ada "apa adanya"? Itu salah satu cara saya melihat pengurangan tumpang tindih / duplikat dalam pemeliharaan ...

Akan menghargai beberapa cahaya tentang ini dari pengalaman operasional orang lain

DeepSpace101
sumber
So, why should we bother migrating from solution files to an MSBuild 'makefile'?Pertama, Anda harus memberi tahu Anda mengapa Anda mempertimbangkannya? Apakah file solusinya tidak cukup?
jgauffin
3
Karena itu dianggap sebagai latihan yang lebih baik. Untuk pertanyaan terakhir Anda; mungkin itu, mungkin tidak. Karena itulah pertanyaan ini dijelajahi untuk mendapatkan jawaban yang lebih jelas.
DeepSpace101
2
Because it's reputed to be better practicedimana?
jgauffin
3
Pemisahan IDE (file sln) dari build jelas merupakan desain SE yang bagus. Jeff menulis tentang hal itu di codinghorror.com/blog/2007/10/… jika Anda menginginkan detail. Plus itu bagus untuk menjalankan tes dan bahkan kemasan perangkat lunak (setup.exe atau msi) sebagai bagian dari skrip build rilis bukan hanya mengkompilasi build.
DeepSpace101
1
@jgauffin: sedodream.com/2010/03/19/…
Josh Noe

Jawaban:

16

Fakta pertama adalah bahwa file solusi secara ajaib menjadi file MSBuild ketika MSBuild mengeksekusinya - yang adalah apa yang terjadi ketika Anda membangun solusi di visual studio. Selain itu, semua file proyek tersebut hanya file msbuild yang dikelola oleh visual studio. Bahkan, file proyek menangani sebagian besar pekerjaan kotor yang sebenarnya di sini tidak masalah jika Anda membangun dari solusi atau membangun dari skrip msbuild kustom.

Kami juga menggunakan TeamCity untuk membangun dan menerbitkan aplikasi dan kami biasanya akan berakhir dengan skrip msbuild khusus untuk sebagian besar proyek. Peran yang dimainkan skrip ini - yang tidak mudah dengan file solusi - mengemas proyek untuk penyebaran atau distribusi. Biasanya skrip ini menangani beberapa aspek operasional lebih banyak hal - seperti membangun proyek web ke folder tertentu atau menyalin dalam konfigurasi yang sedang berjalan sebagai lawan dari konfigurasi pengembangan. Pengangkatan berat cenderung ditangani dalam file proyek sendiri - skrip build hanya mereferensikannya, kami tidak mencoba dan membuat ulang roda itu. Secara keseluruhan ini berfungsi dengan baik dan tidak terlalu banyak kode duplikat.

Wyatt Barnett
sumber
Jadi Anda menggunakan sln + csproj di Visual Studio dan kemudian sama seperti-adalah skrip msbuild + csproj kustom pada server build? Saya sudah sedikit menjelaskan pertanyaan. Terima kasih!
DeepSpace101
Ya, secara fungsional mereka sama.
Wyatt Barnett
15

Makefile untuk msbuild adalah file .sln (atau file vcproj).

Baris perintah msbuild tipikal adalah:

msbuild /p:Configuration=Release BigProject.sln

Inti dari menggunakan msbuild adalah agar Anda dapat membuat skrip dan mengotomatiskan proses pembuatan. Apakah Anda menyadarinya atau tidak, TeamCity telah menggunakan msbuild selama ini.

Charles E. Grant
sumber
Apa yang Anda pikirkan pada bagian terakhir, pada potensi tumpang tindih dari berbagai komponen? Saya (mudah-mudahan!) Telah mengklarifikasi pertanyaan sedikit lebih ... thx
DeepSpace101
3

Izinkan saya menawarkan pendapat saya tentang pertanyaan ini.

Meskipun Anda tentu saja dapat menggunakan file .SLN sebagai 'proses pembangunan', file itu sendiri sebenarnya bukan merupakan proses pembangunan. File Solusi benar-benar hanya bagian dari Visual Studio dan digunakan untuk pengembangan. Tetapi Visual Studio hanyalah bagian dari proses build dan release. Anda tidak dapat mengandalkan Solusi untuk mengelola bangunan Anda, dan Solusi tentu saja tidak menawarkan situasi bangunan yang dapat diskalakan.

Seluruh tujuan membangun proses pembangunan adalah untuk menciptakan bangunan yang andal. Dengan kata lain, proses build sangat andal sehingga tidak peduli konfigurasi build, Anda akan mendapatkan output build yang dapat diprediksi. Setiap saat, setiap mesin. Hasil dari bangunan yang dapat diprediksi dan andal adalah bahwa pengujian, penyebaran, dan proses rilis kemudian dapat sangat otomatis, lebih lanjut mengurangi risiko kesalahan manusia.

Membangun proses pembangunan membutuhkan investasi, tetapi dalam kasus tertentu, investasi diperlukan. Berikut adalah beberapa faktor yang mendukung proses msbuild:

  • Produk Anda memiliki banyak tim (lintas fungsi atau lainnya) yang bekerja dalam proyek tim yang sama
  • Organisasi Anda hanya memiliki satu proyek tim (harus menjadi kasus untuk 99% toko tradisional, bahkan yang memiliki 200+ pengembang)
  • Anda memiliki lebih dari 20 proyek yang perlu dibangun, beberapa di antaranya memiliki ketergantungan pada yang lain dan dikelola oleh tim yang berbeda
  • Produk Anda menggabungkan beberapa teknologi .NET (C #, C ++, VB, F #, ASP.NET, dll.), Atau bahkan teknologi non-.NET (Grunt, node, npm, Java, dll)
  • Produk Anda memiliki ketergantungan kelas berat atau dibangun di atas platform kelas berat. SharePoint, sebagai contoh

Biarkan saya memberi contoh untuk memperluas poin terakhir saya. Perusahaan saya saat ini melakukan pengembangan SharePoint. Pengembangan SharePoint minimal memerlukan fondasi SharePoint yang harus diinstal untuk melakukan pembangunan di proyek SharePoint. Berbicara dalam hal server build yang ringan, sama sekali tidak praktis untuk meminta server build untuk menginstal SharePoint. SharePoint tidak hanya binatang buas dengan persyaratan tinggi tetapi juga akan memiliki implikasi kinerja yang serius pada build - dan build seharusnya secepat dan ramping mungkin. Memanfaatkan MSBuild memungkinkan saya untuk menghilangkan persyaratan instalasi ini di server build. Bahkan, server build kami tidak memiliki persyaratan instalasi selain kerangka NET. (Diperlukan oleh MSBuild) dan Node.

Sebagai referensi, saya akan merekomendasikan untuk memeriksa buku ini oleh Sayed Ibrahim Hashimi: http://www.amazon.com/Inside-Microsoft-Build-Engine-Foundation/dp/0735645248/ref=sr_1_fkmr0_1?ie=UTF8&qid=1412014650&sr= 8-1-fkmr0 & kata kunci = msbuild + andal + build

Mike Gilmore
sumber
1
Apa yang harus dilakukan dengan menggunakan file msbuild alih-alih file sln dengan tidak harus menginstal SharePoint di server build? Ini adalah konsep yang sama sekali tidak terkait. File solusi tidak membawa ketergantungan apa pun. Selain itu, Anda tentu dapat mengandalkan file solusi untuk mengelola bangunan Anda, karena inilah yang telah dilakukan perusahaan kami selama bertahun-tahun tanpa masalah. Saya pikir Anda mungkin membingungkan solusi dan file msbuild dengan alat msbuild itu sendiri, yang juga mendukung file solusi. Kami tidak menggunakan studio visual untuk mengkompilasi solusi di mesin build.
julealgon
+1 untuk penjelasan Anda tentang "Organisasi Anda hanya memiliki satu proyek tim". Menyedihkan bagi saya untuk melihat orang menggunakan beberapa Proyek Tim sebagai batasan untuk hal-hal seperti 'produk' atau 'proyek' di toko-toko kecil tersebut. Saya mengambil pendekatan proyek tim tunggal dan mudah-mudahan tidak akan pernah kembali.
JohnZaj
2

Ini persis pertanyaan yang saya tanyakan pada diri sendiri beberapa bulan yang lalu! Kami memiliki segalanya yang diatur dengan baik:

  • File solusi dengan baik di root repositori
  • Buat langkah-langkah yang dikonfigurasi dalam Teamcity, seperti
    • Kembalikan paket NuGet
    • Bangun solusi
    • Jalankan Tes Unit
    • Pengaturan lingkungan uji integrasi
    • Jalankan tes integrasi
    • Runtuhkan lingkungan uji integrasi
    • Buat paket penerapan
    • Buat skrip migrasi

Dan kemudian, ketika datang ke reproduktifitas, menjadi jelas bahwa ini mendapat skor rendah. Ketika Anda membiarkan TeamCity menjadi skrip build Anda, menjadi sulit untuk mereproduksi hasil yang serupa, andal, pada mesin pengembangan Anda sendiri.

Saat Anda memiliki skrip build, skrip build tahu semua yang perlu dilakukan dan memiliki semua variabel di tempatnya. Saat Anda menggunakan server CI sebagai skrip build Anda, dan beberapa masalah terjadi, seperti tes kompleks gagal atau perlu membangun paket deployment secara manual (seperti contoh saya), Anda harus menyatukan semua langkah build build secara manual.

Jadi, singkatnya , mengapa skrip membangun (MS)? Karena Anda akan memiliki lebih banyak persyaratan ketika datang ke bangunan Anda. Anda mungkin ingin menjalankan beberapa tes dan menghasilkan beberapa artefak dari itu. Anda mungkin ingin melakukan penyebaran. Dan ketika semua yang Anda inginkan harus bisa dijalankan, apakah itu di server build atau mesin Anda, itu tidak bisa berakhir di mana pun kecuali dalam skrip build.

Sebazzz
sumber
1
++ Saya baru saja berdebat dengan pimpinan kami hari ini. Bangunan Anda harus dapat dijalankan dari mana saja , bukan hanya GUI pada beberapa layanan cloud.
RubberDuck