在多个项目中重用Haskell代码

Mar*_*tos 0 git code-reuse haskell

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

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

lef*_*out 6

将模块捆绑在包中(或者可能生成单模块包).如果您之前没有这样做,请阅读Cabal用户指南.与任何其他代码一样,每个软件包都应该受版本控制(git,darcs等),尽管严格来说这并不是您需要的.

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

您想要使用 的项目Common.Foo也应该是cabal包,除了import Common.FooHaskell源文件中显而易见的,应该有一个.cabal文件build-depends: foo.

然后,每当您更改了foo包的模块时,您只需键入cabal install --force-reinstalls(从foos目录中).这将更新本地包注册表,当您cabal configurecabal build其他项目使用时foo,它将有权访问更改.

考虑一下也实际上在Hackage上发布你的包(当然,确保给它一个明确的描述性名称!),然后当你切换到另一台机器时你甚至不必担心获取源代码和编译 - cabal can为你这样做.


--force-reinstalls只需要后,你还install编依赖于包中的一个foo.重新安装后foo,您还必须重建这些 - 这是cabal-install寄存器安装方式的一个缺陷.这将在未来变得不必要.