Berikut ini, saya akan merujuk pada dua alat yang dibandingkan sebagai cabal-install dan stack . Secara khusus, saya akan menggunakan cabal-install untuk menghindari kebingungan dengan perpustakaan Cabal , yang merupakan infrastruktur umum yang digunakan oleh kedua alat.
Secara garis besar, kita dapat mengatakan cabal-install dan stack adalah frontend ke Cabal . Kedua alat memungkinkan untuk membangun proyek Haskell yang kumpulan dependensinya mungkin bertentangan satu sama lain dalam batasan satu sistem. Perbedaan utama di antara mereka terletak pada cara mereka menangani tujuan ini:
Secara default, cabal-install akan, ketika diminta untuk membangun sebuah proyek, melihat dependensi yang ditentukan dalam .cabal
filenya dan menggunakan pemecah ketergantungan untuk mencari tahu satu set paket dan versi paket yang memenuhinya. Set ini diambil dari Hackage secara keseluruhan - semua paket dan semua versi, dulu dan sekarang. Setelah rencana build yang layak ditemukan, versi dependensi yang dipilih akan diinstal dan diindeks dalam database di suatu tempat ~/.cabal
. Konflik versi antar dependensi dapat dihindari dengan mengindeks paket yang diinstal sesuai dengan versinya (serta opsi konfigurasi lain yang relevan), sehingga project yang berbeda dapat mengambil versi dependensi yang mereka perlukan tanpa saling menginjak kaki satu sama lain. Pengaturan ini adalah apadokumentasi cabal-install berarti "build lokal bergaya Nix" .
Ketika diminta untuk membangun sebuah proyek, tumpukan akan, daripada pergi ke Hackage, lihat resolver
bidang stack.yaml
. Dalam alur kerja default, bidang tersebut menentukan snapshot Stackage , yang merupakan subset dari paket Hackage dengan versi tetap yang diketahui kompatibel satu sama lain. tumpukan maka akan berusaha untuk memenuhi dependensi ditentukan dalam berkas (atau mungkin para berkas - format yang berbeda, peran yang sama) hanya menggunakan apa yang disediakan oleh snapshot. Paket yang diinstal dari setiap snapshot terdaftar dalam database terpisah, yang tidak saling mengganggu..cabal
project.yaml
Kami mungkin mengatakan bahwa pendekatan stack memperdagangkan beberapa fleksibilitas penyiapan untuk kesederhanaan saat menentukan konfigurasi build. Secara khusus, jika Anda tahu bahwa proyek Anda menggunakan, katakanlah, snapshot LTS 15.3, Anda dapat membuka halaman Stackage dan mengetahui, sekilas, versi tumpukan dependensi apa pun yang mungkin diambil dari Stackage. Meskipun demikian, kedua alat menawarkan fitur yang melampaui alur kerja dasar sehingga, pada umumnya, masing-masing dapat melakukan semua yang dilakukan yang lain (meskipun mungkin dengan cara yang kurang nyaman). Misalnya, ada cara untuk membekukan versi yang tepat dari konfigurasi build yang dikenal baik dan untuk menyelesaikan dependensi dengan status lama Hackage dengan cabal -install, dan dimungkinkan untuk meminta dependensi non-Stackage atau mengganti versi paket snapshot saat menggunakan stack .
Terakhir, perbedaan lain antara cabal-install dan stack yang cukup besar untuk disebutkan dalam ikhtisar ini adalah bahwa stack bertujuan menyediakan lingkungan build yang lengkap, dengan fitur-fitur seperti manajemen instalasi GHC otomatis dan integrasi Docker . Sebaliknya, cabal-install dimaksudkan untuk menjadi ortogonal ke bagian lain dari ekosistem, dan karenanya tidak berusaha menyediakan fitur semacam ini (khususnya, versi GHC harus diinstal dan dikelola secara terpisah, baik itu melalui distro Linux paket, Haskell Platform Core di Windows, atau alat ghcup ).
cabal-install
dan menggunakan tumpukan sebanyak mungkin - mungkin ada beberapa integrasi kembali ke cabal-install di beberapa titik dan saya pikir komunitas tidak yakin apakah ini hal yang baik atau tidak, karena dapat memecah komunitas)