Tránh cabal hell khi lập trình với Haskell
Haskell
13
cabal
1
White

viethnguyen viết ngày 07/06/2015

Trong một bài viết trước, tôi có đề cập đến cách bắt đầu với Haskell bằng cách cài đặt Haskell Platform. Sau một thời gian mày mò không biết bao nhiêu thời gian với Haskell, tôi nhận ra đây không phải là cách tối ưu để lập trình với Haskell. Lý do chính là "cabal hell", một vấn đề do các package phụ thuộc version lẫn nhau (bạn có thể tham khảo giải thích về Cabal hell tại câu hỏi Stack Overflow này).

Đề giải quyết vấn đề này, tôi quyết định cài đặt lại môi trường lập trình Haskell từ đầu.

Xóa phiên bản đã cài đặt của Haskell

Ở đây tôi muốn xóa đi Haskell Platform mà tôi đã cài đặt trên Mac OS X:

$ sudo rm -rf /Library/Frameworks/GHC.framework
$ sudo rm -rf /Library/Frameworks/HaskellPlatform.framework
$ sudo rm -rf /Library/Haskell
$ rm -rf .cabal
$ rm -rf .ghc
$ rm -rf ~/Library/Haskell
$ find /usr/bin /usr/local/bin -type l | \
    xargs -If sh -c '/bin/echo -n f /; readlink f' | \
    egrep '//Library/(Haskell|Frameworks/(GHC|HaskellPlatform).framework)' | \
    cut -f 1 -d ' ' > /tmp/hs-bin-links
 # review /tmp/hs-links
$ sudo rm `cat /tmp/hs-bin-links`

Và tôi có một môi trường mới hoàn toàn không có chút nào Haskell nữa (đoạn script trên tôi copy từ đây). Càm giác rất mới mẻ để bắt đầu lại từ đầu :)

Cài đặt lại từ đầu

Về cơ bản, để lập trình với Haskell chúng ta cần những thứ cơ bản sau đây: GHC compiler, cabal package manager. Cách cài đặt như sau:

  • Tải GHC (hiện tại version mới nhất là 7.10.1)

  • Giải nén về một chỗ và cài đặt GHC:

    $ ./configure --prefix=/some/prefix
    $ make install
    
  • Tải cabal-install (tại thời điểm viết bài, version đang là 1.22.4.0)

  • Giải nén file nén tar và cài đặt:

$ sh bootstrap.sh
  • Thêm /some/prefix/bin$HOME/.cabal/bin vào đầu biến môi trường PATH
  • Cài đặt alex và happy:
$ cabal update && cabal install alex happy 

Như vậy là chúng ta đã cài đặt những thành phần cơ bản nhất để lập trình với Haskell.

Một số lời khuyên hữu ích để tránh cabal hell

Để tránh cabal hell tái diễn, sau đây là một số thủ thuật tôi thấy khá hữu dụng:

  • Chỉ sử dụng sandbox để cài package . Cách sử dụng rất dễ dàng:
$ cabal sandbox init # tạo một sandbox trong thư mục hiện tại 
$ cabal install --only-dependencies # tải và cài đặt các package vào thư mục .cabal-sandbox, không phải vào --user hay --global db 
  • Để bật ghci có tham chiếu đến các package có trong sandbox, trong thư mục sandbox, sử dụng: bash $ cabal repl
  • Thỉnh thoảng nếu gặp vấn đề, có thể giải quyết bằng cách xóa hết packages đã install ở --user đi:

    $ rm -rf ~/.ghc
    
  • Sử dụng --allow-newer khi cài đặt package gặp lỗi. Ví dụ:

    $ cabal install --allow-newer snap
    
  • Có thể sử dụng thêm option -v3 để xem lỗi ở đâu một cách chi tiết hơn

    $ cabal install snap -v3
    
  • Xem list những package đã cài đặt:

    $ ghc-pkg list
    

    Bạn sẽ thấy những package nào đã được cài vào --global-db--user-db. Còn để xem những package đã cài trong sandbox:

    $ ghc-pkg list --package-db=.cabal-sandbox/i386-linux-ghc-7.10.1-packages.conf.d
    

Kết luận

Haskell là một ngôn ngữ đang được phát triển khá nhanh và các công cụ cũng đang tích cực được hoàn thiện. Nhưng trước khi có một hệ thống quản lý package hoàn chỉnh, hi vọng những thủ thuật trên sẽ giúp bạn tiếp tục hành trình với Haskell một cách đỡ "đau đớn" hơn :)

Tham khảo

  1. Haskell Best Practices for Avoiding "Cabal Hell"
  2. Installing Haskell
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

viethnguyen

12 bài viết.
24 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
14 4
Giới thiệu về Arduino Có thể bạn đã quen lập trình trên PC, với những ngôn ngữ như C, C++, C, Java, Python, Ruby... Nhưng bạn có biết là phần mềm...
viethnguyen viết gần 3 năm trước
14 4
White
8 0
Trong bài viết này, tôi sẽ trình bày về một đặc tính của Haskell khá khác biệt so với các ngôn ngữ lập trình khác, đó là laziness (dịch tiếng việt ...
viethnguyen viết gần 3 năm trước
8 0
White
6 1
Đề bài Gần đây, thằng bạn tôi rảnh rỗi học cách parsing với Scala. Tôi nghe nói Scala có parser combinator khá là mạnh. Vừa hay, tôi cũng đang tìm...
viethnguyen viết gần 3 năm trước
6 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
24 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!