如何使用stack和cabal为Haskell安装软件包?

zf2sa74q  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(142)

我正在尝试安装一个小的Haskell包。
我使用stack创建了一个项目:

stack new my-project simple

字符串
这很好。我能够构建和运行代码。
但后来我偶然发现需要使用其他库。在互联网上搜索,我发现我应该使用cabal来做到这一点。首先安装它:

brew install cabal-install


然后更新它:

cabal update


然后试着用它安装一个库:

cabal install --lib split


这导致:

Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.10.1.0 supports
'ghc' version < 9.8): /usr/local/bin/ghc is version 9.8.1
Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.10.1.0 supports
'ghc' version < 9.8): /usr/local/bin/ghc is version 9.8.1
Resolving dependencies...
Build profile: -w ghc-9.8.1 -O1
In order, the following will be built (use -v for more details):
 - split-0.2.4 (lib) (requires download & build)
Downloading  split-0.2.4
Downloaded   split-0.2.4
Starting     split-0.2.4 (lib)
Building     split-0.2.4 (lib)

Failed to build split-0.2.4.
Build log ( /Users/nene/.cache/cabal/logs/ghc-9.8.1/splt-0.2.4-d1ef7190.log ):
Configuring library for split-0.2.4..
Preprocessing library for split-0.2.4..
Building library for split-0.2.4..
[1 of 2] Compiling Data.List.Split.Internals ( src/Data/List/Split/Internals.hs, dist/build/Data/List/Split/Internals.o, dist/build/Data/List/Split/Internals.dyn_o )
[2 of 2] Compiling Data.List.Split  ( src/Data/List/Split.hs, dist/build/Data/List/Split.o, dist/build/Data/List/Split.dyn_o )
ld: warning: directory not found for option '-L/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/lib'
ld: unknown option: -no_fixup_chains
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`clang' failed in phase `Linker'. (Exit code: 1)
Error: cabal: Failed to build split-0.2.4. See the build log above for
details.


似乎与阴谋集团版本(3.10.1.0)和GHC版本(9.8.1)有冲突。不知道如何解决它。
此外,我有一个stack创建的my-project.cabal文件。在里面我看到:

cabal-version:       2.2


如果我的心智模型是正确的,那么stack使用它自己独立的GHC安装,(可能)也使用它自己的Cabal安装。
我尝试创建package.yaml文件(根据Silvio Mayolo的建议),内容如下:

dependencies:
- split


但这似乎没有什么效果,编译只是抱怨找不到Data.List.Split模块(split库应该提供这个模块)。

**PS:**目前我只是简单地实现了我想自己导入的小函数。但如果能弄清楚如何安装一些Haskell库就更好了。

xqnpmsa8

xqnpmsa81#

要将依赖项添加到使用简单模板创建的项目中,您需要将其添加到模板创建的.cabal文件中的build-depends字段-在您的示例中为my-project.cabal
之后,您的cabal文件应该如下所示:

cabal-version:       2.2

name:                my-project
version:             0.1.0.0
-- synopsis:
-- description:
homepage:            https://github.com/githubuser/my-project#readme
license:             BSD-3-Clause
license-file:        LICENSE
author:              Author name here
maintainer:          [email protected]
copyright:           2023 Author name here
category:            Web
build-type:          Simple
extra-source-files:  README.md
                     CHANGELOG.md

executable my-project
  hs-source-dirs:      src
  main-is:             Main.hs
  default-language:    Haskell2010
  build-depends:       base >= 4.7 && < 5, split
  ghc-options:         -Wall
                       -Wcompat
                       -Widentities
                       -Wincomplete-record-updates
                       -Wincomplete-uni-patterns
                       -Wmissing-export-lists
                       -Wmissing-home-modules
                       -Wpartial-fields
                       -Wredundant-constraints

字符串

rsaldnfx

rsaldnfx2#

如果你只是想快速尝试一些东西,那么cabal run my-script.hs,其中my-script.hs

{- cabal:
build-depends: base, split
-}
import Data.List.Split
main = print $ splitOn "x" "axbxc"

字符串
是最简单的(和单个文件)解决方案。
更多注意事项:

  • 如果可以的话只使用cabal,它是haskell的核心构建和打包工具
  • stack和stackage是(1)一个项目管理工具(你有不止一个cabal库),和(2)一个策划的软件包列表。“策划”是指“所有这些软件包一起构建而没有错误”,它是整个hackage的子集,cabal去那里找到所有的软件包。
  • package.yaml是基于yaml的.cabal文件生成器hpack的源代码。(如果在package.yaml所在的同一个文件夹中运行hpack,它将从中创建my-package.cabal。)Stack还依赖于hpack,如果在项目中找到package.yaml文件,则默认情况下会运行它
  • cabal多年来在项目管理和.cabal文件语法方面都变得更好了(还有cabal.project文件,它可以支持多包项目),所以人们可以只使用它

相关问题