ความแตกต่างระหว่าง Cabal และ Stack คืออะไร?


109

เมื่อวานนี้ผมได้เรียนรู้เกี่ยวกับเครื่องมือ Haskell ใหม่ที่เรียกว่ากอง ในตอนแรกบลัชออนดูเหมือนว่าจะทำหน้าที่เดียวกับ Cabal แล้วอะไรคือความแตกต่างระหว่างพวกเขา? กองซ้อนแทน Cabal หรือไม่? ฉันควรใช้ Stack แทน Cabal ในกรณีใด Stack ทำอะไรที่ Cabal ทำไม่ได้?


fpcomplete.com/blog/2015/06/announcing-first-public-beta-stack (เรียกสั้น ๆ ว่า kindof แทนที่cabal-installและใช้ stackage ให้มากที่สุด - อาจมีการรวมกลับเข้ากับ cabal-install ในบางจุดและฉันคิดว่า ชุมชนไม่แน่ใจว่านี่เป็นสิ่งที่ดีหรือไม่เพราะอาจทำให้ชุมชนแตกแยก)
Carsten

AFAIU stack มีประโยชน์อย่างรวดเร็วในการทำงานกับโปรเจ็กต์ที่มีอยู่ หากคุณเริ่มต้นจากศูนย์คุณจะต้องใช้คาบาลอย่างแน่นอน
mb14

@ mb14 นั่นไม่ใช่อย่างนั้น คุณสามารถใช้สแต็กเพื่อเริ่มโปรเจ็กต์ตั้งแต่เริ่มต้น ในความเป็นจริงเทมเพลตสแต็กมีวิธีง่ายๆในการทำเช่นนั้น
Sibi

ดูบทความสั้น ๆ นี้เพื่อดูภาพรวมที่ดี: scs.stanford.edu/16wi-cs240h/labs/stack.html
michid

คำตอบ:


80

กองซ้อนแทน Cabal หรือไม่?

ใช่และไม่.

ฉันควรใช้ Stack แทน Cabal ในกรณีใด Stack ทำอะไรที่ Cabal ทำไม่ได้?

สแต็คที่ใช้แพคเกจ stackage curated โดยค่าเริ่มต้น ด้วยเหตุนี้การพึ่งพาใด ๆ จึงเป็นที่รู้กันว่าสร้างร่วมกันโดยหลีกเลี่ยงปัญหาความขัดแย้งของเวอร์ชัน (ซึ่งย้อนกลับไปเมื่อเป็นเรื่องธรรมดาในประสบการณ์ Haskell เคยเป็นที่รู้จักกันในชื่อ "นรกขุมทรัพย์") Cabal เวอร์ชันล่าสุดยังมีมาตรการเพื่อป้องกันความขัดแย้ง ถึงกระนั้นการตั้งค่าการกำหนดค่าบิลด์ที่ทำซ้ำได้ซึ่งคุณรู้แน่ชัดว่าอะไรจะถูกดึงออกจากที่เก็บนั้นจะง่ายกว่าด้วย Stack โปรดทราบว่ายังมีข้อกำหนดสำหรับการใช้แพ็กเกจที่ไม่ใช่สแต็กเกจดังนั้นคุณจึงพร้อมใช้งานแม้ว่าแพ็คเกจจะไม่มีอยู่ในสแน็ปช็อต

โดยส่วนตัวแล้วฉันชอบ Stack และอยากแนะนำให้นักพัฒนา Haskell ทุกคนใช้มัน การพัฒนาของพวกเขาเป็นไปอย่างรวดเร็ว และจะมีมาก UX ที่ดีกว่า และมีบางสิ่งที่ Stack ทำซึ่ง Cabal ยังไม่มีให้:

  • Stack ยังดาวน์โหลด GHC ให้คุณและเก็บไว้ในสถานที่แยกต่างหาก
  • การสนับสนุน Docker (ซึ่งสะดวกมากสำหรับการปรับใช้แอปพลิเคชัน Haskell ของคุณ)
  • สคริปต์ Haskell ที่ทำซ้ำได้ : คุณสามารถระบุเวอร์ชันของแพ็กเกจและสามารถรับประกันได้ว่าจะดำเนินการโดยไม่มีปัญหา ( Cabal ยังมีคุณลักษณะของสคริปต์แต่การสร้างความมั่นใจในความสามารถในการทำซ้ำได้อย่างเต็มที่นั้นค่อนข้างไม่ตรงไปตรงมา)
  • stack build --fast --file-watchความสามารถในการทำ สิ่งนี้จะสร้างใหม่โดยอัตโนมัติหากคุณเปลี่ยนไฟล์ในเครื่องที่มีอยู่ การใช้มันร่วมกับ--pedanticตัวเลือกเป็นตัวทำลายข้อตกลงสำหรับฉัน
  • สนับสนุน Stack สร้างโครงการโดยใช้แม่แบบ นอกจากนี้ยังรองรับเทมเพลตที่คุณกำหนดเอง
  • Stack มีการรองรับhpackในตัว มีทางเลือกอื่น (IMO ซึ่งเป็นวิธีที่ดีกว่า) ในการเขียนไฟล์ cabal โดยใช้ไฟล์ yaml ซึ่งใช้กันอย่างแพร่หลายในอุตสาหกรรม
  • Intero มีประสบการณ์ที่ราบรื่นเมื่อทำงานกับสแต็ค

