NOTE : remplacée par la réponse de phadej qui suggère des strophes communes.
Y a-t-il un moyen de remplacer la longue liste de paquets à construire pour la suite de tests par "les mêmes que pour l'exécutable, plus QuickCheck" ?
Pas à ma connaissance. Cependant, il existe un moyen de ne mentionner que la liste des build-depends
une fois, en structurant votre projet en trois objectifs :
- une bibliothèque qui contient tout votre code, et qui a besoin de la longue liste build-depends.
- un exécutable qui consiste en un seul fichier, et qui dépend de la base et de la bibliothèque du dessus.
- une suite de tests qui dépend de la bibliothèque ci-dessus, et des paquets de tests que vous utilisez.
C'est peut-être cette approche que propose la réponse d'indygemma, mais le fichier Cabal qui y est proposé n'y parviendra pas tout à fait, comme le souligne Norman Ramsey dans un commentaire. Voici les points principaux de ce dont vous avez besoin dans un fichier Cabal. Pour un exemple complet qui fonctionne pour moi, vous pouvez regarder à ce dossier de la Cabale .
name: my-program
version: ...
library
hs-source-dirs: src-lib
build-depends: base, containers, ...
exposed-modules: My.Program.Main, ...
executable my-program
hs-source-dirs: src-exec
main-is: my-program.hs
Build-depends: base, my-program
test-suite tests
type: exitcode-stdio-1.0
hs-source-dirs: src-test
main-is: tests.hs
other-modules: ...
build-depends: base, my-program, test-framework, ...
Points importants :
-
Il existe trois répertoires sources distincts pour les trois cibles. Ceci est nécessaire pour empêcher GHC de recompiler les fichiers de bibliothèque lors de la construction des autres cibles.
-
Tout le code de l'application se trouve dans la bibliothèque. L'exécutable est juste une enveloppe, comme ceci :
import My.Program.Main (realMain)
main = realMain
-
La bibliothèque expose tous les modules qui sont nécessaires pour les tests.
Ce dernier point souligne l'inconvénient de cette approche : Vous finissez par devoir exposer les modules internes. Le principal avantage de cette approche est que vous avez moins de duplication dans le fichier Cabal, et peut-être plus important encore, moins de duplication dans le processus de construction : Le code de la bibliothèque sera construit une seule fois, puis lié à la fois à l'exécutable et à la suite de test.
0 votes
Votre fichier cabal est structuré de manière défavorable, ce qui entraîne beaucoup de recompilation et introduit également la duplication de dépendances que vous mentionnez. Vous pouvez faire en sorte que vos tests/exécutables dépendent de votre bibliothèque. Voir stackoverflow.com/questions/12305970/ . En partant de là, vous pouvez aller autant que possible dans la direction indiquée par @Toxaris dans sa réponse, si cela vous plaît.
1 votes
Il y a plans pour ajouter un
common
au format .cabal où, par exemple, le champ partagébuild-depends
peuvent être spécifiés.