【发布时间】:2015-10-02 13:37:35
【问题描述】:
由于事情变化如此之快,我发布了这个问题,希望社区同意的启动 Haskell 项目的方式能够得到澄清。假设我有两个独立的项目:
-
Project #1:Square,用于计算平方数的库。没有部门。
-- Square.hs module Square where square :: Num a => a -> a square x = x * x -
项目#2:Hypotenuse,查找直角三角形最长边的库和可执行文件。取决于#1:
-- Hypotenuse.hs module Hypotenuse where import Square hypotenuse :: Floating a => a -> a -> a hypotenuse x y = sqrt $ square x + square y,
-- Main.hs import System.Environment import Hypotenuse main = do [x,y] <- fmap (map read) getArgs print $ hypotenuse x y
从安装了 GHC 7.10.2、Stack 和 Cabal 的计算机开始,以及单个目录 ~/OrganizeMe,其中包含 ~/OrganizeMe/Square.hs、~/OrganizeMe/Hypotenuse.hs 和 ~/OrganizeMe/Main.hs,如上所示 - 什么是有经验的 Haskeller 用来构建这些项目的完整 unix 命令集?其中包括:
组织这些项目的目录树;
配置
Stack/Cabal/etc(和git,可选);在本地构建/安装它们;
发布到
Hackage/Stackage。
【问题讨论】:
-
我已经阅读了 Stack 的完整文档和一些 Cabal 教程。现在我知道了许多功能,但我仍然不知道目录树应该如何组织。我是否需要一个用于堆栈的目录和多个用于项目的子目录,每个子目录都有一个
.cabal文件?或者是什么?如何链接从彼此导入的本地项目?希望一个可靠的例子可以澄清这些和其他问题。 -
Stack/Stackage 很好。有商业支持和一切。
-
在我的手机上没有太多时间,但你的想法是对的。每个库一个子目录,每个子目录都有一个 cabal 文件,并从 stack.yaml 文件中引用每个目录。 wai repo 提供了一个很好的例子
-
啊,这很有帮助。剩下的唯一混乱是“项目”的定义,因为 wai 是一个单一的东西。具体来说,请注意这两种设计: 1. 一个
.yaml用于我所有的个人包裹。示例:Viclib/viclib.yaml、Viclib/grid/grid.cabal、Viclib/bsp/bsp.cabal。 2. 每个包一个.yaml,即使是单个文件。示例:Viclib/grid/grid.yaml、Viclib/grid/grid/grid.cabal、Viclib/bsp/bsp.yaml、Viclib/bsp/bsp/bsp.cabal。正确的方法是什么?看起来像第二个,但是我如何从bsp导入grid,例如?
标签: haskell module cabal stackage