มีโพสต์บล็อกที่ดีที่อธิบายความแตกต่าง: ทำไม Stack ถึงไม่ใช่ Cabal? ในขณะที่ Cabal มีการแทรกแซงในช่วงหลายปีที่ผ่านมานับตั้งแต่โพสต์นั้นได้มีการพัฒนาเพื่อที่จะเอาชนะบางประเด็นที่กล่าวถึงที่นั่นการอภิปรายเกี่ยวกับเป้าหมายการออกแบบและปรัชญาเบื้องหลัง Stack ยังคงมีความเกี่ยวข้อง


มีการเปลี่ยนแปลงอะไรบ้างไหมตั้งแต่เปิดตัว cabal 3
William Rusnack

1
@WilliamRusnack ใช่มี. โดยพื้นฐานแล้วเวิร์กโฟลว์ Cabal เริ่มต้นจะรวมเอาการหลีกเลี่ยงความขัดแย้งในการพึ่งพาแม้ว่ากลยุทธ์ที่ใช้ทำจะแตกต่างจาก Stack อย่างเห็นได้ชัด (@Sibi: ฉันมีเสรีภาพในการอัปเดตคำตอบของคุณเพื่อให้มันสะท้อนให้เห็นได้ดีขึ้นว่าสิ่งต่าง ๆ ยืนอยู่ในทุกวันนี้)
duplode

35

ในสิ่งต่อไปนี้ฉันจะอ้างถึงเครื่องมือทั้งสองถูกเปรียบเทียบเป็นพันธมิตรการติดตั้งและสแต็ค โดยเฉพาะอย่างยิ่งฉันจะใช้cabal-installเพื่อหลีกเลี่ยงความสับสนกับไลบรารีCabalซึ่งเป็นโครงสร้างพื้นฐานทั่วไปที่ใช้โดยเครื่องมือทั้งสอง

พูดกว้างเราสามารถพูดได้ซ่องสุมติดตั้งและสแต็คเป็นส่วนหน้าเพื่อCabal เครื่องมือทั้งสองช่วยให้สามารถสร้างโปรเจ็กต์ Haskell ซึ่งชุดของการอ้างอิงอาจขัดแย้งกันภายในขอบเขตของระบบเดียว ความแตกต่างที่สำคัญระหว่างพวกเขาอยู่ที่วิธีที่พวกเขาจัดการกับเป้าหมายนี้:

  • ตามค่าเริ่มต้นcabal-installจะเมื่อถูกขอให้สร้างโปรเจ็กต์ดูการอ้างอิงที่ระบุใน.cabalไฟล์และใช้ตัวแก้ไขการอ้างอิงเพื่อค้นหาชุดของแพ็กเกจและเวอร์ชันแพ็กเกจที่ตรงตามความต้องการ ชุดนี้มาจากHackageโดยรวม - แพ็คเกจทั้งหมดและทุกเวอร์ชันทั้งในอดีตและปัจจุบัน ~/.cabalเมื่อแผนสร้างความเป็นไปได้พบรุ่นที่ได้รับการแต่งตั้งการอ้างอิงจะถูกติดตั้งและจัดทำดัชนีในที่ใดที่หนึ่งในฐานข้อมูล ความขัดแย้งของเวอร์ชันระหว่างการพึ่งพาสามารถหลีกเลี่ยงได้โดยการทำดัชนีแพ็คเกจที่ติดตั้งตามเวอร์ชัน (รวมถึงตัวเลือกการกำหนดค่าอื่น ๆ ที่เกี่ยวข้อง) เพื่อให้โครงการต่างๆสามารถดึงข้อมูลเวอร์ชันการอ้างอิงที่ต้องการได้โดยไม่ต้องเหยียบกัน การจัดเรียงนี้เป็นสิ่งที่เอกสารคู่มือการติดตั้ง cabalหมายถึง"Nix-style local builds"

  • เมื่อถูกขอให้สร้างโปรเจ็กต์สแต็กจะแทนที่จะไปที่ Hackage ให้ดูที่resolverฟิลด์ของstack.yaml. ในเวิร์กโฟลว์เริ่มต้นฟิลด์ดังกล่าวระบุสแน็ ปช็อตStackageซึ่งเป็นส่วนย่อยของแพ็กเกจ Hackage ที่มีเวอร์ชันคงที่ซึ่งทราบว่าเข้ากันได้ จากนั้นสแต็กจะพยายามตอบสนองการอ้างอิงที่ระบุใน.cabalไฟล์ (หรืออาจเป็นproject.yamlไฟล์ - รูปแบบที่แตกต่างกันบทบาทเดียวกัน) โดยใช้เฉพาะสิ่งที่จัดเตรียมโดยสแน็ปช็อต แพ็กเกจที่ติดตั้งจากแต่ละสแน็ปช็อตจะถูกลงทะเบียนในฐานข้อมูลแยกกันซึ่งจะไม่รบกวนซึ่งกันและกัน

