在多个项目中重用Haskell代码

时间:2017-07-30 21:30:39

标签: git haskell code-reuse

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

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

2 个答案:

答案 0 :(得分:6)

将模块捆绑在包中(或者可能制作单模块包)。如果您之前没有这样做过,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包,除了Haskell源文件中明显的import Common.Foo之外,还应该有{ {1}}文件.cabal

然后,每当您更改build-depends: foo包的模块时,只需键入foo (来自cabal install --force-reinstalls目录内)。这将更新本地软件包注册表,然后当您使用foo cabal configurecabal build另一个项目时,它将有权访问这些更改。

实际上还要考虑publishing your package on Hackage(当然,确保实际上给它一个清晰,描述性的名称!),然后你甚至不必担心获取源代码和当你切换到另一台机器时编译 - cabal可以为你做到这一点。

foo仅在您--force-reinstalls编辑依赖install的其中一个软件包后才需要。重新安装foo后,必须然后重建这些 - 这是cabal-install寄存器安装方式的一个缺陷。这将来会become unnecessary

答案 1 :(得分:4)

除了@ 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.]

假设您还没有听说过这个工具(其中主要是解决了臭名昭着的阴谋 - 地狱问题),我强烈建议您查看它。