问题
ghc-mod works in a directory with just a haskell source file but if I run "cabal init" in that directory (/tmp/test), I get the following error:
(p1)dave@peach:/tmp/test$ !ghc
ghc-mod check Main.hs
ghc-mod: /tmp/test/dist/setup-config: hGetContents: invalid argument (invalid byte sequence)
What's going wrong here?
I'm running ghc-mod 5.2.11, and cabal 1.21.1.0, on a 64 bit ubuntu 14.04 computer. the LANG environment variable is set to en_US.UTF-8 ( I saw responses to some other questions that suggest that the LANG setting may be important here ). I tried running cabal version 1.16.0 but it didn't make any difference.
Here's a transcript that shows more detail:
(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$
回答1:
ghc-mod doesn't work with GHC < 7.10 and Cabal-1.22.
If you are still on GHC 7.8.3 or 7.8.4, you may want to hold off on updating cabal or cabal-install.
回答2:
In short:
- Use sandbox for your project;
- Add to your PATH variable a local path for folders where sandbox is located;
- Install there
Cabal version <= 1.20.0.6
(version 1.20.0.6 is the latest one which doesn't breakghc-mod
); - Add to your PATH variable a local path for folders where sandbox is located;
- Install to your sandbox required packages (
ghc-mod
etc).
Go to you project's root folder and create a sandbox:
cd ~/tmp/test #go to you project's root directory
cabal sandbox init #create a sandbox
Each time you run cabal sandbox init
from your current directory, it creates a .cabal-sandbox
folder in the given directory. If you install ghc-mod
to your sandbox (i.e. isolated), it still will use not sandboxed version of cabal
and cabal-install
to install it, because it is in your PATH
. To solve this problem, add to your ~/.bash_profile
file the following line:
export PATH="./.cabal-sandbox/bin:$PATH"
The dot at the beginning of the path means that you want to search in your current directory a folder named .cabal-sandbox
with subfolder named bin
where your sandboxed packages are installed. If you run commands within folders which contain sandboxes, the system will run executable files from appropriate sandbox. If the folder contains no sandboxes, it will use usual path to your */.cabal/bin
directory.
Make sure that your path to sandbox is located before your usual path to */.cabal/bin
in your PATH variable. You can see the order of your paths with the terminal $PATH
command.
Reload your ~/.bash_profile
file with the terminal source ~/.bash_profile
command or just close & reopen your terminal.
Next install Cabal version <= 1.20.0.6
which does not break ghc-mod
:
cabal install cabal-install-1.20.0.6 #install the latest cabal supported by ghc-mod
Reload again your ~/.bash_profile
file with the terminal source ~/.bash_profile
command or just close & reopen your terminal.
Run cabal --version
from your sandbox' folder. It should show that you are using cabal-install version 1.20.0.6
and version 1.20.0.3 of the Cabal library
. Run cabal --version
from the folder without sandbox to see that globally you still use your current versions of cabal-install
and Cabal library
.
Return to your project's root folder and install to the sandbox packages you need:
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
来源:https://stackoverflow.com/questions/27298268/why-does-cabal-init-break-ghc-mod-check