使用 Stack 构建模块是否使其在全球可用?

Does building a module using Stack make it available globally?

我已经开始使用 Haskell Stack,但对它了解不多。

我同时在做两个项目,都是GIT/Cabal/Stack设置。
比方说,migche.
现在的问题是这些项目中的一个依赖于另一个。
我不确定是否可以将 mig 添加到 chestack.yaml,即使在使用 stack build 构建它之后,因为 GHCi (stack ghci) 不允许 import Mig.Example,引发错误。

这甚至是一个有效的问题吗?我应该怎么办?这行得通吗?

multi-package projects 上的 Stack 文档部分对此有一些介绍,但不幸的是选择显示一个使用两个 off-the-shelf 包的示例,这让事情变得混乱。

一般的想法是将您的 migche 项目目录放在一个公共项目目录下,然后将单个 stack.yaml 文件放在列出 migche 作为要构建的包(而不是通常的“.”包)。 che.cabalmig 的依赖将自动解决。

这是一个完整的最小示例。如果您在 multi 下 运行 stack build,它将构建 che,然后 mig,并且 stack exec mig 将 运行 程序。

此外,请注意,如果您将两个现有的 Stack 项目目录放在适当的位置,我相信您应该删除它们的本地 stack.yaml 文件,然后手动将内容合并到一个 multi/stack.yaml 或运行 stack init in multimig/mig.cabalche/che.cabal 的内容生成一个新的 multi/stack.yaml。每个作为一个单元构建的项目集合应该只有一个 stack.yaml

multi/stack.yaml

resolver: lts-13.26
packages:
- che
- mig

multi/che/che.cabal

name:                che
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10
library
  default-language:    Haskell2010
  exposed-modules:     Che
  build-depends:       base >= 4.7 && < 5

multi/che/Che.hs

module Che where
che :: IO ()
che = putStrLn "Viva la revolution"

multi/mig/mig.cabal

name:                mig
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10
executable mig
  default-language:    Haskell2010
  main-is:             Main.hs
  build-depends:       base >= 4.7 && < 5
                     , che

multi/mig/Main.hs

import Che
main :: IO ()
main = che >> che >> che

更新:自行开发 che

请注意,即使您也在单独处理 developing/building che,上述 multi 设置将是设置 mig 项目。特别是,如果您只想构建 che 而不想重建 mig(例如,如果您知道 mig 在您处理 che 时会被破坏),您可以使用命令 stack build che 而不是 stack build.

如果您希望能够继续开发 che 而不干扰 mig 使用的 che 版本,那么最简单的做法是 git clone 一个带有工作目录的新存储库,你可以拥有一个 "bleeding edge" che 的副本(有自己单独的 single-package stack.yaml),你可以独立开发和构建,以及 mig 所依赖的 "stable" che ,您可以根据需要 git pull 。将 stack.yaml 保留在 Git 之外是个好主意,或者将其命名为 stack.yaml.template 或其他名称并符号链接或将其复制到 stack.yaml.

如果你真的想像对待 Stack 对待 Stackage 包一样对待你的 che 并且有一个 single-package 项目 mig 不知何故依赖于全局 che包,那么您可以:(1) 开始上传 che 到 Stackage,并像对待任何其他 Stackage 包一样对待它;或 (2) 将 extra_deps 添加到 migstack.yaml 文件,指向受支持的全局包源。这可以是存储在本地文件系统中的 GitHub or other web-accessible repository; it can be an "archive"(例如,使用 git archive 创建的 .tar.gz 格式);甚至本地文件系统中的 Git 存储库。对于最后一个选项,绝对路径可以正常工作,但我认为不直接支持相对路径。它看起来像:

# in mig's stack.yaml
extra-deps:
- git: /home/me/src/haskell/che
  commit: 8ab4bf759dd934fa31cfca324748af894ca0e224