【问题标题】:Reusing Haskell code in multiple projects在多个项目中重用 Haskell 代码
【发布时间】:2017-07-30 21:30:39
【问题描述】:

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

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

【问题讨论】:

  • 你用什么来构建你的代码?堆栈还是阴谋集团?
  • 您可以将链接(如果您的文件系统支持)链接到文件,这样在一个地方更新它就意味着它在其他地方也更新了。
  • @arrowd Cabal,虽然我猜这可能会改变
  • @WillemVanOnsem 我猜,但这仍然需要在每个存储库中提交更改,这并不理想(尽管我不知道这可能是不可避免的)。
  • 如果是 Cabal,您可以创建 cabal 沙箱并对您的所有库执行 cabal sandbox add-source

标签: git haskell code-reuse


【解决方案1】:

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

假设您有一个这样的包foo,其中包含模块Common.FooCommon.Foo.Types,即您有一个包含Common/Foo.hsCommon/Foo/Types.hs 的文件夹以及一个带有foo.cabalfoo.cabal 文件。

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

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

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


只有在您还 installed 依赖于 foo 的软件包之一之后,才需要 --force-reinstalls。在重新安装foo 之后,您必须然后还重建这些 - 这是 cabal-install registers 安装方式的一个缺陷。这将在未来become unnecessary

【讨论】:

  • 那么依赖包就能找到foo,因为它进入了这个“本地包注册表”?
  • C o r r e c t .
  • @SwiftsNamesake stack 是确保可重现构建的好工具,但我认为将其用于本地黑客攻击没有多大意义。特别是 Nix 风格的 cabal new-build 并没有真正留下任何需要堆栈可以填充的东西,IMO。也就是说,如果您添加一个专注于如何使用 Stack 完成此操作的答案,那肯定是值得添加的。
  • 嗯,根据我的经验,使用stack 添加本地依赖要容易得多,这就是我想到它的原因。
  • 完成。不过我会调查new-build
【解决方案2】:

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

假设您还没有听说过这个工具(大部分解决了臭名昭著的阴谋集团问题),我强烈建议您去看看。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2022-11-21
    • 1970-01-01
    • 2012-10-08
    • 2011-09-29
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多