我编写的一些模块经常要复制到其他项目中以重用代码。但是,如果我只是复制模块,那么如果我想要改进它们,我将不得不更新各种git存储库中用于使用它们的项目的所有副本。
好像我应该创建某种类型的库。如何设置我的项目,以便我只需要更新一次这些模块,并且所有依赖它们的存储库都可以访问最新版本?
答案 0 :(得分:6)
将模块捆绑在包中(或者可能制作单模块包)。如果您之前没有这样做过,read the Cabal user guide。与任何其他代码一样,每个软件包都应该受版本控制(git,darcs等等),但严格来说这并不是您需要的。
假设您有一个此类软件包foo
,其中包含模块Common.Foo
和Common.Foo.Types
,即您有一个包含Common/Foo.hs
和Common/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 configure
和cabal 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.]
假设您还没有听说过这个工具(其中主要是解决了臭名昭着的阴谋 - 地狱问题),我强烈建议您查看它。