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, я не уверен, какой из них будет выбран