Почему "cabal init" нарушает "проверку ghc-mod"?
ghc-mod работает в каталоге только с исходным файлом на haskell, но если я запускаю "cabal init" в этом каталоге (/tmp/test), я получаю следующую ошибку:
(p1)dave@peach:/tmp/test$ !ghc
ghc-mod check Main.hs
ghc-mod: /tmp/test/dist/setup-config: hGetContents: invalid argument (invalid byte sequence)
Что здесь не так?
Я использую ghc-mod 5.2.11 и cabal 1.21.1.0 на 64-битном компьютере с Ubuntu 14.04. переменная окружения 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$
2 ответа
ghc-mod не работает с GHC < 7.10 и Cabal-1.22.
Если вы все еще используете GHC 7.8.3 или 7.8.4, вы можете отложить обновление cabal или cabal-install.
Короче:
- Используйте песочницу для своего проекта;
- Добавьте в переменную PATH локальный путь к папкам с песочницей;
- Установить там
Cabal version <= 1.20.0.6
(последняя версия 1.20.0.6, которая не ломаетсяghc-mod
); - Добавьте в переменную PATH локальный путь к папкам с песочницей;
- Установите в свою песочницу необходимые пакеты (
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
к вашей песочнице (то есть изолированной), он все еще будет использовать не изолированную версию cabal
а также cabal-install
установить его, потому что он в вашем PATH
, Чтобы решить эту проблему, добавьте в свой ~/.bash_profile
подайте следующую строку:
export PATH="./.cabal-sandbox/bin:$PATH"
Точка в начале пути означает, что вы хотите найти в текущем каталоге папку с именем .cabal-sandbox
с именем подпапки bin
где ваши песочницы пакеты установлены. Если вы запускаете команды в папках, которые содержат песочницы, система будет запускать исполняемые файлы из соответствующей песочницы. Если папка не содержит песочницы, она будет использовать обычный путь к вашему */.cabal/bin
каталог.
Убедитесь, что ваш путь к песочнице находится перед вашим обычным путем к */.cabal/bin
в вашей переменной PATH. Вы можете увидеть порядок ваших путей с терминалом $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.6
а также version 1.20.0.3 of the Cabal library
, Бежать cabal --version
из папки без песочницы, чтобы увидеть, что во всем мире вы все еще используете свои текущие версии cabal-install
а также Cabal 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