2016-06-17 22 views
6

tl; dr

Khoảng một tuần trước tôi đã phát hành gói 0.1.0.0 cho dự án Haskell không tầm thường đầu tiên của tôi. Tôi muốn thực thi được dễ dàng để cài đặt và nâng cấp, ngay cả đối với người không phải là Haskeller. Trong the README, tôi đề xuất cài đặt bằng cách sử dụng cabal install. Đây có phải là một sai lầm?Các phương pháp hay nhất để phân phối ứng dụng Haskell và cập nhật nó

Context

Tôi đã nghe nói về "Cabal địa ngục", nhưng đã không nhận ra bao darn cứng nó sẽ cho người dùng để nâng cấp một bản sao được cài đặt trên toàn cầu của gói, ngay cả khi tôi thận trọng không thực sự thay đổi bất kỳ phụ thuộc phiên bản trong tệp .cabal. Cuối cùng, tôi đã đi xuống một lỗ thỏ sâu cố gắng cập nhật từ 0.1.0.0 lên 0.2.0.0. Nó đã cảnh báo tôi về việc phá vỡ các phụ thuộc, tôi đã thử nhiều câu thần chú để buộc nâng cấp hoặc thiết lập lại trạng thái cục bộ của mình, và làm cho hệ thống trở nên khó khăn đến mức tôi phải cài đặt lại các gói Brew ghccabal-install Brew (đây là trên macOS) để mọi thứ trở lại trạng thái mà tôi có thể cài đặt và chạy lại.

Alternatives:

  • stack install: Tôi đã được sử dụng ngăn xếp để quản lý môi trường phát triển địa phương, nhưng nó dường như làm việc khá tốt cho độc lập cài đặt là tốt, miễn là bạn có stack cài đặt đầu tiên. (Chỉ cần thiết lập $PATH của bạn một cách thích hợp.)
  • Phân phối một tệp nhị phân dựng sẵn: Sẽ tốt đẹp và dễ dàng cho người dùng cuối, nhưng ít nhất là trên OS X, tôi cần phải lo lắng về việc ký mã và tôi thậm chí không có một danh tính được thiết lập cho điều đó nữa.

Vì vậy, trong README của tôi ngay bây giờ tôi đang đề cập đến cả hai stack installcabal install. Nhưng thực hành tốt nhất năm 2016 là gì?

+1

Nếu người dùng chạy vào "cabal-hell" cố gắng cài đặt gói của bạn, đó thực sự không phải là vấn đề của bạn nếu bạn đã chỉ định chính xác phụ thuộc của mình.Để cài đặt ứng dụng, người dùng cabal luôn có thể sử dụng sandbox nếu họ gặp sự cố về phiên bản gói. Cả hai 'stack' và' cabal' đều có vị trí của chúng trong hệ sinh thái Haskell. Tôi nghĩ thực hành tốt nhất là đảm bảo rằng ứng dụng của bạn có thể được cài đặt bằng cách sử dụng một trong hai. – ErikR

Trả lời

3

Đã xem .cabal file Tôi thấy rằng bạn không có bất kỳ giới hạn nào về phụ thuộc của bạn. Bạn thực sự cần phải có ít nhất thấp hơn giới hạn và tốt nhất là cả hai giới hạn dưới và trên.

Như @Emanuel Borsboom đề cập, bạn có thể có stack điền vào những hạn chế phiên bản dành cho bạn khi bạn tải lên một gói để Hackage với:

stack upload --pvp-bounds=both 

Trong thực tế, đối với các ứng dụng Tôi đề nghị bao gồm các tập tin cabal.config được tạo bởi cabal freeze trong gói:

cabal freeze 
mv cabal.config cabal.config-sample 

Khi gặp sự cố khi xây dựng ứng dụng cũ từ Hackage tôi thường muốn ông tác giả đã bao gồm thông tin này. Bạn có thể nhận file cabal.config cho một bản chụp đặc biệt tại địa chỉ:

https://www.stackage.org/{RESOLVER}/cabal.config 

Và trong tập tin stack.yaml của bạn tôi sẽ sử dụng một phiên bản LTS tiêu chuẩn chứ không phải là một nightly-. Giả sử họ sẽ không bao giờ bị xóa. Mặt khác, , bạn sẽ giúp người dùng của mình bằng cách giảm số lượng ảnh chụp nhanh các thư mục mà họ phải duy trì.

+0

Funnily, tôi đã có một 'cabal.config' nhưng [tôi gỡ bỏ nó] (https://github.com/wincent/docvim/commit/5ad9b0f4cdc) bởi vì tôi figured nó đã không thực sự cần thiết theo Stack, và theo Cabal tôi nghĩ rằng nó có thể góp phần vào việc Travis xây dựng những lỗi như [this one] (https://travis-ci.org/wincent/docvim/jobs/137999458). Tôi cũng đã [sử dụng lts resolver] (https://github.com/wincent/docvim/commit/06abd8de13238dbcd5f9ec5f26b543640be6dd4f) cho đến khi trở lại. Như bạn có thể thấy, một cách mù quáng đánh đập xung quanh đập chậu với nhau trong nhà bếp mà không thực sự biết làm thế nào để nấu ăn. – wincent

+2

Ảnh chụp nhanh hàng đêm sẽ không bị xóa, mặc dù sử dụng LTS nếu bạn không cần bất cứ điều gì trong hàng đêm là một thực hành tốt. –

+1

Bạn cũng có thể lấy một 'cabal.config' cho trình phân giải stack.yaml của bạn từ stackage.org. Đối với ảnh chụp nhanh hiện tại của bạn, bạn sẽ sử dụng 'https://www.stackage.org/nightly-2016-06-15/cabal.config'. Điều này có nghĩa là 'cabal install' sẽ sử dụng cùng một phiên bản gói giống như' stack install'. –

Các vấn đề liên quan