Apakah praktik yang baik untuk menyimpan runtime framework di bawah kendali sumber?

9

Saya tahu banyak toko perangkat lunak menjaga binari di bawah kendali sumber . Namun, toko kami datang untuk menyimpan seluruh kerangka kerja di repositori: DirectX runtime, CUDA, nVidia Optix, apa pun.

Dikatakan untuk membuat setup mesin dev lebih mudah (seharusnya, dapatkan terbaru dan mulai coding). Namun, itu jauh membengkak repositori dan membebani dengan sejarah yang tidak relevan.

Saya belum pernah melihat pola penggunaan seperti itu. Apakah Anda menganggapnya sebagai praktik yang baik?

[EDIT:] Saya tidak punya masalah dengan binari pihak ke-3 yang dikendalikan oleh sumber. Pertanyaannya merujuk pada seluruh runtime framework, biasanya terdiri dari 10+ binari. Sebagai contoh ekstrem, ambil Windows SDK (yang kami tidak simpan di repositori, terima kasih Tuhan, tapi saya tidak melihat perbedaan pada prinsipnya).

Ofek Shilon
sumber
1
Anda bisa membuat skrip yang mengunduh runtime kerangka kerja terbaru atau yang relevan, dan menempatkan skrip itu di bawah kontrol versi.
Basile Starynkevitch
2
Menurut Anda mengapa itu membebani [repositori] dengan sejarah yang tidak relevan ? Lebih khusus lagi, mengapa Anda berpikir bahwa sejarah tidak relevan ? Jika kode Anda merujuk kerangka kerja dan pustaka tersebut, sangat membantu untuk mengetahui versi mana yang digunakan pada revisi tertentu di repositori.
James McNellis
Saya setuju tentang mengasapi (terutama jika runtimes dibagi di antara beberapa proyek) tapi saya tidak mengerti bagian tentang sejarah yang tidak relevan. Misalnya, perubahan versi runtime yang Anda gunakan cukup relevan ...
6502
Bukankah lebih mudah untuk membuat gambar dari mesin pengembang saat pembaruan keluar?
Ramhound
@Ramhound: itulah arah yang tepat yang saya coba dorong. Saya bertanya-tanya apakah ada kerugian saya hilang.
Ofek Shilon

Jawaban:

6

Binari pada umumnya tidak cocok untuk sistem kontrol versi karena:

  • mereka tidak mendapat manfaat dari fitur kontrol versi (menggabungkan, berbeda)
  • mereka meningkatkan ukuran repo ...
  • ... yang penting karena Anda tidak dengan mudah menghapus versi dari VCS (VCS dibuat untuk menyimpan sejarah), sebagai lawan dari repositori artefak seperti Nexus , yang merupakan direktori bersama sederhana (mudah dibersihkan: cd+ rm!)
  • mereka harus direferensikan dalam VCS sebagai teks , deklarasi versi path +: Anda dapat menyimpan riwayat yang relevan seperti itu , merekam setiap perubahan versi biner sebagai perubahan pada file teks itu (seperti pom.xml jika Anda menggunakan Nexus contohnya)
VONC
sumber
1
Poin terakhir sangat berharga.
Noufal Ibrahim
Terima kasih! Apakah Anda tahu repositori artefak serupa untuk proyek C ++? Bahkan lebih baik - mungkin yang terintegrasi dengan TFS?
Ofek Shilon
2
@OfekShilon: Secara teori Nexus dapat menyimpan segala jenis artefak. Tetapi untuk manajemen penyimpanan dan dependensi untuk .NET / C ++, Anda juga memiliki NuGet: nuget.codeplex.com . Contoh untuk .Net: lostechies.com/derekgreer/2011/09/20/… . Ini juga harus mendukung proyek C ++: nuget.codeplex.com/discussions/280649 .
VonC
@OfekShilon Anda dapat menautkan TFS dengan NuGet (misalnya: coolthingoftheday.blogspot.com/2011/08/… , hanselman.com/blog/… ). Lihat juga TFSNuGetter: nugetter.codeplex.com
VonC
6

Saya baik-baik saja dengan versi mengendalikan aset biner. Saya menentang versi mengendalikan file yang dihasilkan .

Selain itu, pengaturan lingkungan adalah sesuatu yang berbeda dari pengembangan. Kami sebagian besar berkembang di Python dan memiliki alat yang disebut virtualenv yang memungkinkan Anda untuk membuat lingkungan terisolasi yang ringan (termasuk perpustakaan) untuk sebuah proyek. Ketika kami memeriksa sumber kami, kami memiliki skrip setup di sana yang membangun virtualenv ini. Menggunakan manifes, ini menentukan versi perpustakaan apa yang dibutuhkan dan hal-hal lain semacam itu. Tidak satu pun dari ini yang dikontrol versi. Hanya skrip pengaturan.

Melemparkan seluruh kerangka kerja di bawah proyek utama Anda akan mengacaukan sejarah Anda dan secara serius mengacaukan segalanya. Itu bukan bagian dari proyek Anda dan harus diperlakukan berbeda.

