Neden bir kütüphane klasörü yerine paket yöneticisini tercih edersiniz?


68

Statik bir kütüphane klasörünün ve paket yöneticisinin artılarını ve eksilerini düşündüğümde kütüphane klasörünün daha iyi bir yaklaşım olduğunu düşünüyorum.

Bir kütüphane klasörü ile görüyorum artıları:

  1. Paketleri yönetmek için harici bir araca gerek yok.
  2. İnşa etmek için internet bağlantısı gerekmez.
  3. Daha hızlı yapı (paket kontrolü yok).
  4. Daha basit ortam (daha az bilgi gerekli).

Bir paket yöneticisi ile görüyorum artıları:

  1. Karmaşık bağımlılık ağaçlarına yardımcı olur (ve tüm bağımlılıklarla birlikte bir bağımlılık indirerek yönetilebilir).
  2. Kullanılabilir yeni bir sürüm olup olmadığını kontrol etmeye yardımcı olur.

Sektörün bugün inşa edilen hemen hemen her şey için paket yöneticisi yolunu izlemeye karar verdiği anlaşılıyor. Peki neyi özlüyorum?


33
Bence gerçekten paketlemeye karşı kütüphaneye ihtiyaç duymanın faydalarını soruyorsun . Bu terimleri kullanırsanız daha alakalı cevaplar alırsınız.
Kilian Foth

3
Yapım aracısı için gerekli olan her şeyi içeren ve muhtemelen internet erişimine izin vermeyen (inşaat için gerekmeyen) bir docker konteyner oluşturmanızı engelleyen şey nedir? Bence argümanları düşünmekten daha yeni bir araç öğrenmeye karşısın. Hiç elle yönetilen bağımlılıklar kullanan büyük bir projede çalıştınız mı? Göründüğün kadar iyi değil.
Kayaman

3
@Kayaman: Yeni bir araç öğrenmek takımın zamanına (parasına) mal olur ve bunu doğru şeye yatırdığımızı doğrulamak isterim. Büyük projelerdeki tecrübem, bağımlılıkların oldukça istikrarlı olduğu (neredeyse hiç değişmedikleri) ve belki de bir paket yöneticisinin bana pahalı gelmesi. Her neyse, sadece bir süre Nuget'le çalıştıktan ve onunla biraz zaman geçirdikten sonra profesyonellerin ve aleyhtarların listesini yapıyordum.
Ignacio Soler Garcia

2
@sebkur Tüm paketlerinizin yerel kopyalarını saklayabilirsiniz. Tüm bağımlılıklarımızın mevcut sürümlerini yerel kaynak kontrolü altında tutuyoruz. Paket yöneticisinin bir bağlantıya ihtiyacı olan tek zaman yükseltme yaptığımız zamandır.
26

1
@ 17of26: nuget'i kurmak ve istek üzerine 10 dakika içinde çalıştırmak için bir derleme aracısını nasıl yapılandıracağınızı öğrenemezsiniz. Aynı projelerin farklı çözümlerde kullanıldığı çoklu bir çözüm projeniz varsa, ne yapmazsınız.
Ignacio Soler Garcia

Yanıtlar:


122

Diğer cevaplarda eksik olan önemli bir nokta:

Bir paket yöneticisi kullanmak, hangi kütüphane sürümlerini kullandığınızı belirten ve yapılandırma bilgilerinin gerçekten doğru olduğundan emin olan bir yapılandırmaya sahip olmak anlamına gelir .

Hangi kitaplıkları kullandığınızı ve hangi sürümü kullandığınızı bilmek, eğer:

  • kritik bir hata / güvenlik boşluğu nedeniyle bir kütüphaneyi güncellemeniz gerekir;
  • ya da sadece ilan edilen güvenlik boşluğunun sizi etkileyip etkilemediğini kontrol etmeniz gerekir.

Ayrıca, gerçekten güncelleme yaptığınızda, paket yöneticisi (genellikle) geçişli bağımlılıkların gerektiği gibi güncellendiğinden emin olur.

Oysaki bir libklasörde, sadece bir kaç (muhtemelen ikili ve muhtemelen değiştirilmiş) dosyaya sahipsiniz ve nereden geldiklerini ve hangi sürümden olduklarını tahmin etmeniz gerekecek (veya bazı README’ye güvenebilir, bu doğru olabilir veya olmayabilir). ).


