Trong phần tiếp theo, tôi sẽ đề cập đến hai công cụ được so sánh là cabal-install và stack . Đặ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-install và stack 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 .cabal
tệ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 resolver
lĩ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ể là 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..cabal
project.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ết và giả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-install và stack đủ 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ự động và tí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 ).
cabal-install
và 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)