2015-12-07 14 views
5

Tôi đang sử dụng phiên bản Haskell 7.8.4 trên (X) Ubuntu 15.10, với Cabal-Install 1.18 được cài đặt thông qua apt. Tôi đã không cố cài đặt bất kỳ thứ gì liên quan đến Haskell bằng tay trên máy này. Tôi thiết lập một hộp cát cabal, lấy và cài đặt một mô-đun chỉ để khám phá rằng ghc dường như không chọn nó lên. ghc -v dường như gợi ý rằng tôi có hai phiên bản của thư viện cabal đang lẫn nhau che khuất nhau. Cái này hoạt động ra sao?GHC không thể tìm thấy mô-đun trong hộp cát cabal

Tôi bắt đầu với một thư mục rỗng /tmp/haskell-example

sau đó tôi làm một cabal sandbox init.

$ cabal sandbox init 
Writing a default package environment file to 
/tmp/haskell-example/cabal.sandbox.config 
Creating a new sandbox at /tmp/haskell-example/.cabal-sandbox 

sau đó tôi cài đặt natural-numbers vì tôi muốn sử dụng các mô-đun Data.Natural trong một chương trình. Thao tác này thành công.

$ cabal install natural-numbers 
Resolving dependencies... 
Notice: installing into a sandbox located at 
/tmp/haskell-example/.cabal-sandbox 
Configuring natural-numbers-0.1.2.0... 
Building natural-numbers-0.1.2.0... 
Installed natural-numbers-0.1.2.0 

Tôi có thể xác minh rằng mô-đun Data.Natural thực sự đã được cài đặt vào hộp cát cabal.

$ ls /tmp/haskell-example/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/natural-numbers-0.1.2.0 
Data 
libHSnatural-numbers-0.1.2.0.a 
libHSnatural-numbers-0.1.2.0-ghc7.8.4.so 
$ ls /tmp/haskell-example/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/natural-numbers-0.1.2.0/Data 
Natural.dyn_hi 
Natural.hi 

sau đó tôi tạo một tệp đơn giản Main.hs nhập Data.Natural nhưng không sử dụng.

module Main where 

import Data.Natural 

main = putStrLn "Hello World" 

Khi tôi cố gắng ghc Main.hs tôi thấy như sau:

$ ghc Main.hs 
Main.hs:3:8: 
    Could not find module ‘Data.Natural’ 
    Use -v to see a list of the files searched for. 

Với lá cờ tiết được kích hoạt, nó có vẻ như thể cabal của tôi là nhận được lu mờ bởi một cabal sau, đó là lần lượt shadowing sự cabal trước đó. Tại sao chuyện này đang xảy ra?

$ ghc -v Main.hs 
Glasgow Haskell Compiler, Version 7.8.4, stage 2 booted by GHC version 7.8.4 
Using binary package database: /usr/lib/ghc/package.conf.d/package.cache 
hiding package Cabal-1.18.1.5 to avoid conflict with later version Cabal-1.22.1.1 
wired-in package ghc-prim mapped to ghc-prim-0.3.1.0-ec14d2f6075975a2ce9112eae431c8e1 
wired-in package integer-gmp mapped to integer-gmp-0.5.1.0-de4898ebdc5ab81cedce89121ae9ac84 
wired-in package base mapped to base-4.7.0.2-5ef1e7e809bc3b18d74efc783356e209 
wired-in package rts mapped to builtin_rts 
wired-in package template-haskell mapped to template-haskell-2.9.0.0-c1976a420ad8b9b589eee08844c59ba2 
wired-in package dph-seq not found. 
wired-in package dph-par not found. 
Hsc static flags: 
hiding package Cabal-1.18.1.5 to avoid conflict with later version Cabal-1.22.1.1 
wired-in package ghc-prim mapped to ghc-prim-0.3.1.0-ec14d2f6075975a2ce9112eae431c8e1 
wired-in package integer-gmp mapped to integer-gmp-0.5.1.0-de4898ebdc5ab81cedce89121ae9ac84 
wired-in package base mapped to base-4.7.0.2-5ef1e7e809bc3b18d74efc783356e209 
wired-in package rts mapped to builtin_rts 
wired-in package template-haskell mapped to template-haskell-2.9.0.0-c1976a420ad8b9b589eee08844c59ba2 
wired-in package dph-seq not found. 
wired-in package dph-par not found. 
*** Chasing dependencies: 
Chasing modules from: *Main.hs 

Main.hs:3:8: 
    Could not find module ‘Data.Natural’ 
    Locations searched: 
    Data/Natural.hs 
    Data/Natural.lhs 
*** Deleting temp files: 
Deleting: 
*** Deleting temp dirs: 
Deleting: 
+0

bạn đã cập nhật tệp .cabal của mình chưa? – Sigrlami

+0

@ Sigigami Tôi sợ rằng tôi không hiểu. Tôi có một thư mục gọi là '$ HOME/.cabal' và'/tmp/haskell-example/.cabal-sandbox', nhưng không có tệp '.cabal'. Tôi cần phải làm gì để cập nhật nó? –

+0

Khi bạn đang sử dụng lệnh 'cabal init' bên trong dự án của bạn là tạo tệp 'foo.cabal' mô tả tất cả các phụ thuộc cần thiết và bạn cần phải thêm chúng theo cách thủ công. Giả sử tên dự án của bạn 'foo'.Ví dụ: https://github.com/sigrlami/pollock/blob/master/pollock.cabal – Sigrlami

Trả lời

6

Nếu bạn đang vào hack thủ công, bạn có thể vượt qua để GHC vị trí pkg db của sandbox, chẳng hạn như:

ghc Main.hs -package-db .cabal-sandbox/x86_64-linux-ghc-7.10.2-packages.conf.d/ 

Tuy nhiên cách "bình thường" để sử dụng Hố cát là luôn biên dịch sử dụng cabal build (hoặc cabal install không có tham số) thay vì chạy ghc trực tiếp.

  1. Run cabal init, giải đáp thắc mắc khi bạn hài lòng
  2. Chỉnh sửa kết quả foo.cabal file (foo là tên của gói bạn).
  3. Chạy cabal build hoặc cabal install - điều này sẽ chạy ghc cho bạn.

Khi chỉnh sửa tệp cabal, hãy kiểm tra xem mô-đun đã xuất của bạn (nếu đó là lib) được liệt kê và src chính của bạn là chính xác. Đồng thời, đảm bảo các phụ thuộc như natural-numbers được liệt kê trong mệnh đề build-depends:.

+1

Đợi một chút. Tôi nghĩ rằng tôi đã suy nghĩ về 'cabal' hoàn toàn sai lầm. Tôi đã mong đợi một sandbox cabal cư xử như một môi trường virtualenv hoặc npm và thay đổi hành vi của ghc, nhưng có vẻ như sự giống nhau duy nhất là nó chuyển hướng nơi 'cabal install' cài đặt mọi thứ. Điều này làm cho rất nhiều ý nghĩa bây giờ. –

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