Sự khác biệt giữa Cabal và Stack là gì?


104

Hôm qua tôi đã biết về một công cụ Haskell mới có tên là Stack . Ở lần đánh má hồng đầu tiên, có vẻ như nó thực hiện nhiều công việc giống như Cabal. Vì vậy, sự khác biệt giữa chúng là gì? Ngăn xếp có phải là sự thay thế cho Cabal không? Những trường hợp nào tôi nên sử dụng Stack thay vì Cabal? Stack có thể làm gì mà Cabal không thể?


fpcomplete.com/blog/2015/06/annocting-first-public-beta-stack (trong ngắn hạn, nó thay thế cabal-installvà sử dụng stackage nhiều nhất có thể - có thể có một số tích hợp ngược vào cabal-install tại một số điểm và tôi nghĩ cộng đồng không chắc đây có phải là điều tốt hay không, vì nó có thể chia rẽ cộng đồng)
Carsten

Ngăn xếp AFAIU rất tiện dụng để nhanh chóng làm việc trên một dự án hiện có. Nếu bạn bắt đầu một cái gì đó từ đầu, bạn chắc chắn sẽ phải sử dụng cabal.
mb14

@ mb14 Không phải vậy đâu. Bạn có thể sử dụng ngăn xếp để bắt đầu các dự án từ đầu. Trên thực tế, các mẫu ngăn xếp cung cấp một cách dễ dàng để làm điều đó.
Sibi

Xem bài viết ngắn này để biết tổng quan tốt: scs.stanford.edu/16wi-cs240h/labs/stack.html
michid

Câu trả lời:


74

Ngăn xếp có phải là sự thay thế cho Cabal không?

Có và không.

Những trường hợp nào tôi nên sử dụng Stack thay vì Cabal? Stack có thể làm gì mà Cabal không thể?

Stack sử dụng các gói xếp chồng được sắp xếp theo mặc định . Vì vậy, bất kỳ phụ thuộc nào cũng được biết là có thể xây dựng cùng nhau, tránh các vấn đề xung đột phiên bản (mà trước đây chúng thường xảy ra trong trải nghiệm Haskell, từng được gọi là "địa ngục cabal"). Các phiên bản gần đây của Cabal cũng có các biện pháp để ngăn chặn xung đột. Tuy nhiên, việc thiết lập một cấu hình xây dựng có thể tái tạo trong đó bạn biết chính xác những gì sẽ được lấy từ các kho lưu trữ đơn giản hơn với Stack. Lưu ý rằng cũng có điều khoản cho phép sử dụng các gói không xếp chồng, vì vậy bạn có thể sử dụng ngay cả khi một gói không có trong ảnh chụp nhanh xếp chồng.

Cá nhân tôi thích Stack và muốn giới thiệu mọi nhà phát triển Haskell sử dụng nó. Sự phát triển của họ là nhanh chóng . Và nó có UX tốt hơn nhiều . Và có những thứ mà Stack làm mà Cabal chưa cung cấp:

  • Stack thậm chí tải xuống GHC cho bạn và giữ nó ở một vị trí biệt lập.
  • Hỗ trợ Docker (rất thuận tiện cho việc triển khai các ứng dụng Haskell của bạn)
  • Tập lệnh Haskell có thể tái tạo : Bạn có thể xác định phiên bản chính xác của một gói và có thể đảm bảo rằng nó sẽ luôn thực thi mà không gặp bất kỳ sự cố nào. ( Cabal cũng có tính năng tập lệnh , nhưng việc đảm bảo đầy đủ khả năng tái tạo với nó không hoàn toàn đơn giản.)
  • Khả năng thực hiện stack build --fast --file-watch. Điều này sẽ tự động xây dựng lại nếu bạn thay đổi các tệp cục bộ hiện có. Sử dụng nó cùng với --pedantictùy chọn là một công cụ phá vỡ thỏa thuận đối với tôi.
  • Stack hỗ trợ tạo dự án bằng cách sử dụng mẫu . Nó cũng hỗ trợ các mẫu tùy chỉnh của riêng bạn.
  • Stack có hỗ trợ hpack tích hợp trong đó. Nó cung cấp một cách thay thế (IMO, một cách tốt hơn) để ghi các tệp cabal bằng cách sử dụng tệp yaml được sử dụng rộng rãi hơn trong ngành.
  • Intero có trải nghiệm mượt mà khi làm việc với Stack .

Có một bài đăng trên blog thú vị giải thích sự khác biệt: Tại sao Stack không phải là Cabal? Trong khi Cabal, trong những năm xen kẽ kể từ bài đăng đó, đã phát triển để khắc phục một số vấn đề được thảo luận ở đó, cuộc thảo luận về mục tiêu thiết kế và triết lý đằng sau Stack vẫn có liên quan.


Có bất kỳ thay đổi nào kể từ khi cabal 3 được phát hành không?
William Rusnack

1
@WilliamRusnack Có, có. Về cơ bản, quy trình làm việc Cabal mặc định hiện đã kết hợp tính năng tránh xung đột phụ thuộc, mặc dù chiến lược mà nó sử dụng để làm như vậy có sự khác biệt đáng kể so với Stack. (@Sibi: Tôi đã tự do cập nhật câu trả lời của bạn để nó phản ánh tốt hơn vị trí của mọi thứ trong những ngày này.)
duplode

35

