我已经开始使用Haskell Stack,对此了解不多。
我正在同时处理两个项目,两个项目都是GIT / Cabal / Stack设置。
假设int 21h
和set cbrange [0:1000]
。
现在的问题是这些项目之一依赖于另一个项目。
我不确定是否可以仅将mig
添加到che
的{{1}}中,即使已经使用mig
构建了它,因为GHCi({{ 1}})不允许stack.yaml
,从而引发错误。
这甚至是一个有效的问题吗?我该怎么办?能行吗?
答案 0 :(得分:3)
multi-package projects上的Stack文档部分对此进行了一些说明,但不幸的是选择显示使用两个现成的软件包的示例,这使事情变得混乱。
通常的想法是将mig
和che
项目目录放在一个公共项目目录下,然后将一个stack.yaml
文件放在列出{{1} }和mig
作为要构建的软件包(而不是通常的“。”软件包)。这样che
中对che.cabal
的依赖关系将自动解决。
这是一个完整的最小示例。如果您在mig
下运行stack build
,它将先构建multi
,然后再构建che
和mig
。
此外,请注意,如果将两个现有的Stack项目目录放在适当的位置,我相信您应该删除它们的本地stack exec mig
文件,然后将内容手动合并到单个stack.yaml
中或运行{ multi/stack.yaml
中的{1}}从stack init
和multi
的内容中生成一个新的multi/stack.yaml
。作为一个单元构建的每个项目集合都应该只有一个mig/mig.cabal
。
che/che.cabal
stack.yaml
resolver: lts-13.26
packages:
- che
- mig
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
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