Стек Haskell, как отменить неоднозначные имена модулей, найденные в нескольких пакетах по всему миру - PullRequest
1 голос
/ 16 апреля 2019

Пока пытался отладить другой вопрос , я установил пакет, который, кажется, конфликтует с некоторыми другими моими установленными пакетами.

Я побежал

$ stack install regex-pcre-text
regex-pcre-builtin-0.94.4.8.8.35: configure
regex-tdfa-1.2.3.1: download
regex-pcre-builtin-0.94.4.8.8.35: build
regex-tdfa-1.2.3.1: configure
regex-tdfa-1.2.3.1: build
regex-pcre-builtin-0.94.4.8.8.35: copy/register
regex-tdfa-1.2.3.1: copy/register
regex-tdfa-text-1.0.0.3: download    
regex-tdfa-text-1.0.0.3: configure   
regex-tdfa-text-1.0.0.3: build       
regex-tdfa-text-1.0.0.3: copy/register
regex-pcre-text-0.94.0.1: download    
regex-pcre-text-0.94.0.1: configure   
regex-pcre-text-0.94.0.1: build       
regex-pcre-text-0.94.0.1: copy/register
Completed 4 action(s).                

Я больше не могу просто импортировать

Text.Regex.PCRE

Когда я пытаюсь, я вижу:

$ stack ghci
Prelude> :set -XOverloadedStrings
Prelude> import Text.Regex.PCRE

Урожайность

<no location info>: error:
    Ambiguous module name ‘Text.Regex.PCRE’:
      it was found in multiple packages:
      regex-pcre-0.94.4 regex-pcre-builtin-0.94.4.8.8.35

Я хотел бы вернуть мою установку в более раннее состояние, чтобы код на моей машине, который импортирует Text.Regex.PCRE без квалификации, продолжал работать, как раньше.

Тем не менее, похоже, что стек не имеет четкого удаления:

$ stack uninstall regex-pcre-text

Error: stack does not manage installations in global locations. The only global mutation stack performs is executable copying. For the default executable destination, please run stack path --local-bin

Я не решаюсь просто запустить этот stack path --local-bin, потому что я не знаю, что он собирается делать или можно ли его отменить (во-первых, это была моя ошибка при установке вышеуказанного пакета). Как правильно исправить проблему с импортом?

Обновление 1

Я попробовал предложения здесь :

$ ghc-pkg unregister regex-pcre-text
ghc-pkg: cannot find package regex-pcre-text

$ stack exec ghc-pkg unregister regex-pcre-text
ignoring (possibly broken) abi-depends field for packages

1 Ответ

1 голос
/ 17 апреля 2019

Проблема в том, что regexp-pcre-text установил свою зависимость regex-pcre-builtin, которая вызвала конфликт. Вы хотите выполнить обе следующих команд в глобальном проекте (т. Е. Вне какого-либо конкретного каталога проекта):

$ stack exec ghc-pkg unregister regex-pcre-text
$ stack exec ghc-pkg unregister regex-pcre-builtin

Вы уже запустили первый, и я подозреваю, что он успешно завершился, несмотря на предупреждающее сообщение о полях abi-depends, поэтому вам просто нужно запустить второе.

(Эти можно объединить в одну команду:

$ stack exec ghc-pkg unregister regex-pcre-text regex-pcre-builtin

но, учитывая, что вы уже удалили первый пакет, я думаю, что это не удастся с сообщением, что regex-pcre-text не найден.)

Решение, упомянутое @DarthFennec, заключается в использовании расширения PackageImports для разрешения конфликта. Из GHCi это будет выглядеть так: использовать модуль из пакета regex-pcre даже с обоими установленными пакетами:

Prelude> :set -XPackageImports
Prelude> import "regex-pcre" Text.Regex.PCRE
Prelude Text.Regex.PCRE>
...