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

时间:2019-06-29 23:58:39

标签: haskell build module haskell-stack

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

我正在同时处理两个项目,两个项目都是GIT / Cabal / Stack设置。
假设int 21hset cbrange [0:1000]
现在的问题是这些项目之一依赖于另一个项目。
我不确定是否可以仅将mig添加到che的{​​{1}}中,即使已经使用mig构建了它,因为GHCi({{ 1}})不允许stack.yaml,从而引发错误。

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

1 个答案:

答案 0 :(得分:3)

multi-package projects上的Stack文档部分对此进行了一些说明,但不幸的是选择显示使用两个现成的软件包的示例,这使事情变得混乱。

通常的想法是将migche项目目录放在一个公共项目目录下,然后将一个stack.yaml文件放在列出{{1} }和mig作为要构建的软件包(而不是通常的“。”软件包)。这样che中对che.cabal的依赖关系将自动解决。

这是一个完整的最小示例。如果您在mig下运行stack build,它将先构建multi,然后再构建chemig

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

multi / stack.yaml

che/che.cabal

multi / che / che.cabal

stack.yaml

multi / che / Che.hs

resolver: lts-13.26
packages:
- che
- mig

multi / mig / mig.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 / mig / Main.hs

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

更新:自行开发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

请注意,即使您还独自开发/构建import Che main :: IO () main = che >> che >> che ,上面的che设置也是建立che项目的推荐方法。特别是,如果您只想构建multi而不必重建mig(例如,如果您知道che在处理mig时将被破坏),您可以使用命令mig代替che

如果您希望能够继续开发stack build che而不会干扰stack build使用的che的版本,那么最简单的方法是che一个具有工作目录的新存储库,您可以拥有一个可以独立开发和构建的“出血边缘” mig(带有其自己的单独的单包git clone)副本,以及一个“稳定”的副本che所依赖的stack.yaml,您可以根据需要che。最好将mig放在Git之外,或者将其命名为git pull或其他名称,然后符号链接或将其复制到stack.yaml

如果您确实想像对待Stackage Package一样对待stack.yaml.template,并且有一个stack.yaml的单程序包项目,该项目某种程度上取决于全局che包,那么您可以执行以下任一操作:(1)开始将mig上传到Stackage并从字面上看像对待其他Stackage包一样;或(2)将che的{​​{1}}添加到che的文件中,该文件指向受支持的全局包源。这可以是GitHub or other web-accessible repository;它可以是存储在本地文件系统中的"archive"(例如,以extra_deps创建的stack.yaml格式);甚至本地文件系统中的Git存储库。对于最后一个选项,绝对路径可以正常工作,但是我认为不直接支持相对路径。看起来像这样:

mig