Est-il possible d'installer une version d'un paquet de github en utilisant une pile Haskell?
par exemple. Dans un fichier .cabal
ou stack.yaml
, comment puis-je pointer une dépendance sur un référentiel git/branche/révision?
La documentation de la section stack.yaml
packages
donne des exemples de référence à des emplacements de packages plus complexes.
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
Ajoutez ensuite extra-dep: true
à l’entrée package
pour indiquer à stack
de ne pas traiter le code extrait comme un élément sur lequel vous êtes en train de développer (par exemple, ne le chargez pas dans GHCi).
Nouvelle syntaxe pour Stack> 1.7.1
Comme @Flip a commenté, la documentation de docs.haskellstack.org Clarifie la nouvelle syntaxe pour votre stack.yaml
est la suivante:
extra-deps:
- github: apolishch/prime_table
commit: a510622a824af999a809191e8c959b8ea5fa8bdb
- github: apolishch/reactive-banana
commit: "74bac0f"
subdirs: reactive-banana
Pour être clair: les dépendances dans votre stack.yaml
s'assurent que les paquetages (qui ne sont pas dans Stackage) sont disponibles si un fichier .cabal
de votre projet les veut, juste au cas où.
Vous devez toujours spécifier le nom du package dans build-depends
dans votre fichier .cabal
pour indiquer que vous dépendez réellement du package.
Notez que la branche sur laquelle se trouve le commit n'a pas d'importance, et que les dépôts peuvent être des forks. Quand un paquet est dans un sous-répertoire, vous pouvez le spécifier, sinon il passera par défaut au niveau supérieur.
Syntaxe pour pile> 1.6.0
extra-deps:
- github: [email protected]:apolishch/prime_table.git
commit: a510622a824af999a809191e8c959b8ea5fa8bdb
[Modifier] J'ai constaté que parfois la syntaxe de 1.7.1 échoue avec un message d'erreur
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
et j'ai résolu ce problème en utilisant la syntaxe 1.6.0, même si j'utilisais Stack 1.7.1. Si vous utilisez Travis, cela échouera car Travis ne peut pas cloner via SSH sans vos clés SSH, bien sûr. Mais vous pouvez toujours utiliser le lien https comme
extra-deps:
- github: https://github.com/apolishch/prime_table.git
commit: a510622a824af999a809191e8c959b8ea5fa8bdb
Dans mon cas, je voulais dépendre d'un fork de pandoc, en spécifiant un commit précis. Cela a fonctionné en ajoutant ce qui suit à stack.yml
:
extra-deps:
- archive: https://github.com/italia/pandoc/archive/1327c564cccf5dfa387a2956443990d9854c85cd.Zip
Cela fonctionnerait avec n’importe quel branch-type URL sur Git. J'ai trouvé mon URL en parcourant les fichiers à la validation et en copiant l'URL à partir du bouton "Télécharger Zip".
Notez que ma branche a une version spécifique, supérieure à celle de toute version que Stack pourrait extraire du résolveur. Je repère la version dans les dépendances Cabal. Si la version de cette branche chevauchait une version disponible dans l'index du résolveur, je ne suis pas sûr de celle qui serait choisie