Noufal Ibrahim
sumber
3

Secara umum ide yang baik untuk melakukan manajemen konfigurasi dengan versi kerangka kerja. Jika kode Anda memerlukan versi DirectX tertentu, versi itu harus mudah tersedia, dan jika Anda memeriksa versi lama dari perangkat lunak Anda, itu harus mudah untuk menentukan dependensi eksternal yang dimilikinya.

Apa yang saya pikir bukan ide yang baik di sini adalah menggunakan sistem kontrol versi khas Anda untuk menyimpan binari tersebut. Di perusahaan kami, kami menyimpan setiap versi kerangka kerja, pustaka, dan alat eksternal dalam struktur subfolder pada drive jaringan. Jika menurut kami masuk akal, kami memiliki file readme untuk mendokumentasikan versi alat mana yang merupakan versi perangkat lunak mana, atau, jika mungkin, kami memiliki skrip untuk menginstal atau menggunakan versi tertentu. Hanya file dan skrip readme yang masuk ke kontrol versi.

Kami juga menyimpan versi alat dan pustaka yang lebih lama selama kami pikir mungkin ada peluang kami harus membangun kembali dan versi yang lebih lama tergantung pada alat itu. Dengan begitu hal itu memberi kami kemungkinan untuk menghapus beberapa lib & alat yang sangat lama dari drive jaringan kami ketika sudah usang (tentu saja, kalau-kalau kami memiliki arsip di media eksternal).

Doc Brown
sumber
2

Saya pikir biner harus disimpan di suatu tempat. Saya sarankan menyimpannya di luar repositori, terutama jika mereka besar dan mengarah ke waktu check out yang besar. Saya tidak akan melihat itu latihan yang buruk, tetapi juga bukan yang saya lihat.

Ini sebenarnya mungkin ide yang baik jika organisasi Anda memiliki banyak proyek yang menargetkan versi runtime yang berbeda. Ini memastikan bahwa Anda memiliki biner runtime yang tepat ketika Anda mengerjakan proyek yang tepat.


sumber
Saya telah mengklarifikasi pertanyaan untuk mengatasi ini.
Ofek Shilon
1

Saya pribadi menganggap ini praktik yang sangat buruk. Saya lebih suka membuat wiki dengan instruksi instalasi dan mengunggah binari yang diperlukan ke sana. File-file ini hanya dibutuhkan oleh pengembang baru, tidak perlu mengasapi repositori orang lain.

Sergio Tulentsev
sumber
1

Ada alasan bagus untuk melakukan ini, yaitu Anda memiliki semua yang Anda butuhkan di satu lokasi, tanpa ketergantungan eksternal.

Ini jauh lebih penting daripada yang mungkin Anda pikirkan. Ini pada dasarnya memastikan bahwa Anda tidak bergantung pada artefak pada server vendor yang mungkin hilang setelah beberapa tahun, karena Anda memiliki semuanya di rumah.

Mengenai mengasapi repositori. Ini hanya masalah jika VCS Anda menyimpan salinan lokal lengkap (git melakukan ini, cv tidak) karena kloning dan / atau pembaruan akan lambat. Sebagai gantinya Anda akan memiliki salinan pada setiap mesin pengembangan, yang dapat menyelamatkan perusahaan Anda jika skema cadangan pusat Anda karena suatu alasan gagal suatu hari.

Ini masalah prioritas atau kebijakan. Selama keputusan itu disengaja, saya akan baik-baik saja dengan ini.


sumber
2
Jika Anda menyimpan pustaka pihak ketiga Anda di repositori artefak seperti server Nexus atau NuGet Anda sendiri, Anda tidak perlu takut server "vendor" pergi. Jadi maksudnya, simpan secara lokal. Hanya saja, jangan gunakan VCS. Mereka tidak dimaksudkan untuk menyimpan file semacam itu.
VonC
@VonC tergantung pada infrastruktur dan metodologi kerja Anda. Untuk "simpan satu biner satu kali", sebuah VCS bisa sama bagusnya dengan repositori artifak penuh. Ini juga membuat infrastruktur tetap sederhana. Saya tidak menganjurkan - OP bertanya apakah ada yang melihat pola penggunaan seperti itu.
Baik. Saya telah melihat pola penggunaan seperti itu. AndI harus mengelola repo seperti itu (Sentralisasi VCS seperti SVN atau ClearCase terutama, tidak pernah melihat penggunaan untuk DVCS seperti Git). Dan ini umumnya berantakan. Mengisi perpustakaan vendor, Anda jarang hanya menyimpan biner tunggal sekali. Anda harus berurusan dengan tambalan. Banyak dari mereka. Ditambah penyimpanan bukan satu-satunya tujuan (jika itu, VCS mungkin bisa menjadi solusi potensial). Manajemen ketergantungan adalah. Dan itulah yang ditawarkan Nexus atau NuGet (selain mudah dikelola dan dibersihkan) penyimpanan.
VonC