Cabal ve Stack arasındaki fark nedir?


109

Dün Stack adında yeni bir Haskell aracı öğrendim . İlk bakışta Cabal ile aynı işi yapıyor gibi görünüyor. Peki aralarındaki fark nedir? Yığın, Cabal'ın yerini mi alıyor? Cabal yerine Stack'i hangi durumlarda kullanmalıyım? Stack, Cabal'ın yapamayacağı ne yapabilir?


fpcomplete.com/blog/2015/06/announcing-first-public-beta-stack (kısacası cabal-install, olabildiğince yığın değiştirir ve kullanır - bir noktada cabal-install'a bir miktar geri entegrasyon olabilir ve bence Bu iyi bir şey olup olmadığını topluluk) o topluluğa bölünmüş olabileceğinden, emin değildir
Carsten

AFAIU yığını, mevcut bir proje üzerinde hızlı bir şekilde çalışmak için kullanışlıdır. Bir şeye sıfırdan başlarsanız, kesinlikle cabal kullanmanız gerekecek.
mb14

@ mb14 Durum bu değil. Projeleri sıfırdan başlatmak için yığını kullanabilirsiniz. Aslında, yığın şablonları bunu yapmanın kolay bir yolunu sağlar.
Sibi

İyi bir genel bakış için bu kısa makaleye bakın: scs.stanford.edu/16wi-cs240h/labs/stack.html
michid

Yanıtlar:


80

Yığın Cabal'ın yerine mi geçiyor?

Evet ve hayır.

Cabal yerine Stack'i hangi durumlarda kullanmalıyım? Stack, Cabal'ın yapamayacağı ne yapabilir?

Stack, varsayılan olarak küratörlü yığın paketlerini kullanır . Öyleyse, herhangi bir bağımlılığın birlikte kurulduğu ve sürüm çakışması sorunlarından kaçınıldığı bilinmektedir (ki bu, Haskell deneyiminde sıradan olduklarında, eskiden "cabal cehennemi" olarak biliniyordu). Cabal'ın son sürümlerinde de çatışmayı önlemek için önlemler var. Yine de, depolardan neyin çekileceğini tam olarak bildiğiniz yeniden üretilebilir bir yapı yapılandırması kurmak, Stack ile daha basittir. Ayrıca yığın dışı paketlerin kullanılması için bir hüküm olduğunu unutmayın, bu nedenle yığın anlık görüntüsünde bir paket olmasa bile gitmeniz iyi olur.

Şahsen, Stack'i seviyorum ve her Haskell geliştiricisinin onu kullanmasını tavsiye ediyorum. Gelişmeleri hızlıdır . Ve çok daha iyi bir UX'e sahip. Ve Cabal'ın henüz sağlamadığı, Stack'in yaptığı şeyler var:

  • Hatta Stack, GHC'yi sizin için indirir ve onu izole bir konumda tutar.
  • Docker desteği (Haskell uygulamalarınızı dağıtmak için çok uygundur)
  • Tekrarlanabilir Haskell betiği : Bir paketin sürümünü tam olarak belirleyebilir ve her zaman sorunsuz çalışacağına dair garanti alabilirsiniz. ( Cabal ayrıca bir komut dosyası özelliğine de sahiptir , ancak onunla yeniden üretilebilirliği tam olarak sağlamak o kadar kolay değildir.)
  • Yapabilme yeteneği stack build --fast --file-watch. Mevcut yerel dosyaları değiştirirseniz bu otomatik olarak yeniden oluşturulur. Bunu seçenekle birlikte kullanmak benim --pedanticiçin bir anlaşma kırıcı.
  • Stack, şablonları kullanarak proje oluşturmayı destekler . Ayrıca kendi özel şablonlarınızı da destekler.
  • Stack, içinde yerleşik hpack desteğine sahiptir. Endüstride daha yaygın olarak kullanılan yaml dosyasını kullanarak cabal dosyalarını yazmanın alternatif (IMO, daha iyi) bir yolunu sağlar.
  • Intero, Stack ile çalışırken sorunsuz bir deneyime sahiptir .

Farkı açıklayan güzel bir blog yazısı var: Stack neden Cabal değil? Cabal, o görevden bu yana geçen yıllarda, orada tartışılan sorunların bazılarının üstesinden gelmek için gelişirken, Stack'in arkasındaki tasarım hedefleri ve felsefesinin tartışması geçerliliğini koruyor.


Cabal 3 piyasaya sürüldüğünden beri herhangi bir değişiklik oldu mu?
William Rusnack

1
@WilliamRusnack Evet, var. Öncelikle, varsayılan Cabal iş akışı artık bağımlılık çatışmasından kaçınmayı içeriyor, ancak bunu yapmak için kullandığı strateji Stack'inkinden belirgin şekilde farklı. (@Sibi: Cevabınızı, bugünlerde işlerin nerede durduğunu daha iyi yansıtacak şekilde güncelleme özgürlüğünü aldım.)
06'da duplode

35

Aşağıda, cabal-install ve stack olarak karşılaştırılan iki araca değineceğim . Özellikle, her iki araç tarafından da kullanılan ortak altyapı olan Cabal kitaplığıyla karışıklığı önlemek için cabal-install kullanacağım .

Geniş anlamda, diyebiliriz cabal yükleme ve istif etmek önyüzleridir Cabal'a . Her iki araç da, tek bir sistemin sınırları içinde bağımlılıkları birbiriyle çatışabilecek Haskell projeleri oluşturmayı mümkün kılar. Aralarındaki temel fark, bu hedefi nasıl ele aldıklarında yatmaktadır:

  • Varsayılan olarak, cabal-install , bir proje oluşturması istendiğinde, .cabaldosyasında belirtilen bağımlılıklara bakar ve onu karşılayan bir dizi paket ve paket sürümünü bulmak için bir bağımlılık çözücü kullanır. Bu set bir bütün olarak Hackage'dan alınmıştır - tüm paketler ve tüm sürümler, geçmiş ve şimdiki. Uygulanabilir bir yapı planı bulunduğunda, bağımlılıkların seçilen sürümü içinde bir yerde bir veritabanında kurulacak ve dizine eklenecektir ~/.cabal. Farklı projeler birbirlerinin ayak parmaklarına basmadan ihtiyaç duydukları bağımlılık sürümlerini alabilmeleri için, yüklenen paketlerin sürümlerine (ve diğer ilgili yapılandırma seçeneklerine) göre endekslenmesiyle bağımlılıklar arasındaki sürüm çakışmaları önlenir. Bu düzenleme necabal-install belgeleri "Nix tarzı yerel yapılar" anlamına gelir .

  • Bir proje oluşturmanız istendiğinde, Stack Hackage'a gitmek yerine resolveralanına bakacaktır stack.yaml. Varsayılan iş akışında bu alan , karşılıklı olarak uyumlu olduğu bilinen sabit sürümlere sahip Hackage paketlerinin bir alt kümesi olan bir Yığın anlık görüntüsünü belirtir . Yığın daha sonra belirtilen bağımlılıkları karşılamak için çalışacaktır dosyası (muhtemelen ya dosyayı anlık tarafından sağlanmaktadır yalnızca ne kullanarak - Farklı formatı, aynı rol). Her anlık görüntüden yüklenen paketler, birbirini engellemeyen ayrı veritabanlarına kaydedilir..cabalproject.yaml

Biz söylenebilir yığını bir yapı yapılandırma belirlemek söz konusu olduğunda yaklaşım dürüstlük için bazı kurulum esnekliği esnaf. Özellikle, projenizin örneğin LTS 15.3 anlık görüntüsünü kullandığını biliyorsanız, Stackage sayfasına gidebilir ve bir bakışta herhangi bir bağımlılık yığınının sürümlerinin Stackage'den çekilebileceğini anlayabilirsiniz. Bununla birlikte, her iki araç da temel iş akışlarının ötesine geçen özellikler sunar, böylece genel olarak her biri diğerinin yaptığı her şeyi yapabilir (muhtemelen daha az uygun bir şekilde). Örneğin, bilinen iyi bir yapı yapılandırmasının tam sürümlerini dondurmanın ve bağımlılıkları cabal-install ile eski bir Hackage durumuyla çözmenin yolları vardır.ve Stackage dışı bağımlılıkları zorunlu kılmak veya yığın kullanırken anlık görüntü paketi sürümlerini geçersiz kılmak mümkündür .

Son olarak, bu genel bakışta bahsetmeye değer kadar büyük olan cabal-install ile yığın arasındaki diğer bir fark , yığının otomatik GHC kurulum yönetimi ve Docker entegrasyonu gibi özelliklerle eksiksiz bir yapı ortamı sağlamayı amaçlamasıdır . Buna karşılık, cabal-install , ekosistemin diğer bölümlerine ortogonal olması amaçlanmıştır ve bu nedenle, bu tür bir özelliği sağlamaya çalışmaz (özellikle, GHC sürümleri, ister Linux dağıtımı yoluyla olsun, ayrı olarak kurulmalı ve yönetilmelidir paketleri, Windows'ta Haskell Platform Core veya ghcup aracı ).


11

SSS'den edindiğim kadarıyla, Stack'in Cabal kütüphanesini kullandığı, ancak cabal.exeikili (daha doğrusu cabal-install olarak bilinir) kullandığı görülüyor . Görünüşe göre projenin amacı otomatik sandboxing ve bağımlılık cehenneminden kaçınma.

Başka bir deyişle, aynı Cabal paketi yapısını kullanır, sadece bu şeyleri yönetmek için farklı bir ön uç sağlar. (Bence!)


Bunun dışında cabalkaynak kodları da kullanılıyor gibi görünüyor docker. Yine de bunu kullanıp kullanmadıklarını bilmiyorum.
Sibi

@Sibi Evet, isteğe bağlı olarak Docker'a bir şeyler atabileceğinize benziyor ve çalışması gerekiyor. Buna daha fazla bakmadım ...
MathematicalOrchid
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.