是否可以编写包含多个Library sections
的Cabal
配置文件?
我在文档中发现了库部分和可执行文件部分的描述,因此似乎不可能在一个Cabal配置文件中放入更多的库部分。
但是,如果我正在开发几个Haskell库和几个可执行文件,该怎么办
同时进行编译和测试?
AFAIK,在一个cabal文件中不能放置多个库。Name
字段中指定的名称(位于cabal文件的顶层)用作库的名称,因此似乎没有指定其他库名称的机制。
在实践中,我没有发现这是一个问题。我在一个单独的目录中开发每个库,有自己的cabal文件。一旦你在你开发的库上运行了cabal install
,那么它就可以在你的可执行文件的cabal文件中被引用(在Build-Depends
部分),就像Hackage上的包一样。
例如,如果你有两个带有cabal文件的库,它们看起来像这样:
Name: my-library-1
. . .
和
Name: my-library-2
. . .
然后你的可执行文件的阴谋集团文件可以这样引用它们:
Name: my-program
. . .
Executable run-program
Main-Is: Main.hs
Build-Depends: my-library1,
my-library2,
. . .
您甚至可以要求使用库的特定版本。例如:
Build-Depends: my-library1==1.2.*,
my-library2>=1.3
这在Cabal 2中有内部库,即所谓的"便利"库是可能的:https://github.com/haskell/cabal/pull/3022.不过,这不会让您安装这些库,只允许将它们组合成.cabal
文件公开的最终可执行文件和公共库。如果你想构建多个正在进行的东西,你应该使用一个cabal.project
文件-http://blog.ezyang.com/2016/05/announcing-cabal-new-build-nix-style-local-builds/对此有一些信息。
我发现,我的问题可以用最新的cabal-dev轻松解决。
如果你有两个项目:A
和B
,并且你想并行开发它们,那么使用cabal-dev install A B
是很好的——它会构建它们并将它们安装到本地cabal-dev
存储库中。如果重新运行此命令,将重新生成它们,并在必要时重新安装。
根据文档-如果您想在本地cabal dev hackage上注册新的或覆盖现有包,您应该使用cabal-dev add-source
,它基本上复制源代码,并允许您像在hackage
上一样安装它。