使用 Stack 构建模块是否使其在全球可用?
Does building a module using Stack make it available globally?
我已经开始使用 Haskell Stack,但对它了解不多。
我同时在做两个项目,都是GIT/Cabal/Stack设置。
比方说,mig
和 che
.
现在的问题是这些项目中的一个依赖于另一个。
我不确定是否可以将 mig
添加到 che
的 stack.yaml
,即使在使用 stack build
构建它之后,因为 GHCi (stack ghci
) 不允许 import Mig.Example
,引发错误。
这甚至是一个有效的问题吗?我应该怎么办?这行得通吗?
multi-package projects 上的 Stack 文档部分对此有一些介绍,但不幸的是选择显示一个使用两个 off-the-shelf 包的示例,这让事情变得混乱。
一般的想法是将您的 mig
和 che
项目目录放在一个公共项目目录下,然后将单个 stack.yaml
文件放在列出 mig
和 che
作为要构建的包(而不是通常的“.”包)。 che.cabal
对 mig
的依赖将自动解决。
这是一个完整的最小示例。如果您在 multi
下 运行 stack build
,它将构建 che
,然后 mig
,并且 stack exec mig
将 运行 程序。
此外,请注意,如果您将两个现有的 Stack 项目目录放在适当的位置,我相信您应该删除它们的本地 stack.yaml
文件,然后手动将内容合并到一个 multi/stack.yaml
或运行 stack init
in multi
从 mig/mig.cabal
和 che/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
添加到 mig
的 stack.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
我已经开始使用 Haskell Stack,但对它了解不多。
我同时在做两个项目,都是GIT/Cabal/Stack设置。
比方说,mig
和 che
.
现在的问题是这些项目中的一个依赖于另一个。
我不确定是否可以将 mig
添加到 che
的 stack.yaml
,即使在使用 stack build
构建它之后,因为 GHCi (stack ghci
) 不允许 import Mig.Example
,引发错误。
这甚至是一个有效的问题吗?我应该怎么办?这行得通吗?
multi-package projects 上的 Stack 文档部分对此有一些介绍,但不幸的是选择显示一个使用两个 off-the-shelf 包的示例,这让事情变得混乱。
一般的想法是将您的 mig
和 che
项目目录放在一个公共项目目录下,然后将单个 stack.yaml
文件放在列出 mig
和 che
作为要构建的包(而不是通常的“.”包)。 che.cabal
对 mig
的依赖将自动解决。
这是一个完整的最小示例。如果您在 multi
下 运行 stack build
,它将构建 che
,然后 mig
,并且 stack exec mig
将 运行 程序。
此外,请注意,如果您将两个现有的 Stack 项目目录放在适当的位置,我相信您应该删除它们的本地 stack.yaml
文件,然后手动将内容合并到一个 multi/stack.yaml
或运行 stack init
in multi
从 mig/mig.cabal
和 che/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
添加到 mig
的 stack.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