Sesama pengembang telah mulai bekerja pada proyek Drupal baru, dan sysadmin telah menyarankan bahwa mereka hanya harus menempatkan situs / subdirektori default dalam kontrol sumber, karena "akan membuat pembaruan dengan mudah dapat skrip." Mengesampingkan klaim yang agak meragukan itu, menimbulkan pertanyaan lain - file apa yang harus di bawah kendali sumber? Dan apakah ada situasi di mana sebagian besar file harus dikecualikan?
Pendapat saya adalah bahwa seluruh pohon untuk proyek harus di bawah kendali, dan ini akan berlaku untuk proyek Drupal, rel, atau apa pun. Ini seperti no-brainer - Anda jelas perlu versi untuk kerangka kerja Anda sebanyak yang Anda lakukan untuk kode kustom apa pun yang Anda tulis.
Yang mengatakan, saya ingin mendapatkan pendapat lain tentang ini. Apakah ada argumen untuk tidak mengendalikan semuanya?
sumber
Jawaban:
Saya akan mengatakan bahwa minimum yang harus mengandung kontrol sumber adalah semua file yang diperlukan untuk membuat ulang versi proyek yang berjalan. Ini bahkan termasuk file DDL untuk mengatur dan memodifikasi skema basis data apa pun, dan dalam urutan yang benar juga. Minus, tentu saja, alat yang diperlukan untuk membangun dan menjalankan proyek serta apa pun yang dapat secara otomatis diperoleh / dihasilkan dari file lain dalam kontrol sumber (seperti file JavaDoc yang dihasilkan dari file Java dalam kontrol sumber).
sumber
Yang terbaik adalah menempatkan segala sesuatu di bawah matahari ke dalam kendali sumber.
Kode
Perpustakaan
Sumber daya
Bangun / Terapkan Skrip
Pembuatan basis data dan perbarui skrip
Dokumentasi tertentu
File Konfigurasi Khusus Lingkungan
Satu-satunya hal yang tidak boleh dimasukkan ke dalam kontrol sumber adalah membangun artefak untuk proyek Anda.
sumber
Saya akan mengatakan itu;
Saya cenderung untuk menempatkan binari besar seperti paket instal alat di suatu tempat di luar trunk, tetapi mereka masih harus di bawah kontrol versi.
sumber
Dan jangan lupa untuk meletakkan semua kode basis data di Kontrol Sumber juga! Ini akan mencakup skrip pembuatan asli, skrip untuk mengubah tabel (yang ditandai oleh versi perangkat lunak mana yang menggunakannya, sehingga Anda dapat membuat kembali versi database apa pun untuk versi aplikasi apa pun) dan skrip untuk mengisi tabel pencarian apa pun.
sumber
Pengalaman yang sulit dimenangkan telah mengajari saya bahwa hampir semuanya termasuk dalam kontrol sumber. (Komentar saya di sini diwarnai oleh satu setengah dekade yang dikembangkan untuk sistem telekomunikasi tertanam pada perangkat keras berpemilik, dan kadang-kadang sulit ditemukan, alat.)
Beberapa jawaban di sini mengatakan "jangan letakkan binari di kontrol sumber". Itu salah. Ketika Anda mengerjakan suatu produk dengan banyak kode pihak ketiga dan banyak perpustakaan biner dari vendor, Anda memeriksa di perpustakaan biner . Karena, jika tidak, maka pada titik tertentu Anda akan meningkatkan dan Anda akan mengalami masalah: build rusak karena mesin build tidak memiliki versi terbaru; seseorang memberi CD baru kepada orang baru untuk diinstal; wiki proyek memiliki instruksi basi mengenai versi apa yang akan diinstal; dll. Lebih buruk lagi, jika Anda harus bekerja sama dengan vendor untuk menyelesaikan masalah tertentu dan mereka mengirimi Anda lima set perpustakaan dalam seminggu, Anda harusdapat melacak kumpulan biner mana yang memperlihatkan perilaku mana. Sistem kontrol sumber adalah alat yang memecahkan masalah itu dengan tepat.
Beberapa jawaban di sini mengatakan "jangan letakkan toolchain di kontrol sumber". Saya tidak akan mengatakan itu salah, tetapi yang terbaik adalah menempatkan toolchain di kontrol sumber kecuali Anda memiliki sistem manajemen konfigurasi (CM) yang solid . Sekali lagi, pertimbangkan masalah peningkatan seperti yang disebutkan di atas. Lebih buruk lagi, saya bekerja pada sebuah proyek di mana ada empat rasa terpisah dari rantai alat melayang ketika saya dipekerjakan - semuanya digunakan secara aktif ! Salah satu hal pertama yang saya lakukan (setelah saya berhasil membangun untuk bekerja) adalah meletakkan toolchain di bawah kendali sumber. (Gagasan sistem CM yang solid adalah di luar harapan.)
Dan apa yang terjadi ketika proyek yang berbeda membutuhkan toolchain yang berbeda? Contoh kasus: Setelah beberapa tahun, salah satu proyek mendapat pembaruan dari vendor dan semua Makefiles rusak. Ternyata mereka mengandalkan versi GNU make yang lebih baru. Jadi kita semua ditingkatkan. Aduh, Makefiles proyek lain semua bangkrut. Pelajaran: komit kedua versi GNU make, dan jalankan versi yang disertakan dengan checkout proyek Anda.
Atau, jika Anda bekerja di tempat di mana segala sesuatu di luar kendali, Anda memiliki percakapan seperti, "Hei, orang baru mulai hari ini, di mana CD untuk kompiler?" "Entahlah, sejak Jack berhenti, dia adalah penjaga CD-nya." "Uhh, bukankah itu sebelum kita naik dari lantai 2?" "Mungkin mereka ada di dalam kotak atau apa." Dan karena alat tersebut berusia tiga tahun, tidak ada harapan untuk mendapatkan CD lama dari vendor.
Semua skrip build Anda termasuk dalam kontrol sumber. Segala sesuatu! Semua jalan ke variabel lingkungan. Mesin build Anda harus dapat menjalankan build dari salah satu proyek Anda dengan mengeksekusi satu skrip di root proyek. (
./build
adalah standar yang masuk akal;./configure; make
hampir sama baiknya.) Script harus mengatur lingkungan seperti yang diperlukan dan kemudian meluncurkan alat apa pun yang membangun produk (make, semut, dll).Jika Anda pikir itu terlalu banyak pekerjaan, itu tidak. Ini sebenarnya menghemat banyak pekerjaan. Anda mengkomit file sekali pada awal waktu, dan kemudian setiap kali Anda memutakhirkan. Tidak ada serigala pun yang dapat meng-upgrade mesinnya sendiri dan melakukan banyak kode sumber yang tergantung pada versi terbaru dari beberapa alat, menghancurkan build untuk semua orang. Saat Anda mempekerjakan pengembang baru, Anda dapat memberi tahu mereka untuk memeriksa proyek dan menjalankannya
./build
. Ketika versi 1.8 memiliki banyak penyempurnaan kinerja, dan Anda men-tweak kode, flag kompiler, dan variabel lingkungan, Anda ingin memastikan bahwa flag kompiler baru tidak secara tidak sengaja diterapkan ke versi 1.7 patch build, karena mereka benar - benar membutuhkan kode perubahan yang menyertainya atau Anda melihat beberapa kondisi ras berbulu.Yang terbaik dari semuanya , ini akan menghemat waktu Anda: bayangkan Anda mengirimkan versi 3.0.2 produk Anda pada hari Senin. Hore, rayakan. Pada hari Selasa pagi, seorang pelanggan VIP menelepon hotline dukungan, mengeluhkan bug superkritis dan mendesak ini dalam versi 2.2.6 yang Anda kirim 18 bulan lalu. Dan Anda masih secara kontraktual harus mendukungnya, dan mereka menolak untuk memutakhirkan sampai Anda dapat memastikan dengan pasti bahwa bug telah diperbaiki dalam kode baru, dan mereka cukup besar untuk membuat Anda menari. Ada dua alam semesta paralel:
Di alam semesta di mana Anda tidak memiliki perpustakaan, toolchain, dan membuat skrip dalam kontrol sumber, dan Anda tidak memiliki sistem CM yang kuat .... Anda dapat memeriksa versi kode yang tepat, tetapi memberikan Anda semua jenis kesalahan ketika Anda mencoba membangun. Mari kita lihat, apakah kita meningkatkan alat pada bulan Mei? Tidak, itu perpustakaannya. Ok, kembali ke perpustakaan lama - tunggu, apakah ada dua upgrade? Ah ya, itu terlihat sedikit lebih baik. Tapi sekarang crash linker aneh ini terlihat familier. Oh, itu karena pustaka lama tidak bekerja dengan toolchain baru, itu sebabnya kami harus memutakhirkan, kan? (Saya akan menghindarkan Anda dari penderitaan selama sisa upaya. Butuh dua minggu dan tidak ada yang senang pada akhirnya, bukan Anda, bukan manajemen, bukan pelanggan.)
Di alam semesta di mana semuanya berada dalam kontrol sumber, Anda memeriksa tag 2.2.6, memiliki debug build siap dalam satu jam atau lebih, menghabiskan satu atau dua hari menciptakan "bug VIP", melacak penyebabnya, memperbaikinya di rilis saat ini, dan meyakinkan pelanggan untuk memutakhirkan. Stres, tetapi tidak seburuk yang ada di alam semesta lain di mana garis rambut Anda 3cm lebih tinggi.
Dengan itu, Anda bisa melangkah terlalu jauh:
sumber
Satu-satunya hal yang saya tidak letakkan di bawah kendali sumber adalah file yang Anda dapat dengan mudah membuat ulang atau khusus pengembang. Ini berarti executable dan binary yang terdiri dari kode sumber Anda, dokumentasi yang dihasilkan dari membaca / mem-parsing file di bawah kendali sumber, dan file khusus IDE. Segala sesuatu yang lain masuk ke kontrol versi dan dikelola dengan tepat.
sumber
Kasus penggunaan untuk kontrol sumber adalah: Bagaimana jika semua mesin pengembang kami dan semua mesin penempatan kami terkena meteor? Anda ingin pemulihan sedekat mungkin dengan checkout dan membangun sebanyak mungkin. (Jika itu terlalu konyol, Anda bisa menggunakan "merekrut pengembang baru.")
Dengan kata lain, segala sesuatu selain OS, aplikasi, dan alat harus di VCS, dan di sistem tertanam, di mana ada ketergantungan pada versi alat biner tertentu, saya telah melihat alat disimpan di VCS juga!
Kontrol sumber yang tidak lengkap adalah salah satu risiko paling umum yang saya lihat ketika berkonsultasi - ada segala macam gesekan yang terkait dengan membawa pengembang baru atau menyiapkan mesin baru. Seiring dengan konsep Integrasi Berkelanjutan dan Pengiriman Berkelanjutan Anda harus memiliki rasa "Pembangunan Berkelanjutan" - dapatkah seorang TI membuat mesin pengembangan atau penempatan baru secara otomatis, sehingga pengembang dapat melihat kode sebelum selesai secangkir kopi pertama mereka?
sumber
Apa pun yang berkontribusi pada proyek dan Anda ingin melacak perubahan.
Pengecualian dapat mencakup gumpalan biner besar seperti gambar, jika Anda menggunakan scm yang tidak menangani data biner dengan sangat baik.
sumber
Drupal menggunakan git jadi saya akan menggunakan terminologi git. Saya akan menggunakan subrepo untuk setiap modul untuk dapat menarik pembaruan modul dari repo resmi drupal, sambil tetap mempertahankan struktur penyebaran individu. Dengan cara itu Anda mendapatkan manfaat skripabilitas tanpa kehilangan manfaat memiliki segalanya di bawah kendali sumber.
sumber
Semuanya harus di bawah kendali sumber, kecuali:
Pikirkan seperti itu: Setiap anggota baru dalam tim harus dapat mengecek salinan proyek yang berfungsi (minus item konfigurasi).
Dan jangan lupa untuk menempatkan perubahan skema database (kesederhanaan sql setiap perubahan skema) di bawah kontrol versi juga. Anda dapat menyertakan dokumentasi pengguna dan api, jika masuk akal untuk proyek tersebut.
@maple_shaft memunculkan masalah penting dengan pernyataan pertama saya mengenai file konfigurasi lingkungan di komentar. Saya ingin mengklarifikasi bahwa jawaban saya adalah untuk pertanyaan spesifik, yaitu tentang proyek CUP Drupal atau generik. Dalam skenario seperti itu, Anda biasanya memiliki basis data lokal dan produksi, dan satu opsi konfigurasi lingkungan adalah kredensial ke database ini (dan kredensial serupa). Disarankan bahwa ini TIDAK di bawah kendali sumber, karena itu akan menciptakan beberapa masalah keamanan.
Namun, dalam alur kerja pengembangan yang lebih umum, saya setuju dengan maple_shaft bahwa opsi konfigurasi lingkungan harus di bawah kendali sumber untuk memungkinkan pembangunan satu langkah dan penggunaan lingkungan apa pun.
sumber
Apa pun membangun otomatis Anda tidak menghasilkan tidak tidak masuk kontrol sumber. Apa pun yang tidak memerlukan modifikasi selama build memang masuk dalam kontrol sumber. Sesederhana itu.
Misalnya, berikut ini tidak masuk dalam kontrol sumber:
Apa yang masuk dalam kontrol sumber:
Aturan praktis ini didasarkan pada anggapan bahwa apa pun yang ada dalam kontrol sumber dapat dimodifikasi oleh manusia dan dapat mengambil waktu berharga seseorang untuk memahami mengapa itu ada.
sumber
Apa pun yang Anda perlukan untuk bekerja dan dapat berubah perlu diversi versi dengan cara apa pun. Tetapi jarang ada kebutuhan untuk memiliki dua sistem independen melacaknya.
Apa pun yang dihasilkan dengan cara yang andal biasanya dapat dilampirkan ke versi sumber - oleh karena itu tidak perlu dilacak secara independen: sumber yang dihasilkan, biner yang tidak diteruskan dari sistem ke yang lain, dll.
Membuat log dan hal-hal lain yang mungkin tidak ada yang peduli (tapi Anda tidak pernah tahu pasti) biasanya dilacak oleh siapa pun yang membuatnya: jenkins, dll.
Membangun produk yang diteruskan dari satu sistem ke sistem lain perlu dilacak, tetapi repo pakar merupakan cara yang baik untuk melakukannya - Anda tidak perlu tingkat kontrol yang disediakan oleh sumber kontrol. Hasil kerja seringkali dalam kategori yang sama.
Apa pun yang tersisa (dan pada titik ini, harus ada sedikit lebih dari file sumber dan membangun konfigurasi server) masuk ke kontrol sumber.
sumber
Jawaban saya cukup sederhana: bukan binari. Implikasinya, hampir semuanya.
(Jelas bukan backup database atau migrasi skema atau data pengguna.)
sumber
Kontrol sumber adalah mekanisme pelacakan perubahan. Gunakan saat Anda ingin tahu siapa yang mengubah apa dan kapan.
Kontrol sumber tidak gratis. Ini menambah kompleksitas alur kerja Anda, dan membutuhkan pelatihan untuk kolega baru. Timbang manfaat terhadap biaya.
Misalnya, mungkin sulit untuk mengontrol basis data. Kami dulu memiliki sistem di mana Anda harus menyimpan definisi secara manual dalam file teks dan kemudian menambahkannya ke kontrol sumber. Ini membutuhkan banyak waktu dan tidak dapat diandalkan. Karena tidak dapat diandalkan, Anda tidak dapat menggunakannya untuk mengatur database baru, atau untuk memeriksa pada waktu apa perubahan dibuat. Tetapi kami menyimpannya selama bertahun-tahun, menghabiskan banyak waktu, karena manajer kami berpikir "semua hal harus ada dalam kendali sumber".
Kontrol sumber bukanlah sihir. Cobalah, tetapi tinggalkan jika tidak menambah nilai untuk mengimbangi biaya.
sumber
Hal-hal yang tidak akan saya masukkan ke dalam kendali sumber:
Jadi saya tidak melakukan
hg addremove
misalnya karena membuat klon baru sesekali ketika pembaruan SDK. Itu juga membuat saya melakukan backup lengkap setiap kali SDk memperbarui dan memeriksa apakah versi baru yang dikloning dari repositori sudah baik.sumber
Saya sangat merekomendasikan kepada Anda buku berikut yang membahas masalah Anda:
Pengiriman Berkelanjutan: Rilis Perangkat Lunak yang Andal melalui Build, Test, dan Deployment Automation . Secara khusus, Bab 2 membahas item yang akan ditempatkan ke dalam kontrol sumber, yang seperti yang dikatakan beberapa orang, secara praktis adalah segalanya kecuali sebagian besar konten yang dihasilkan sebagai hasil dari build.
Saya tidak setuju dengan satu bagian dari jawaban yang diterima yang diberikan oleh @FrustratedWithFormsDesigner kurang karena dia menganjurkan tidak menempatkan ke dalam versi mengontrol alat yang diperlukan untuk membangun proyek. Suatu tempat di kontrol sumber (berdekatan dengan kode yang sedang dibangun) haruslah skrip build untuk membangun proyek dan skrip build yang dijalankan dari baris perintah saja. Jika dengan alat yang ia maksudkan, IDE dan editor, mereka seharusnya tidak diminta untuk membangun proyek apa pun. Ini bagus untuk pengembangan aktif / cepat untuk pengembang dan pengaturan jenis lingkungan ini dapat dituliskan juga atau diunduh dari bagian lain SCM atau dari beberapa jenis server manajemen biner dan pengaturan IDE semacam itu harus seotomatis mungkin.
Saya juga tidak setuju dengan apa yang dikatakan @Yannis Rizos tentang menempatkan konfigurasi untuk lingkungan dalam kontrol sumber. Alasannya adalah bahwa Anda harus dapat merekonstruksi lingkungan apa pun sesuka hati hanya dengan menggunakan skrip dan tidak dapat dikelola tanpa pengaturan konfigurasi dalam kontrol sumber. Juga tidak ada sejarah bagaimana konfigurasi untuk berbagai lingkungan telah berevolusi tanpa menempatkan informasi ini ke dalam kendali sumber. Sekarang, pengaturan lingkungan produksi mungkin dirahasiakan atau perusahaan mungkin tidak ingin menempatkan ini dalam kontrol versi, jadi opsi kedua adalah tetap menempatkannya dalam kontrol versi sehingga mereka memiliki sejarah, dan memberikan repositori ini akses terbatas.
sumber
Simpan semua kode dalam kontrol versi dan semua konfigurasi & data pengguna. Agar spesifik untuk drupal, Anda harus meletakkan semuanya di kontrol versi kecuali file dan settings.php
sumber