Trong phần tiếp theo, tôi sẽ đề cập đến hai công cụ được so sánh là cabal-installstack . Đặc biệt, tôi sẽ sử dụng cabal-install để tránh nhầm lẫn với thư viện Cabal , đây là cơ sở hạ tầng chung được sử dụng bởi cả hai công cụ.

Nói rộng ra, chúng ta có thể nói cabal-installstack là những giao diện người dùng của Cabal . Cả hai công cụ đều giúp bạn có thể xây dựng các dự án Haskell mà các tập hợp phụ thuộc có thể xung đột với nhau trong giới hạn của một hệ thống. Sự khác biệt chính giữa chúng nằm ở cách chúng giải quyết mục tiêu này:

  • Theo mặc định, cabal-install , khi được yêu cầu xây dựng một dự án, hãy xem xét các phần phụ thuộc được chỉ định trong .cabaltệp của nó và sử dụng bộ giải phụ thuộc để tìm ra một tập hợp các gói và phiên bản gói đáp ứng nó. Bộ này được rút ra từ Hackage nói chung - tất cả các gói và tất cả các phiên bản, quá khứ và hiện tại. Khi một kế hoạch xây dựng khả thi được tìm thấy, phiên bản đã chọn của các phụ thuộc sẽ được cài đặt và lập chỉ mục trong cơ sở dữ liệu ở đâu đó ~/.cabal. Xung đột phiên bản giữa các phần phụ thuộc được tránh bằng cách lập chỉ mục các gói đã cài đặt theo phiên bản của chúng (cũng như các tùy chọn cấu hình có liên quan khác), để các dự án khác nhau có thể truy xuất các phiên bản phụ thuộc mà họ cần mà không cần dẫm chân nhau. Sự sắp xếp này là những gìtài liệu cabal-install có nghĩa là "bản dựng cục bộ kiểu Nix" .

  • Khi được yêu cầu xây dựng một dự án, thay vì đi đến Hackage, ngăn xếp sẽ xem xét resolverlĩnh vực của stack.yaml. Trong dòng công việc mặc định, trường đó chỉ định ảnh chụp nhanh Ngăn xếp , là một tập hợp con của các gói Hackage với các phiên bản cố định được biết là tương thích lẫn nhau. sau đó ngăn xếp sẽ cố gắng đáp ứng các phụ thuộc được chỉ định trong tệp (hoặc có thể tệp - định dạng khác, cùng vai trò) chỉ bằng cách sử dụng những gì được cung cấp bởi ảnh chụp nhanh. Các gói được cài đặt từ mỗi ảnh chụp nhanh được đăng ký trong cơ sở dữ liệu riêng biệt, không ảnh hưởng lẫn nhau..cabalproject.yaml

Chúng tôi có thể nói rằng cách tiếp cận ngăn xếp trao đổi một số tính linh hoạt trong thiết lập để dễ dàng xác định cấu hình xây dựng. Đặc biệt, nếu bạn biết rằng dự án của mình sử dụng ảnh chụp nhanh LTS 15.3, bạn có thể truy cập trang Stackage của nó và biết ngay, các phiên bản của bất kỳ ngăn xếp phụ thuộc nào có thể lấy từ Stackage. Điều đó nói rằng, cả hai công cụ đều cung cấp các tính năng vượt ra ngoài quy trình công việc cơ bản để nói chung, mỗi công cụ có thể làm tất cả những gì công cụ kia làm (mặc dù có thể theo cách kém thuận tiện hơn). Ví dụ: có nhiều cách để đóng băng các phiên bản chính xác của cấu hình xây dựng tốt đã biếtgiải quyết sự phụ thuộc với trạng thái Hackage cũ bằng cabal-installvà có thể yêu cầu phụ thuộc không phải Stackage hoặc ghi đè các phiên bản gói snapshot trong khi sử dụng stack .

Cuối cùng, một sự khác biệt khác giữa cabal-installstack đủ lớn để đáng nói trong phần tổng quan này là stack nhằm mục đích cung cấp một môi trường xây dựng hoàn chỉnh, với các tính năng như quản lý cài đặt GHC tự độngtích hợp Docker . Ngược lại, cabal-install có nghĩa là trực giao với các phần khác của hệ sinh thái và vì vậy nó không cố gắng cung cấp loại tính năng này (đặc biệt, các phiên bản GHC phải được cài đặt và quản lý riêng biệt, có thể là thông qua bản phân phối Linux các gói, Haskell Platform Core trong Windows hoặc công cụ ghcup ).


11

Từ những gì tôi có thể thu thập được từ Câu hỏi thường gặp, có vẻ như Stack sử dụng thư viện Cabal, nhưng không phải cabal.exetệp nhị phân (được biết đến chính xác hơn là cabal-install). Có vẻ như mục tiêu của dự án là hộp cát tự động và tránh địa ngục phụ thuộc.

Nói cách khác, nó sử dụng cùng một cấu trúc gói Cabal, nó chỉ cung cấp một giao diện người dùng khác để quản lý nội dung này. (Tôi nghĩ!)


Ngoài ra cabal, mã nguồn của họ dường như cũng đang được sử dụng docker. Mặc dù tôi không biết họ có sử dụng cái đó hay không.
Sibi

@Sibi Có, có vẻ như bạn có thể tùy chọn ném nội dung vào Docker và nó có nghĩa là sẽ hoạt động. Tôi đã không xem xét nó nhiều hơn nữa ...
Toán
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.