3

ghc-mod 在只有一个 haskell 源文件的目录中工作,但如果我在该目录 (/tmp/test) 中运行“cabal init”,我会收到以下错误:

(p1)dave@peach:/tmp/test$ !ghc
ghc-mod check Main.hs 
ghc-mod: /tmp/test/dist/setup-config: hGetContents: invalid argument (invalid byte sequence)

这里出了什么问题?

我在 64 位 ubuntu 14.04 计算机上运行 ghc-mod 5.2.11 和 cabal 1.21.1.0。LANG 环境变量设置为 en_US.UTF-8 (我看到对其他一些问题的回答表明 LANG 设置在这里可能很重要)。我尝试运行 cabal 版本 1.16.0,但没有任何区别。

这是显示更多细节的成绩单:

(p1)dave@peach:/tmp/test$ ls -la
total 80
drwxrwxr-x  2 dave dave  4096 Dec  4 07:07 .
drwxrwxrwt 35 root root 69632 Dec  4 07:06 ..
-rw-rw-r--  1 dave dave   143 Dec  4 07:04 Main.hs

(p1)dave@peach:/tmp/test$ set | grep LANG
GDM_LANG=en_US
LANG=en_US.UTF-8
LANGUAGE=en_US

(p1)dave@peach:/tmp/test$ ghc-mod version
ghc-mod version 5.2.1.1 compiled by GHC 7.6.3

(p1)dave@peach:/tmp/test$ cabal -V
cabal-install version 1.21.1.0
using version 1.21.1.0 of the Cabal library 

(p1)dave@peach:/tmp/test$ ghc-mod check Main.hs 
Main.hs:7:1:Warning: Top-level binding with no type signature:  haqify :: [Char] -> [Char]

(p1)dave@peach:/tmp/test$ cabal init
Package name? [default: test] 
Package version? [default: 0.1.0.0] 
Please choose a license:
 * 1) (none)
   2) GPL-2
   3) GPL-3
   4) LGPL-2.1
   5) LGPL-3
   6) AGPL-3
   7) BSD2
   8) BSD3
   9) MIT
  10) ISC
  11) MPL-2.0
  12) Apache-2.0
  13) PublicDomain
  14) AllRightsReserved
  15) Other (specify)
Your choice? [default: (none)] 2
Author name? [default: XXXXXXXXXXXX] 
Maintainer email? [default: XXXXXXXXXXXXXXXXXXXXXX] 
Project homepage URL? 
Project synopsis? 
Project category:
 * 1) (none)
   2) Codec
   3) Concurrency
   4) Control
   5) Data
   6) Database
   7) Development
   8) Distribution
   9) Game
  10) Graphics
  11) Language
  12) Math
  13) Network
  14) Sound
  15) System
  16) Testing
  17) Text
  18) Web
  19) Other (specify)
Your choice? [default: (none)] 
What does the package build:
   1) Library
   2) Executable
Your choice? 2
What is the main module of the executable:
 * 1) Main.hs
   2) Other (specify)
Your choice? [default: Main.hs] 
What base language is the package written in:
 * 1) Haskell2010
   2) Haskell98
   3) Other (specify)
Your choice? [default: Haskell2010] 
Include documentation on what each field means (y/n)? [default: n] 
Source directory:
 * 1) (none)
   2) src
   3) Other (specify)
Your choice? [default: (none)] 

Guessing dependencies...

Generating LICENSE...
Generating Setup.hs...
Generating test.cabal...

Warning: no synopsis given. You should edit the .cabal file and add one.
You may want to edit the .cabal file and add a Description field.

(p1)dave@peach:/tmp/test$ !ghc
ghc-mod check Main.hs 
ghc-mod: /tmp/test/dist/setup-config: hGetContents: invalid argument (invalid byte sequence)
(p1)dave@peach:/tmp/test$ 
4

2 回答 2

3

ghc-mod 不适用于 GHC < 7.10 和 Cabal-1.22。

如果您仍在使用 GHC 7.8.3 或 7.8.4,您可能希望推迟更新 cabal 或 cabal-install。

于 2015-01-20T15:26:45.337 回答
1

简而言之:

  1. 为您的项目使用沙箱;
  2. 为您的 PATH 变量添加沙箱所在文件夹的本地路径;
  3. 在那里安装Cabal version <= 1.20.0.6(版本 1.20.0.6 是最新的,不会中断ghc-mod);
  4. 为您的 PATH 变量添加沙箱所在文件夹的本地路径;
  5. 安装到您的沙箱所需的包(ghc-mod等)。

转到您项目的根文件夹并创建一个沙箱:

cd ~/tmp/test       #go to you project's root directory
cabal sandbox init  #create a sandbox

每次cabal sandbox init从当前目录运行时,它都会.cabal-sandbox在给定目录中创建一个文件夹。如果你安装ghc-mod到你的沙箱(即隔离),它仍然会使用非沙箱版本的cabalandcabal-install来安装它,因为它在你的PATH. 要解决此问题,请将~/.bash_profile以下行添加到您的文件中:

export PATH="./.cabal-sandbox/bin:$PATH"

路径开头的点表示您要在当前目录中搜索以子文件夹命名的文件夹,该文件.cabal-sandbox夹名为bin您的沙盒包安装位置。如果您在包含沙箱的文件夹中运行命令,系统将从相应的沙箱运行可执行文件。如果该文件夹不包含沙箱,它将使用您*/.cabal/bin目录的常用路径。

确保您的沙盒路径位于*/.cabal/binPATH 变量中的常用路径之前。$PATH您可以使用终端命令查看路径的顺序。

~/.bash_profile使用终端命令重新加载文件,source ~/.bash_profile或者关闭并重新打开终端。

下次安装Cabal version <= 1.20.0.6不会中断ghc-mod

cabal install cabal-install-1.20.0.6  #install the latest cabal supported by ghc-mod

~/.bash_profile使用终端命令重新加载文件,source ~/.bash_profile或者关闭并重新打开终端。

cabal --version从您的沙盒文件夹运行。它应该表明您正在使用cabal-install version 1.20.0.6and version 1.20.0.3 of the Cabal library。从没有沙箱的文件夹运行cabal --version,以查看全局您仍然使用当前版本的cabal-installCabal library

返回项目的根文件夹并安装到您需要的沙箱包:

cd ~/tmp/test                 #go to you project's root directory
cabal install ghc-mod-5.2.1.2 #explicitly indicate version of ghc-mod you want to install, otherwise cabal will try to install an ancient version 0.3.0
于 2015-03-15T13:36:40.880 回答