在多个项目中重用 Haskell 代码

Reusing Haskell code in multiple projects

有几个我写的模块,我经常想复制到其他项目中以重用代码。但是,如果我只是简单地复制模块,那么如果我想改进它们,我将不得不为使用它们的项目更新各种 git 存储库中的所有副本。

看来我应该创建某种库。我如何设置我的项目,以便我只需要更新这些模块一次,并且所有依赖它们的存储库都可以访问最新版本?

将模块捆绑在包中(或者可能制作单模块包)。如果您以前没有这样做过,read the Cabal user guide。与任何其他代码一样,每个包都应受版本控制(git、darcs 等),尽管严格来说这并不是您的需要所必需的。

假设您有一个这样的包,foo,包含模块 Common.FooCommon.Foo.Types,即您有一个包含 Common/Foo.hsCommon/Foo/Types.hs 的文件夹和一个 foo.cabal 文件 exposed-modules: Common.Foo Common.Foo.Types.

您要在其中 使用 Common.Foo 的项目也应该是 cabal 包,除了 [=60] 中明显的 import Common.Foo =] 源文件,应该有一个带有 build-depends: foo.

.cabal 文件

然后,每当您更改了 foo 包的模块时,您只需键入 cabal install --force-reinstalls(从 foos 目录)。这将更新本地包注册表,然后当您 cabal configurecabal build 另一个使用 foo 的项目时,它将可以访问更改。

还要考虑publishing your package on Hackage(当然,一定要给它起一个清晰、描述性的名字!),这样你就不用担心了关于在您切换到另一台机器时获取源代码并进行编译 – cabal 可以为您完成。


--force-reinstalls 仅在您还 installed 依赖于 foo。重新安装 foo 后,您 必须 然后也重建这些 - 这是 cabal-install 注册安装方式的一个缺陷。以后会become unnecessary

除了@leftroundabout 的出色答案之外,还有另一种使用 stack 添加本地依赖项的方法,方法是将路径添加到您的 stack.yaml:

flags: {}
packages:
- '.'
- location: path/to/my/incredible/haskell/goodies
- location:
    git: url/to/my/fp/repository
    commit: [commit-hash]
  extra-dep: true
[etc., etc.]

假设您还没有听说过这个工具(主要 解决了臭名昭著的 cabal-hell 问题),我强烈建议您检查一下。