Diğer puanlarınızı ele almak için:

Paketleri yönetmek için harici bir araca gerek yok.

Doğru, ancak a) bir yazılım geliştiricisi olarak yine de bir çok araç yüklemeniz gerekir, bu yüzden bir tane daha farketmez, ve b) genellikle herhangi bir alanda yalnızca bir veya birkaç paket yöneticisi vardır (Maven / Gradle for Java, JS / TypeScript, vb. için npm, bu yüzden onlarca kurmanız gerekmiyor.

İnşa etmek için internet bağlantısı gerekmez.

Tanıdığım tüm paket yöneticileri, gerekli bağımlılıkları indirdikten sonra (projenin kendisini indirdikten hemen sonra gerçekleşebilecek olan) çevrimdışı çalışır.

Daha hızlı yapı (paket kontrolü yok).

Muhtemelen doğru, ancak çevrimdışı paket kontrolünün önemli miktarda zaman alacağı düşünülüyor (sadece bazı sürüm numaraları karşılaştırılıyor). Bir çevrimiçi çek biraz zaman alabilir, ancak istenirse (varsayılan olarak bile açıksa - Maven örneğin bırakma sürümleri için güncellemeleri kontrol eder hiç) o kapatılabilir.

Daha basit ortamlar (daha az bilgi gerekli).

Doğru, ancak yukarıda açıklandığı gibi, bir libklasör de bilgi gerektirir. Ayrıca, yukarıda açıklandığı gibi, muhtemelen yalnızca zaten bileceğiniz bir avuç farklı paket yöneticisi ile çalışacaksınız.


170
“Paketleri yönetmek için harici bir araca gerek yok” - yup. Şimdi beyninin işi. İyi şanslar beyin!
Paul D. Waite

57
Bir lib klasörüne sahip olmanın "kolay bir ortam" olduğunu ciddi olarak düşünen herkes, basitçe devam etmeli ve Microsoft.AspNetCore.All nuget'i söylemek için bağımlılık ağacını bulmaya çalışmalıdır . Devam et, beni bekleme, bir gün sonra tekrar kontrol edeceğim.
Voo

13
Ayrıca, kitaplıkları manuel olarak avlamak için kullandığınız internet tarayıcısı paketleri yönetmek için harici bir araç olarak sayılır. Kütüphaneleri hazırlamak ve yerleştirmek için kullandığınız her şeyle (OS dosya yöneticisi vb.) Birlikte. Yani gerçek seçim birçok rakip bir dış araç (paket yöneticisi) 'dir.
NemesisX00

3
Sadece Bilginize, yakın zamanda çevrimdışı bir bilgisayarda gradle ile çalışmayı denedim. Şans yok, Android Studio uygulamamı çalıştırmıyor ve belirsiz bir hata mesajı alıyorum ve sonrasında bağımlılıklar için çevrimiçi bir ilk çalıştırma yaptıktan sonra. Sadece bu tür durumlarda, yazılım üreten paket yöneticilerinin ne kadar bağımlı hale geldiğini gerçekten fark ettiğinizde ...
FRob

7
@ PaulD.Waite Biz buna devam ederken, herkesin yaşadığı sinir bozucu “dillerden” kurtulduk. Her şey sonuçta zaten makine koduna kayıyor, bu yüzden firmamda orta adamı kesiyoruz. Şimdi bu verimlilik!
corsiKa

39

Küçük ölçekli geliştirmeden daha büyük çalışmaya geçtiğinizde lib klasörünün artıları hızla kayboluyor.

Örneğin, harici bir araç gerektirmemesinin "faydası", bağımlılıklarınızı manuel olarak yönetmek için gereken iş tarafından sağlanmıştır, bu nedenle araç siz (dünyanın birden fazla anlamında) olacak.

Paket yöneticisi için internet bağlantısına ihtiyacınız yoktur. Yerel depoları kullanabilirsiniz.

Daha hızlı kurulum doğru olabilir, ancak bir paket yöneticisinin kullanılıp kullanılmayacağını belirlemesi gereken bir şey değildir. Sonuçta farkın büyüklüklerinden bahsetmiyoruz ve bu da sizin yapılandırmanıza bağlı. Bir paket yöneticisini kullanarak kolayca yavaş bir yapı oluşturabilirsiniz, ancak bu temelde sabotajdır.

Daha basit ortamlar (daha az bilgi gerekli)? Yine küçük ölçekli kalkınmada kesinlikle bir olasılık. Projeyi, kullanılan kütüphanelerin her birine kadar tamamen kafanızda tutabilirsiniz. Basit bir makefile / other build script ekleyin ve kendinize tam bir paket getirin.

Ama değil yapmak sadece basit ortamlarda çalışır, ortamlar daha basit. Daha büyük ölçekli geliştirmede, özel çözümler yerine standart takımlar kullandığınız için mutlu olacaksınız. Ne de olsa, sadece bir kez öğrenmek zorundasınız (ve du jour paket yöneticisi yeni bir şey ile değiştirilirse, bunu da öğrenmek zorundasınız).


21
@IgnacioSolerGarcia: Sadece hiçbir şey yanlış gitmezse daha kolay olur. Kütüphane A'nın yeni sürümünün de güncellenmiş bir B ve C'ye ihtiyacı varsa? Ya hala çalışıyorsa, ancak ince böcekler ortaya çıkarsa? Hepsi "bağımlılıkları yönetme" nin bir parçası.
sleske

18
@IgnacioSolerGarcia "bir dosyayı indir" diyerek doğru resmi tam olarak çizmiyor. "20 dosya indirin ve sürümlerinin uyumlu olduğundan emin olun" diyelim. Orada işten kaçınılmadı. Paketleri güncellemek de, bağımlılık sürümlerini dondurmaya karar vermediğiniz ve bundan kaynaklanan olası sorunları (hatalar, güvenlik kusurları) kabul etmeye hazır olmadıkça teorik bir durum değildir.
Kayaman

12
@IgnacioSolerGarcia "bir dosya indir" - demek istediğin (1) doğru proje web sitesini bulmak (bazıları github'da, bazıları sourceforge'da, bazıları kendi web sitelerinde barındırılıyor), (2) indirme sayfasına git, (3) doğru sürümü bul , (4) indir, (5) bir yerlere çıkartın ve bırakın. Bu çok daha fazla iş gibi görünüyor blah install libfoo. Ve sonra bunu 5 bağımlılıkla çarpın.
el.pescado

5
@IgnacioSolerGarcia Tamam, bu nuget'in düzgün çalışmasını sağlamak için hangi dosyaları indirmem gerekiyor ? Ve bu temelde bir ASP.NET Core projesi için en önemsiz kurulum. Uygulamada daha birçok bağımlılığa sahip olacaksınız.
Voo

6
@Ignacio Bu, en basit ASP.Net Core uygulamasını kurmaya ve çalıştırmaya yarayan temel meta budur. Tam çerçevenin eski güzel günlerinde doğru olan her şey "daha kolaydı", çünkü aynı anda sürümlenen büyük bir monolitik kütüphaneye sahip oldunuz ve bir güncelleme yayınlamanız yıllar aldı. Bu model, sadece .NET dünyasında değil, çok iyi nedenlerle temel olarak kullanımdan kaldırıldı. Belirli bir şeyi yapan ve dürüst bir şekilde bir paket yöneticisini kullanarak birçok küçük kütüphane modeline alışmanız gerekecek, geçişin en kolay kısmı budur.
Voo

35

Paket yöneticilerinin avantajlarının çoğunu kaçırıyorsunuz .

  1. Paket yöneticileri büyük (birkaç megabayt veya daha büyük) ikili dosyaları kaynak kontrolünde kontrol etmekten kaçınmanıza izin verir. Bunu yapmak, pek çok kaynak kontrol aracına bir anatemadır; en yaygın olanı bunlardan biridir. Birkaç ay önce Bit Bucket'ın boyut sınırlarını dolduran bir depo vardı, çünkü geliştiriciler CocoaPod'ları kontrol ediyordu. SVN'den göç ettiğimizde başka bir proje zaten mevcuttu çünkü tüm lib ikili dosyalarımızı kontrol ediyorduk (ve NuGet'i kullanmıyorduk). Paket yöneticileri her geliştirici için paketleri anında indirebileceğinden, bu ikili dosyaları kontrol etme gereksinimini ortadan kaldırır.
  2. Uyumsuz dosyaların / kitaplıkların karıştırılmasını önler. Biri yükseltme sırasında birileri düzgün şekilde temizlemezse, klasörler kütüphanenin dosyalarının karışık sürümlerini içerebilir. Klasördeki ikililerin yarısının yükseltildiği, çok garip hatalara neden olan bir durum gördüm . (Çarpışmadı bile!) Sorunu çözmemiz bizi aylarca (insan saatlerini değil, tam zamanı) aldı. Paket yöneticisinin tüm klasörü kontrol etmesine izin vererek karışık sürümleri alamazsınız; tutarlılığı sağlarsınız. Ayrıca , her şeyi otomatik olarak güncelleyerek, gerektiğinde farklı sürümler yükleyerek veya kütüphanelerin uyumsuz sürümlerini kullanmaya çalışırken yalnızca uyarılar veya hatalar fırlatarak uyumsuz bağımlılıklar kullanmayı daha da zorlaştırıyorlar .
  3. Kütüphaneleri yönetmek için ortak bir kongre kurarlar . Projenize, ekibinize, şirketinize vb. Yeni geliştiriciler girdiğinde, paket yöneticisinin sözleşmelerini bilmeleri muhtemeldir. Bu, kütüphanelerinizin kod tabanınızda nasıl yönetildiğinin ayrıntılarını bulmak için zaman harcamak zorunda olmadıkları anlamına gelir.
  4. Size kendi bağımlılıklarınızı ve havuzunuza ait olmayan dosyaları sürümleme ve dağıtma konusunda standart bir yol sunarlar. Hatta uygulamamın gerektirdiği bazı büyük statik veri dosyaları için kişisel olarak bunlardan faydalandım, bu yüzden ikili kod dışındaki şeyleri sürümlendirmek için iyi çalışıyor.
  5. Bazı paket yöneticileri yükleme sırasında ek özellikler sağlar. NuGet, csproj dosyanıza bağımlılıklar ve içerik dosyaları ekler ve hatta config dosyasına yapılandırma öğeleri de ekleyebilir.
  6. Paket listesi dosyaları, kütüphanelerinizin sürümlerini tek ve merkezi bir yerde belgeler. Bir DLL dosyasını sağ tıklatıp kütüphanenin hangi sürümünü kullandığımı bulmak için sürüm numarasına bakmam gerekmez. Python'da, kütüphane yazarı py dosyalarına sürüm numarasını bile eklememiş olabilir, bu yüzden kütüphane sürümünü onlardan bile söyleyemeyeceğim.
  7. Makinenin geniş bağımlılık kurulumunu engeller. Paket yöneticileri, bağımlılıkları genel bir yükleyici olmadan kurmanın geleneksel bir yolunu sunar . Seçenekleriniz lib klasörü ve global kurulum olduğunda, birçok kütüphane geliştiricisi kütüphanelerini birincil olarak kendiniz kurmanız gereken indirilebilir ikili dosyalar yerine genel kurulumlar olarak sunmayı seçecektir. (MS geçmişi bunu göstermektedir. Linux'taki birçok kütüphanede de geçerlidir.) Bu, aslında birden fazla projeyi yönetmeyi zorlaştırmaktadır, çünkü çelişkili sürümleri olan projeleriniz olabilir ve bazı geliştiriciler kendi kütüphanelerine sahip olmak için görünüşte daha basit olan global kurulumu seçeceklerdir. dir.
  8. Hosting ve dağıtım merkezileştirme eğilimindedirler. Artık o rasgele kütüphanenin web sitesine bağlı kalmak zorunda değilsiniz. İşleri biterse, başarılı bir paket yöneticisinin sitesi hala tüm sürümlerini yükledi. Geliştiriciler ayrıca sadece yeni kütüphaneleri indirmek için pek çok web sitesi aramak zorunda kalmazlar; Onlar ilk bakmak ve hatta farklı seçeneklere göz atmak için gidilecek yer var. Ayrıca, standart bir şekilde organize edilmiş paketleri yansıtmak, geçici web sitelerinden her şeyin kopyasını manuel olarak almaktan daha kolaydır.

Ayrıca, "faydalarınızın" değerini de abartıyorsunuz.

  1. Paketleri yönetmek için harici bir araca gerek yok.

    Neye "Dış"? NuGet'in depolanabileceğini kontrol ediyorum. Bu küçük, çünkü başka hiçbir ikiliyi kontrol etmem gerekmediği için, kontrol ettiğimi düşündüğüm tek ikili.

    pip, varsayılan olarak Python ile paketlendiğinden ve uyumsuz ve geriye dönük uyumsuz değişikliklerin son derece nadir olduğu için bu cephede sorun yaratmıyor. Yine de projenize harici olarak Python'u kurmadan Python kodu geliştirmeyeceksiniz.

    Yaygın olarak benimsendiklerinde, paket yöneticileri çok kararlı olma eğilimindedir. Sen uzakta olmadan alamayan bazı çok proje için global olarak yüklenmiş kalıp tür ve tek bir paket yöneticisi oldukça hafif gerekliliktir. Genellikle, dil çalışma zamanının yüklenmesinden çok hantal değildir.

  2. İnşa etmek için internet bağlantısı gerekmez.

    Ağ bağlantısı olmadan veritabanıma bağlanamıyorum. Veritabanı Amazon barındırılıyorsa, yine de tam bir internet bağlantısına ihtiyacım var. Kaynak kontrolü ile değişiklikleri zorlamak ve çekmek için bir İnternet bağlantısına ihtiyacım var; Bir derleme sunucusu da bir tür ağ bağlantısı olmadan derlenecek kodu kontrol edemez. Biri olmadan e-posta gönderemez veya alamazsınız . Bunları lib klasörünüze koymak için kütüphaneleri indiremezsiniz! Kalıcı bir internet bağlantısı olmadan gelişen neredeyse hiç duyulmamış. Gerekli olduğu bazı nadir durumlarda, paketleri paket yöneticisinin tüketebileceği bir yere indirerek başa çıkabilirsiniz. (NuGet ve pip'in basit bir klasör veya ağ sürücüsünden çekmekten çok mutlu olduğunu biliyorum; başkalarının da yapabileceğinden şüpheleniyorum.)

  3. Daha hızlı yapı (paket kontrolü yok).

    Otomatik yapım sırasında 30 saniye ve yerel geliştirmeler sırasında 5 saniye yukarıda belirtilen faydalar için iyi bir takas. Bunlar , faydaların çözdüğü sorunlara kıyasla genellikle göz önünde bulundurmaya bile değmeyen önemsiz zaman çerçeveleridir.

  4. Daha basit ortamlar (daha az bilgi gerekli).

    Kütüphane yönetimi için hiçbir şeye karşı paket yönetimi için bir araç , zaten adil bir karşılaştırma değildir. Bu araç olmadan, projenin kullandığı özel süreci öğrenmek zorundasınız.kütüphanelerini yönetmek için. Bu, mevcut bilgilerinizin yaklaştığınız yeni projeler için geçerli olup olmadığından asla emin olamayacağınız anlamına gelir. Birinin ortaya çıktığı hodgepodge yaklaşımı ile uğraşmak zorundasın, ya da kendi kararını ver. Bu, tüm kütüphaneleri içeren bir dizin olabilir veya daha tuhaf bir şey olabilir. Belki kitaplıkları kontrol etmekten kaçınmak için, birileri hepsini bir ağ sürücüsüne yerleştirmiştir ve tek sürüm göstergesi klasör adıdır. Bu ya da global bir kurulum gerçekten daha iyi nasıl? Buna karşılık, bir paket yöneticisi size karşılaştığınız çoğu projeye uygulanacak temiz bir kongre sunar.

Ortak tema, yalnızca projeler içinde değil aynı zamanda bunlar arasında bile tutarlılık, dokümantasyon ve özellikler sağlamalarıdır. Bu herkesin hayatını kolaylaştırır.


10
"İnternet bağlantısı olmadan kalıcı olarak gelişmek neredeyse hiç duyulmamış" Keşke daha iyisini bilmeseydim. Güvenlik nedeniyle tamamen ayrılmış ağlarda birçok geliştirme yapılmış. Evet, göründüğü kadar eğlenceli, ama kesinlikle yapılabilir. Paket depolama için kendi altyapınızı kurmanız gerekir (örn. Kendi nuget feed'iniz).
Voo

1
Kendi altyapınıza sahip olmak aslında her durumda anlamlı olan birkaç şeyden biri olmasına rağmen: Dış altyapı konusunda güvenilir olmak istemezsiniz. Eğer biri bir sebepten dolayı mevcut değilse, geliştiricilerinizin gelişmeye devam edebileceğini garanti eden bir geri dönüşe sahip olmak çok daha iyidir. (Ve kimse bana nuget.org ya da npm ya da <favori paket repolarını ekle> 'nin asla bu kadar sıkıntı yaşamayacağını, belki de tekrar düşüneceğini söylemeden önce )
Voo

3
@IgnacioSolerGarcia Bir proje veya departman başına veya şirket başına bir kongre oluşturmak, herkesin söylenmeden bildiği bir kongre yapmaktan daha iyi değildir. Ek olarak, paket yönetimi sözleşmeyi uygulamaktan daha iyi bir iş çıkarmaktadır , çünkü sözleşmeyi takip etmekten daha az iş çıkarmaktadır. Ayrıca, bahsettiğim gibi, NuGet'i doğrudan veriyorum ve bunu derleme betiğine çağırdım, bu yüzden yüklemesini istemiyorum. Sunucu kurulumlarını tamamen asgari düzeyde tutmaya devam ediyorum.
jpmc26

2
@ jpmc26 İlk numaralı listeniz, bazı vurgulardan fayda sağlayacaktır .
Søren D. Ptæus

1
@ SørenD.Ptæus Tamamlandı.
jpmc26

16

Son zamanlarda ürünümüzü el ile indirilen kitaplıkları kullanmaktan Nuget ile otomatik paket yönetimine dönüştürdüğümde, bir paket yöneticisi kullanmanın büyük faydaları olduğunu söyleyebilirim.

Ürünümüz, bugünün standartlarına göre nispeten küçük olan 27 C # projesinde uygulanmaktadır. Üçüncü taraf bağımlılıklarımızdan bazıları düzinelerce meclise sahiptir.

Nuget'ten önce, tüm bağımlılıklarımızı en son sürüme güncellemek isteseydim, şunu yapmak zorundaydım:

  1. Güncellenen kütüphanelerin tümünü nereden bulabilirim?
  2. Onları indirin ve unzip / install
  3. Kaynak kontrolüne yeni sürümler ekleyin
  4. Projelerimizdeki tüm referansları manuel olarak inceleyin ve yeni montajlara işaret etmek için güncelleyin

27 proje ve düzinelerce bağımlılık meclisi ile bu süreç çok yanlıştı ve saatler sürebilirdi.

Şimdi Nuget kullanarak güncellendiğimize göre, hepsi benim için tek bir komutla bitti.


Katılıyorum, bu profesyonellerin 2 noktası. Zaten değişen bağımlılıklar nadiren yaptığımız bir şeydir (muhtemelen uygun otomatik regresyon testlerinden yoksun olduğundan).
Ignacio Soler Garcia

9
Bağımlılıkları güncellemek, düzenli olarak yaparsanız yapmanız daha az acı verici bir şeydir.
26

1
Bu testler otomatikleştirilmiş mi? Tam olarak kaç dakika sürüyorlar? Tüm test takımını çalıştırmak 24 saat sürse bile, bu bağımlılıkları birkaç dezavantajlı olarak birkaç günde bir güncellemenizi sağlar (muhtemelen pratikte bu kadar sık ​​yapmasanız bile). El ile ve kaçınılmaz olsalar bile, el ile yüklemeyi kullanarak, yalnızca bir bağımlılığın bazı bağımlılıklarını özlediğiniz için başarısız olduklarını bulmak için sınamalar yaparak günlerce harcayabilirsiniz, o zaman gerçekleşmeden yükleme işleminden sonra yeniden başlamak zorunda kalırsınız. paket yönetimini kullanarak ...
Sean Burton

3
Yeni yazılım sürümlerinde regresyon testlerine gerek yok mu? Bir sürüm için zaten test yaparken bağımlılıkları güncellemeniz yeterlidir.
26

4
“Onları tam otomatik hale getirmiyoruz ve araç bunu yapmak için çok büyük (onu test etmek veya otomatikleştirmek aylarca sürebilir)” - büyük probleminiz var. Bu testler başından beri yapılmalıydı. Sorununuz paket yöneticileri kullanmanın fayda sağlaması değil, sorununuz, üzerinde çalıştığınız içeriğin başkalarının tadını çıkarmanıza izin vermeyecek kadar kırılmış olmasıdır.
Ant P,

14

Paketleri yönetmek için harici bir araca gerek yok

Bu bir anlam ifade etmiyor mu? Bir paket yöneticisi kullanırsam, bir lib klasörüne sahip olmam gerekmez. Ayrıca paketleri kendim yönetmek zorunda değilim.

İnşa etmek için internet bağlantısı gerekmez

Geliştirme sırasında bugün internet bağlantısına sahip olmamanın yanı sıra, nadiren de olsa (belki transit olma dışında), düzgün bir paket yöneticisi uygulamanızı oluşturmak için en son sürüme sahip olmanız gerekmemelidir. Şikayet edebilir, ancak daha önce kurulu olan sürümle derhal kurmamaya gerek yok

Daha hızlı yapı (paket kontrolü yok)

Bu oldukça marjinal bir sürat patlaması, ancak bunun için muhtemelen bir noktaya değinebilirsiniz.

Daha basit ortamlar (daha az bilgi gerekli)

Paket yöneticilerinin çoğu, bugünlerde o kadar basittir ki, bunları yaparak etraflarında dolanmaya çalışmakta fayda var. İstersen görsel müşteriler bile var. Onlar aslında olan sürtüğün çoğunu gizliyorlar.

Paket yöneticileri bu paketleri farklı projeler arasında paylaşmanıza da izin verir. Projelerimden 5'i aynı Boost sürümünü kullanıyorsa, bunu her proje için çoğaltmanıza gerek yoktur. Bu, özellikle bahsettiğiniz karmaşık bağımlılık ağaçları için geçerlidir.

Bir lib klasörü ile sadece o proje için paketleri yönetirsiniz, bir paket yöneticisi ise bunu tüm geliştirme ortamınız için tek bir araçla yapmanıza izin verir.


Bağımlılıkları geri yüklemek için bir derleme sırasında bir paket yöneticisi kurmak üzere yapılandırılmış bir derleme aracısına sahip olmak o kadar kolay değildir. Bir lib klasörü ile gerekli bir şey yok.
Ignacio Soler Garcia

4
Sanırım hangi dili / dilleri kullandığınıza bağlı. Ruby veya Rust gibi dillerle paket yönetimi o kadar iyi bir şekilde bütünleşir ki, kullanımı tamamen önemsizdir.
Sean Burton

Daha geniş yorumlarda bulunmak istememiştim ama özellikle NuGet, C # ve VSTS bulutu hakkında konuşuyorum.
Ignacio Soler Garcia

4
@Ignacio Kullandığınız yapı sistemi, NuGets'i geri yüklemeyi tamamen önemsiz kılmayan derhal atılmalıdır. Neyse ki VSTS bunu olabildiğince kolaylaştırıyor ( belgeler ): Çözüm dosyanızın üzerine gelip NuGet'in hangi kaynakların kullanılacağını söyleyen bir NuGet geri yükleme görevi var - basit bir proje kullanmak için basitçe kullanmanız yeterli nuget.org(varsayılan şablonun zaten bu şekilde ayarlanmış).
Voo

3
@Ben RVM bir paket yöneticisi değil. Ruby'nin paket yöneticisi RubyGems'dir. RVM, Ruby'nin versiyonlarını yönetir ve bunun için rbenv daha iyidir ...
Sean Burton

5

Yalnızca kütüphaneleri kullanmak (lib dizini) ile bunları kullanmak, meta-bilgiyi (paket yöneticisi) korumak arasındaki farktır . Böyle bir meta-bilgi versiyon numaraları, kütüphaneler arasındaki (geçişli) bağımlılıklar ile ilgilidir.

DLL cehennemi, kütüphane uyumluluğu, java modül sistemi, OSGi ve benzeri tartışmaları, en azından bir miktar bağımlılık yönetimine sahip olmaya ikna edici olmalıdır.

  • Kütüphane sürümü ve bağımlılık sorunları zaman kaybı olabilir.

Ayrıca paylaşılan (yerel) bir deponun yararı vardır, bu nedenle birçok projenin ithal edilen kütüphanelerin kopyalarını saklaması gerekmez. Birinin 20 alt modülü olan bir projesi varsa, bu modüllerin bazıları 40 garip bağımlılığa sahiptir.

  • Daha yapısı
  • Kütüphanelerin daha fazla kırpılması
  • Kütüphaneler hakkında geçici insan kararları yok

3

Bir lib klasörünün gerekli olabileceği bazı durumlar vardır, örneğin eski kütüphaneler (bunun bir versiyonu artık korunmaz / mevcut değildir), bir kütüphanenin yerel olarak değiştirilmiş bir versiyonu ...

Ancak her şey için, paket yöneticisinin rolünü üstlenen geliştirici gibidir:

  • Geliştiricinin kütüphaneleri indirmesi gerekir (internet gerekli)
  • Geliştiricinin daha yeni sürümleri manuel olarak kontrol etmesi gerekir
  • ...

Ve IMHO, bu daha az bilgi gerektiriyor, çünkü harici aracın kullanımı hakkında bilgi edinmek zorundasınız, fakat kütüphaneler hakkında daha az bilgi (bağımlılıklar gibi).


4
Eski veya değiştirilmiş kütüphaneler için bile, şu ana kadar gördüğüm tüm paket yöneticileri yerel bağımlılıkları yerel deponuza yükleme seçeneği sunar. Ama, tamam, "sadece otomatik olarak çalışır" deneyiminden bazılarını kaybettiğiniz yer burasıdır.
Hulk

@Hulk açık kaynak kodlu bir kütüphaneyse, sürümünüzü yayınlayabilir ve böylece paket yöneticisine görünür hale getirebilirsiniz. Değişiklikleri bakıcılara iterek ya da kendi kütüphanenizdeki çatalları çıkartarak.
leftaroundabout

Sağlayıcısı yama düzeltme için yanıt vermeyen bir kitaplığı değiştirdiyseniz, paket yöneticisini, kitaplığa bağlı diğer paketlerin değiştirilmiş kitaplığınızdan da memnun olacağı şekilde yapılandırmanın bir sorunu olur.
Damian Yerrick,

1

Başka soruların kapsamadığı bir başka sorun daha var: paylaşım komisyonları.

Diyelim ki aynı kütüphaneyi inşa eden iki paketiniz var . En iyi durumda, herhangi bir çakışma olmayacak, ancak aynı HDD / SSD alanı iki kez kullanıldı. En kötüsü, sürümler gibi varios çatışmaları olacak.

Paket yöneticisini kullanırsanız, kitaplığı yalnızca bir kez kuracak (sürüm başına) ve zaten ona yol sağlayacaktır.

Not: Tabii ki, bu profesyonelliği elde etmek için dinamik bağlantıya (veya kendi dilinizde benzer bir işlev) ihtiyacınız var.


-5

Paylaşılan kütüphanelerin 90'lı yılların Unix ve Windows sistemlerinde bir ilerleme unsuru olarak görülmesinin temel sebeplerinden biri, aynı kütüphaneleri kullanan birden fazla program yüklendiğinde RAM kullanımını nasıl azaltabilecekleriydi. Kod alanı yalnızca tam kitaplığa ve bu kitaplığın sürümüne bir ONCE tahsis edilmesi gerekir , kalan tek örnek başına bellek kullanımı statik değişkenler içindir.

Birçok işletim sistemi, ortak kütüphaneleri, unix mmap () api gibi mekanizmalara bağlı bir şekilde uygular - bu da bir kütüphanenin sadece aynı sürümde olması gerekmeyeceği, aynı zamanda aynı DOSYA olması gerektiği anlamına gelir. Bu, kendi kütüphanelerini içeren bir programdan tam anlamıyla faydalanmak imkansızdır.

Hafızanın çok daha ucuz olduğu ve kütüphane sürümlerinin 90'lı yıllara göre daha çeşitli olması gerektiğine göre, bu argüman bugün çok fazla ağırlık taşımamaktadır.


4
Bu soru paylaşılan kütüphaneler hakkında değil, bir kütüphane klasöründeki bağımlılıklar hakkında konuşur.
Ignacio Soler Garcia

1
Bu OP'nin sorusuna cevap vermiyor
esoterik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.