Какой снимок стека использует stack install?

#haskell #haskell-stack

#haskell #haskell-stack

Вопрос:

Попытка запустить

 stack install git-mediate
  

(согласно git-mediate инструкциям)

Я получаю сообщение об ошибке, касающееся зависимых версий пакетов:

 Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for git-mediate-1.0.8:
    Diff-0.3.4 from stack configuration does not match >=0.4  (latest matching version is 0.4.0)
needed since git-mediate is a build target.

Some different approaches to resolving this:

  * Set 'allow-newer: true' in /Users/yairchu/.stack/config.yaml to ignore all version constraints and build anyway.

  * Recommended action: try adding the following to your extra-deps in /Users/yairchu/.stack/global-project/stack.yaml:

- Diff-0.4.0@sha256:b5cfbeed498f555a18774ffd549bbeff7a24bdfe5984154dcfc9f4328a3c2847,1275

Plan construction failed.
  

Странно, что конфигурация стека имеет Diff-0.3.4 , поскольку в настоящее время как LTS, так и ночные снимки стека в настоящее время содержат Diff-0.4.0 ( lts-16.8 и nightly-2020-10-13 ).

Что это за конфигурация стека и почему она привязана к старым версиям библиотек?

Комментарии:

1. Есть немного документации по stack «глобальному проекту» на docs.haskellstack.org/en/stable/GUIDE /. … Вы можете отредактировать снимок, используемый в «глобальном проекте» /Users/yairchu/.stack/global-project/stack.yaml .

2. @sjakobi спасибо! это объясняет, откуда берется распознаватель. Вы хотите превратить свой комментарий в ответ, чтобы я мог его принять?

Ответ №1:

stack install это псевдоним stack build --copy-bins , так что на самом деле это просто stack build дополнительный шаг копирования встроенных исполняемых ~/.local/bin файлов.

Итак, реальный вопрос заключается в том, «как stack build решить, какой распознаватель использовать?» Ну, если вы предоставляете его в командной строке, он использует его, как в:

 stack install --resolver lts-16.18 git-mediate
  

Если вы не указываете явный распознаватель, значение по умолчанию зависит от того, где выполняется команда сборки. Если вы запустите его внутри проекта stack, по умолчанию будет использоваться распознаватель, указанный в файле проекта stack.yaml . Например:

 stack new --resolver lts-16.0 exampleproject  # create project with lts-16.0 resolver
cd exampleproject
stack build git-mediate   # this will build git-mediate using lts-16.0
  

Если вы создаете его вне какого-либо проекта, тогда он использует глобальный параметр проекта, который будет тем, что resolver задано ~/.stack/global-project/stack.yaml , как указано в комментариях / другом ответе.

Обратите внимание, что stack install псевдоним всегда будет копировать исполняемый файл в «глобальный» ~/.local/bin , независимо от того, где он был создан. Итак, если вы запустите stack install git-mediate в exampleproject каталоге, как указано выше, вы получите версию, созданную в lts-16.0 качестве глобально установленной версии.

Таааак … будьте осторожны при запуске stack install !

Обратите внимание, что, в git-mediate частности, недавно в Stackage была опубликована версия с ошибками, как описано здесь . Сообщение об ошибке немного отличается от того, которое вы получили, но основная проблема могла быть той же. Таким образом, возможно, что простой запуск stack update без необходимости изменять настройки распознавателя поможет решить вашу проблему со сборкой, если вы ее еще не исправили.

Комментарии:

1. Я хорошо осведомлен о недавней проблеме с git-mediate — я задал этот вопрос в процессе устранения той же проблемы 🙂

2. HA! Я не обнаружил соединения. Что ж, примечание может быть полезным, если кто-то другой, ищущий эту ошибку, наткнется на этот вопрос.

Ответ №2:

stack неявно использует свой «глобальный проект», определенный в ~/.stack/global-project/stack.yaml . Для управления используемым снимком стека этот файл можно отредактировать (или просто удалить, чтобы использовать последнюю версию LTS)