2014-12-04 2 views
3

GHC-мод работает в директории с только исходным Haskell файл, но если я бегу «междусобойчик INIT» в этом каталоге (/ TMP/тест), я получаю следующее сообщение об ошибке:Почему «cabal init» прерывает «ghc-mod check»?

(p1)[email protected]:/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)[email protected]:/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)[email protected]:/tmp/test$ set | grep LANG 
GDM_LANG=en_US 
LANG=en_US.UTF-8 
LANGUAGE=en_US 

(p1)[email protected]:/tmp/test$ ghc-mod version 
ghc-mod version 5.2.1.1 compiled by GHC 7.6.3 

(p1)[email protected]:/tmp/test$ cabal -V 
cabal-install version 1.21.1.0 
using version 1.21.1.0 of the Cabal library 

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

(p1)[email protected]:/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)[email protected]:/tmp/test$ !ghc 
ghc-mod check Main.hs 
ghc-mod: /tmp/test/dist/setup-config: hGetContents: invalid argument (invalid byte sequence) 
(p1)[email protected]:/tmp/test$ 
+0

GHC-мод выполняет 'междусобойчик configure', так что я бы перехватывать вывод этой команды и посмотреть, если вы видите что-то подозрительное , – ErikR

+0

Кроме того, что произойдет, если вы запустите 'cabal configure' перед запуском' ghc-mod check ... '? – ErikR

+1

Также проверьте файл 'dist/setup-config'. Это файл 'ghc-mod' читает после запуска' cabal configure' – ErikR

ответ

3

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.

+0

не может поверить, что кабал вызывает проблемы даже после установки nix ... grr – nicolas

+1

Дополнительная информация: https://mail.haskell.org/pipermail/haskell-cafe/2015-January/117692.html –

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 в свою песочницу (то есть изолированный), он все равно будет использовать не изолированную версию 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 

Reload снова файл ~/.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 
+0

Спасибо за подробную информацию. Увы, это не сработало для меня в GHC 7.6.3. Я все еще получаю сообщение об ошибке hGetContents: недопустимый аргумент (неверная последовательность байтов), и я проверил версии cabal, cabal-install, ghc-mod и что они запускали версию для песочницы (с помощью которой) –

+0

глупый я забыл сделать сборку снова после вышеуказанных инструкций! теперь работает –

Смежные вопросы