Jika Anda mengikuti rekomendasi saya di bawah ini (saya telah bertahun-tahun), Anda akan dapat:
- letakkan setiap proyek di mana saja dalam kendali sumber, selama Anda mempertahankan struktur dari direktori akar proyek ke bawah
- bangun setiap proyek di mana saja di mesin apa pun, dengan risiko minimum dan persiapan minimum
- membangun setiap proyek sepenuhnya berdiri sendiri, selama Anda memiliki akses ke dependensi binernya (direktori "library" dan "output" lokal)
- membangun dan bekerja dengan kombinasi proyek apa pun, karena mereka independen
- membangun dan bekerja dengan banyak salinan / versi dari satu proyek, karena mereka independen
- hindari mengacaukan repositori kendali sumber Anda dengan file atau pustaka yang dihasilkan
Saya merekomendasikan (ini dagingnya):
Tentukan setiap proyek untuk menghasilkan satu kiriman utama, seperti .DLL, .EXE, atau .JAR (default dengan Visual Studio).
Susun setiap proyek sebagai pohon direktori dengan satu root.
Buat skrip build otomatis untuk setiap project di direktori root yang akan dibuat dari awal, tanpa ketergantungan pada IDE (tetapi jangan mencegahnya untuk dibuat di IDE, jika memungkinkan).
Pertimbangkan nAnt untuk proyek .NET di Windows, atau yang serupa berdasarkan OS Anda, platform target, dll.
Jadikan setiap referensi skrip build project sebagai dependensi eksternalnya (pihak ketiga) dari satu direktori "library" bersama lokal, dengan setiap biner SEPENUHNYA diidentifikasi menurut versi: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Buat setiap skrip build project memublikasikan kiriman utama ke satu direktori "output" bersama lokal: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Jadikan setiap skrip build project mereferensikan dependensinya melalui jalur absolut yang dapat dikonfigurasi dan berversi lengkap (lihat di atas) di direktori "library" dan "output", DAN TANPA DI MANA LAIN.
JANGAN PERNAH membiarkan proyek merujuk langsung proyek lain atau kontennya - hanya izinkan referensi ke kiriman utama di direktori "keluaran" (lihat di atas).
Jadikan setiap referensi skrip build proyek sebagai alat build yang diperlukan melalui jalur absolut yang dapat dikonfigurasi dan berversi lengkap: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Membuat setiap proyek membangun script konten sumber referensi oleh path relatif absolut ke direktori root proyek: ${project.base.dir}/src
, ${project.base.dir}/tst
(sintaks bervariasi oleh alat membangun).
SELALU memerlukan skrip build proyek untuk mereferensikan SETIAP file atau direktori melalui jalur absolut yang dapat dikonfigurasi (di-root pada direktori yang ditentukan oleh variabel yang dapat dikonfigurasi): ${project.base.dir}/some/dirs
atau ${env.Variable}/other/dir
.
JANGAN PERNAH mengizinkan skrip build project untuk mereferensikan APA SAJA dengan jalur relatif seperti .\some\dirs\here
atau ..\some\more\dirs
, SELALU gunakan jalur absolut.
JANGAN PERNAH mengizinkan skrip build project untuk mereferensikan APA SAJA menggunakan jalur absolut yang tidak memiliki direktori root yang dapat dikonfigurasi, seperti C:\some\dirs\here
atau \\server\share\more\stuff\there
.
Untuk setiap direktori root yang dapat dikonfigurasi yang direferensikan oleh skrip build proyek, tentukan variabel lingkungan yang akan digunakan untuk referensi tersebut.
Berusaha meminimalkan jumlah variabel lingkungan yang harus Anda buat untuk mengonfigurasi setiap mesin.
Di setiap mesin, buat skrip shell yang menentukan variabel lingkungan yang diperlukan, yang khusus untuk mesin ITU (dan mungkin khusus untuk pengguna itu, jika relevan).
JANGAN meletakkan skrip shell konfigurasi khusus mesin ke dalam kontrol sumber; sebagai gantinya, untuk setiap proyek, lakukan salinan skrip di direktori root proyek sebagai template.
WAJIB setiap skrip build project untuk memeriksa setiap variabel lingkungannya, dan batalkan dengan pesan yang bermakna jika tidak ditentukan.
MEMERLUKAN setiap skrip build project untuk memeriksa setiap file executable alat build dependennya, file library eksternal, dan file pengiriman project dependen, dan batalkan dengan pesan yang berarti jika file tersebut tidak ada.
TOLAK godaan untuk memasukkan file yang dihasilkan ke dalam kontrol sumber - tidak ada hasil proyek, tidak ada sumber yang dihasilkan, tidak ada dokumen yang dibuat, dll.
Jika Anda menggunakan IDE, buat file kontrol proyek apa pun yang Anda bisa, dan jangan memasukkannya ke kontrol sumber (ini termasuk file proyek Visual Studio).
Buat server dengan salinan resmi dari semua pustaka dan alat eksternal, untuk disalin / diinstal di workstation pengembang dan mesin build. Cadangkan, bersama dengan repositori kendali sumber Anda.
Buat server integrasi berkelanjutan (buat mesin) tanpa alat pengembangan apa pun.
Pertimbangkan alat untuk mengelola pustaka dan kiriman eksternal Anda, seperti Ivy (digunakan dengan Ant).
JANGAN gunakan Maven - ini awalnya akan membuat Anda bahagia, dan akhirnya membuat Anda menangis.
Perhatikan bahwa tidak ada yang khusus untuk Subversion, dan sebagian besar bersifat umum untuk proyek yang ditargetkan ke OS, perangkat keras, platform, bahasa, dll. Saya memang menggunakan sedikit sintaks khusus OS dan alat, tetapi hanya untuk ilustrasi- -Saya percaya bahwa Anda akan menerjemahkan ke OS atau alat pilihan Anda.
Catatan tambahan mengenai solusi Visual Studio: jangan letakkan di kontrol sumber! Dengan pendekatan ini, Anda tidak memerlukannya sama sekali atau Anda dapat membuatnya (seperti file proyek Visual Studio). Namun, saya merasa yang terbaik adalah menyerahkan file solusi kepada pengembang individu untuk dibuat / digunakan sesuai keinginan mereka (tetapi tidak diperiksa ke kontrol sumber). Saya menyimpan Rob.sln
file di workstation saya yang menjadi referensi proyek saya saat ini. Karena proyek saya semuanya berdiri sendiri, saya dapat menambah / menghapus proyek sesuka hati (itu berarti tidak ada referensi ketergantungan berbasis proyek).
Harap jangan gunakan Subversion eksternal (atau yang serupa di alat lain), mereka anti-pola dan, oleh karena itu, tidak perlu.
Saat Anda menerapkan integrasi berkelanjutan, atau bahkan saat Anda hanya ingin mengotomatiskan proses rilis, buat skrip untuk itu. Buat satu skrip shell yang: mengambil parameter nama proyek (seperti yang tercantum dalam repositori) dan nama tag, membuat direktori sementara dalam direktori root yang dapat dikonfigurasi, memeriksa sumber untuk nama proyek dan nama tag yang diberikan (dengan membuat URL yang sesuai dalam kasus Subversion) ke direktori sementara itu, melakukan build bersih yang menjalankan pengujian dan memaket kiriman. Skrip shell ini harus bekerja pada proyek apa pun dan harus diperiksa ke dalam kontrol sumber sebagai bagian dari proyek "alat pembangunan" Anda. Server integrasi berkelanjutan Anda dapat menggunakan skrip ini sebagai fondasinya untuk membangun proyek, atau bahkan mungkin menyediakannya (tetapi Anda mungkin masih menginginkannya sendiri).
@VonC: Anda TIDAK ingin bekerja sepanjang waktu dengan "ant.jar" daripada "ant-abcdjar" setelah Anda dibakar saat skrip build rusak karena Anda tanpa sadar menjalankannya dengan versi Ant yang tidak kompatibel. Hal ini biasa terjadi antara Ant 1.6.5 dan 1.7.0. Generalisasi, Anda SELALU ingin tahu versi spesifik dari SETIAP komponen yang digunakan, termasuk platform Anda (Java ABCD) dan alat build Anda (Ant EFGH). Jika tidak, Anda pada akhirnya akan menemukan bug dan masalah BESAR pertama Anda akan melacak versi apa dari berbagai komponen Anda yang terlibat. Lebih baik menyelesaikan masalah itu di depan.