2015-10-02 14 views
9

Vì mọi thứ thay đổi quá nhanh, tôi đã đăng câu hỏi này để hy vọng rằng cách đồng ý cộng đồng để bắt đầu dự án Haskell có thể được làm rõ. Hãy tưởng tượng tôi có hai dự án riêng biệt:Quy trình làm việc tiêu chuẩn cập nhật để xây dựng các dự án Haskell là gì?

  • Dự án # 1: Square, thư viện mà số ô vuông. Không có deps.

    -- Square.hs 
    
    module Square where 
    
    square :: Num a => a -> a 
    square x = x * x 
    
  • Dự án # 2: cạnh huyền, thư viện và thực thi mà thấy chiều dài nhất của một tam giác vuông góc. Phụ thuộc vào # 1:

    -- Hypotenuse.hs 
    
    module Hypotenuse where 
    
    import Square 
    
    hypotenuse :: Floating a => a -> a -> a 
    hypotenuse x y = sqrt $ square x + square y 
    

    ,

    -- Main.hs 
    
    import System.Environment 
    import Hypotenuse 
    
    main = do 
        [x,y] <- fmap (map read) getArgs 
        print $ hypotenuse x y 
    

Bắt đầu với một máy tính với GHC 7.10.2, Stack và Cabal cài đặt, và một thư mục duy nhất, ~/OrganizeMe, chứa ~/OrganizeMe/Square.hs, ~/OrganizeMe/Hypotenuse.hs~/OrganizeMe/Main.hs, như đã trình bày ở trên - một bộ hoàn chỉnh các lệnh unix mà Haskeller có kinh nghiệm sẽ sử dụng để kiến ​​trúc các dự án đó là gì? Điều đó bao gồm:

  1. Sắp xếp cây thư mục của các dự án đó;

  2. định cấu hình Stack/Cabal/etc (và git, tùy chọn);

  3. xây dựng/cài đặt chúng cục bộ;

  4. xuất bản lên Hackage/Stackage.

+0

Tôi đã đọc toàn bộ tài liệu về Stack và một số hướng dẫn về Cabal. Bây giờ tôi đã biết về nhiều tính năng, nhưng tôi vẫn không biết cách tổ chức các cây thư mục. Tôi có cần một thư mục cho ngăn xếp và nhiều thư mục con cho các dự án, mỗi thư mục có tệp '.cabal' không? Hoặc những gì thay vào đó? Làm thế nào tôi có thể liên kết các dự án nhập khẩu địa phương từ eachother? Một ví dụ vững chắc hy vọng có thể làm rõ những câu hỏi và những câu hỏi khác. – MaiaVictor

+0

Stack/Stackage là tốt đẹp. có sự ủng hộ thương mại và mọi thứ. –

+1

Trên điện thoại di động của tôi mà không có nhiều thời gian, nhưng bạn đã có ý tưởng đúng. Một thư mục con cho mỗi thư viện, mỗi thư mục có tệp cabal và tham chiếu từng thư mục từ tệp stack.yaml. Các repo wai cung cấp một ví dụ vững chắc của điều này –

Trả lời

4

Đây không phải là một câu trả lời hoàn chỉnh, nó không bắt đầu bằng OrganizeMe thư mục của bạn (có một số lỗi trong mã của bạn) và nó không bao gồm xuất bản để Hackage/Stackage. Tôi bắt đầu với một thư mục stackenv để chứa cả hai gói nhưng bạn có thể làm điều này khá khác nhau tất nhiên.

mkdir stackenv && cd stackenv/ 
mkdir square && cd square 
vim Square.hs # The file you describe without the x in the type of square 
cabal init # Go through the questions and choose "library" 
stack init 
cd ../ && mkdir hypotenuse && cd hypotenuse/ 
vim Hypotenuse.hs # The file you describe 
vim Main.hs # The file you describe but importing Hypotenuse 
cabal init # Go through the questions... "executable" this time 
stack init 
vim hypotenuse.cabal # add "square" or chosen package name to build-depends 
vim stack.yaml # add "- '../square/'" below packages 
stack install 
hypotenuse 3 4 # works because ~/.local/bin is in my PATH 

Hy vọng điều này sẽ hữu ích.

+0

Woops. Tôi nên biên soạn chương trình trước khi đăng câu hỏi. Xin lỗi vì điều đó. Điều này có vẻ hợp lý với tôi, tôi sẽ chờ đợi nhiều upvotes hơn như một dấu hiệu của sự đồng thuận. Cảm ơn bạn. – MaiaVictor

+0

Cá nhân, tôi khuyên bạn nên có thư mục 'lib' và' bin' (hoặc tương tự) trong 'hypotenuse'. Bằng cách này, bạn có thể sử dụng 'hs-source-dirs' để đảm bảo rằng mô-đun' Hypotenuse' bạn nhập trong tệp thực thi xuất phát từ gói 'hypotenuse' thay vì từ' Hypotenuse.hs' cục bộ, nó sẽ giảm thời gian biên dịch . –

+0

@DanielWagner: Tôi không chắc tôi hiểu. Tôi thường có mã của tôi trong một thư mục 'src /' chỉ dành cho tổ chức. Nếu bạn nhập 'Hypotenuse' từ' Hypotenuse.hs', nó chỉ được biên dịch nếu bạn thay đổi nó, đúng không? Và điều tương tự cũng xảy ra nếu bạn nhập nó từ một gói trong ngăn xếp? Sự khác biệt về khái niệm giữa nhập khẩu từ 'hypotenuse' hoặc 'Hypotenuse.hs' là gì? –

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