Haskell Stack устанавливает зависимость от github

Можно ли установить версию пакета из github с помощью стека Haskell?

например, в .cabal или stack.yaml, как я могу указать зависимость в git repo/branch/revision?

Ответ 1

Документация для stack.yaml packages stack.yaml дает примеры обращения к более сложным местоположениям пакетов.

packages:
- location: .
- location: dir1/dir2
- location: https://example.com/foo/bar/baz-0.0.2.tar.gz
- location: http://github.com/yesodweb/wai/archive/2f8a8e1b771829f4a8a77c0111352ce45a14c30f.zip
- location:
    git: [email protected]:commercialhaskell/stack.git
    commit: 6a86ee32e5b869a877151f74064572225e1a0398
- location:
    hg: https://example.com/hg/repo
    commit: da39a3ee5e6b4b0d3255bfef95601890afd80709

Затем добавьте extra-dep: true для ввода package чтобы указать stack не обрабатывать код, который он втягивает, как что-то, что вы разрабатываете (например, не загружать его в GHCi).

Ответ 2

Новый синтаксис для стека> 1.7.1

Как отметил @Flip, документы на docs.haskellstack.org уточняют новый синтаксис для вашего stack.yaml:

extra-deps:
- github: apolishch/prime_table
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb
- github: apolishch/reactive-banana
  commit: "74bac0f"
  subdirs: reactive-banana

Чтобы быть ясным: зависимости в вашем stack.yaml убедитесь, что пакеты (которые не находятся в Stackage) доступны, если бы какой- .cabal файл .cabal в вашем проекте захотел их на всякий случай.

Вам все равно нужно указать имя пакета в файле build-depends в вашем файле .cabal чтобы сказать, что вы действительно .cabal от пакета.

Обратите внимание, что не имеет значения, в какой ветке включена фиксация, а repos - вилки. Когда пакет находится в подкаталоге, вы можете указать его, иначе он будет по умолчанию для верхнего уровня.

Синтаксис для стека> 1.6.0

extra-deps:
- github: [email protected]:apolishch/prime_table.git
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb

[Edit] Я обнаружил, что иногда синтаксис из 1.7.1 не работает с сообщением об ошибке

C:\Users\username\AppData\Local\Programs\stack\x86_64-windows\ghc-8.4.3\lib/../mingw/bin\ar.exe: .stack-work\dist\7d103d30\build\objs-10648\libHSpackagename-0.1.0.0-DlGXqyeqb9MDn2z8KhgjVb.a: No such file or directory

и я решил, что с использованием синтаксиса 1.6.0, хотя я использовал Stack 1.7.1. При использовании Travis это провалится, потому что Travis не может клонировать через SSH без ваших ключей SSH, конечно. Но вы все равно можете использовать https-ссылку как

extra-deps:
- github: https://github.com/apolishch/prime_table.git
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb

Ответ 3

В моем случае я хотел зависеть от вилки pandoc, указав точную фиксацию. Он работал, добавив следующее в stack.yml:

extra-deps: - archive: https://github.com/italia/pandoc/archive/1327c564cccf5dfa387a2956443990d9854c85cd.zip

Это будет работать с любым подобным ветки URL-адресам на Git. Я нашел свой url, просматривая файлы при фиксации и копируя URL-адрес из кнопки "Загрузить ZIP".

Обратите внимание, что моя ветка имеет определенную версию, превышающую любую версию, которую Stack может извлечь из распознавателя. Я определяю версию в зависимостях Cabal. Если версия на этой ветке будет перекрываться с одним из доступных в индексе resolver, я не уверен, какой из них будет выбран