เราอาจกล่าวได้ว่าวิธีการสแต็กเป็นการแลกเปลี่ยนความยืดหยุ่นในการตั้งค่าเพื่อความตรงไปตรงมาเมื่อต้องระบุการกำหนดค่าบิลด์ โดยเฉพาะอย่างยิ่งถ้าคุณรู้ว่าโปรเจ็กต์ของคุณใช้สแน็ปช็อต LTS 15.3 คุณสามารถไปที่หน้า Stackageและทราบได้อย่างรวดเร็วว่าเวอร์ชันของสแต็กอ้างอิงใด ๆอาจดึงมาจาก Stackage ที่กล่าวว่าเครื่องมือทั้งสองมีคุณสมบัติที่นอกเหนือไปจากเวิร์กโฟลว์พื้นฐานดังนั้นโดยใหญ่แล้วแต่ละอย่างสามารถทำทุกอย่างที่ทำได้ (แม้ว่าอาจจะสะดวกน้อยกว่าก็ตาม) ตัวอย่างเช่นมีหลายวิธีในการตรึงเวอร์ชันที่แน่นอนของการกำหนดค่าการสร้างที่ดีที่รู้จักและแก้ไขการอ้างอิงด้วยสถานะเก่าของการแฮ็กที่มีการติดตั้ง cabalและมันก็เป็นไปได้ที่จะต้องมีการอ้างอิงที่ไม่ใช่ Stackage หรือแทนที่ภาพรวมแพคเกจรุ่นในขณะที่ใช้สแต็ค

สุดท้ายความแตกต่างระหว่างอื่นซ่องสุมติดตั้งและสแต็คซึ่งเป็นขนาดใหญ่พอที่จะคุ้มค่าการกล่าวขวัญในภาพรวมของเรื่องนี้ก็คือสแต็คมีจุดมุ่งหมายที่จะให้การสร้างสภาพแวดล้อมที่สมบูรณ์ที่มีคุณสมบัติเช่นการจัดการการติดตั้ง GHC อัตโนมัติและบูรณาการเทียบท่า ในทางตรงกันข้ามการติดตั้งแบบ cabalมีจุดมุ่งหมายเพื่อตั้งฉากกับส่วนอื่น ๆ ของระบบนิเวศดังนั้นจึงไม่ได้พยายามที่จะให้คุณลักษณะประเภทนี้ (โดยเฉพาะรุ่น GHC จะต้องได้รับการติดตั้งและจัดการแยกกันไม่ว่าจะเป็นผ่าน Linux distro แพ็คเกจHaskell Platform Coreใน Windows หรือเครื่องมือ ghcup )


11

จากสิ่งที่ฉันสามารถรวบรวมได้จาก FAQ ดูเหมือนว่า Stack จะใช้ไลบรารี Cabal แต่ไม่ใช่cabal.exeไบนารี (เรียกอีกอย่างว่า cabal-install) ดูเหมือนว่าเป้าหมายของโครงการคือการทำแซนด์บ็อกซ์โดยอัตโนมัติและการหลีกเลี่ยงนรกแห่งการพึ่งพา

กล่าวอีกนัยหนึ่งก็คือใช้โครงสร้างแพ็คเกจ Cabal เดียวกันเพียง แต่มีส่วนหน้าที่แตกต่างกันสำหรับการจัดการสิ่งนี้ (ฉันคิด!)


นอกจากcabalนี้ดูเหมือนว่าซอร์สโค้ดจะใช้dockerด้วย แม้ว่าฉันจะไม่รู้ว่าพวกเขาใช้หรือยัง
Sibi

@Sibi ใช่ดูเหมือนว่าคุณสามารถเลือกที่จะโยนสิ่งของลงใน Docker ได้และมันก็ตั้งใจทำงาน ฉันไม่ได้ดูมันมากไปกว่านี้ ...
MathematicalOrchid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.