กองซ้อนแทน 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-install
และใช้ stackage ให้มากที่สุด - อาจมีการรวมกลับเข้ากับ cabal-install ในบางจุดและฉันคิดว่า ชุมชนไม่แน่ใจว่านี่เป็นสิ่งที่ดีหรือไม่เพราะอาจทำให้ชุมชนแตกแยก)