我已经开始使用Haskell Stack,但对其了解不多。
我正在同时处理两个项目,它们都是GIT / Cabal / Stack设置。
假设mig
和che
。
现在的问题是这些项目之一依赖于另一个。
我不确定是否可以仅mig
在stack.yaml
of中添加che
,即使使用stack build
GHCi(stack ghci
)不允许添加,也会import Mig.Example
引发错误。
这甚至是一个有效的问题吗?我该怎么办?能行吗?
关于多程序包项目的堆栈文档部分对此有一些了解,但不幸的是选择显示一个使用两个现成的程序包的示例,这使事情变得混乱。
通常的想法是将您的目录mig
和che
项目目录放在公共项目目录下,然后将一个stack.yaml
文件放在列出mig
并che
作为要构建的软件包的公共目录中(而不是通常的“。”软件包)。然后将自动解决che.cabal
on中的依赖项mig
。
这是一个完整的最小示例。如果你运行stack build
下multi
,它会建立che
,然后mig
和stack exec mig
运行程序。
此外,请注意,如果你把现有的两个协议栈项目目录的地方,我相信你应该删除他们的本地stack.yaml
文件,并且可以手动合并的内容到一个单一的multi/stack.yaml
或运行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 pull
需要)。最好不要stack.yaml
使用Git,或者将其命名或命名,stack.yaml.template
然后将其符号链接或复制到stack.yaml
。
如果您确实想以che
相同的方式对待Stack对待Stackage包,并且有一个mig
依赖于全局che
包的单包项目,那么您可以:(1)开始上载到che
Stackage并像对待其他Stackage一样对待它包; 或(2)extra_deps
在该stack.yaml
文件中添加,以mig
指向支持的全局包源。这可以是GitHub或其他可通过Web访问的存储库;它可以是“存档”(例如,.tar.gz
格式为git archive
)存储在本地文件系统中;甚至本地文件系统中的Git存储库。对于最后一个选项,绝对路径可以正常工作,但是我认为不直接支持相对路径。它看起来像:
# in mig's stack.yaml
extra-deps:
- git: /home/me/src/haskell/che
commit: 8ab4bf759dd934fa31cfca324748af894ca0e224
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句