拱形-hs
![麻省理工学院许可证](https://img.shields.io/badge/license-MIT-blue.svg)
环境 |
CI公司 |
帕克曼(-f alpm) |
![ArchLinux](https://github.com/berberman/arch-hs/actions/workflows/archlinux.yml/badge.svg) |
电缆安装 |
![CI公司](https://github.com/berberman/arch-hs/actions/workflows/ci.yml/badge.svg) |
一个为黑客软件包生成PKGBUILD的程序。特别感谢费利克逊马尔斯.
请注意拱形-hs
始终只支持Arch Linux使用的最新GHC版本。
引言
给定黑客软件包的名称,拱形-hs
不仅可以为包生成PKGBUILD文件其名称已给定,但也适用于中缺少的所有依赖项[额外].拱形-hs
有一个天真的内置依赖关系求解器,它可以获取这些依赖关系并找出需要打包的依赖关系。在依赖关系计算期间,由于arch haskell打包策略,所有版本约束都将被丢弃,因此无法保证依赖项的版本一致性。
先决条件
拱形-hs
是PKGBUILD文本文件生成器,未与集成帕克曼
(请参见Alpm支持),仅取决于:
-
Pacman数据库(额外.db
,附加文件
,芯.db
、和核心文件
)
-
黑客指数tarball(01-索引.tar
,或00-索引.tar
previous)--通常由提供电缆安装
安装
拱形-hs
是可移植的,这意味着它不限于Arch Linux。然而,拱形-hs
可以使用libalpm在Arch Linux上加载pacman数据库,如果你想在其他系统上运行,你必须从源代码构建它。
安装最新版本
#pacman-S arch-hs
拱形-hs
在中可用[额外],因此可以使用安装帕克曼
.
安装开发版本
#帕克曼-S arch-hs-git
这个-吉特
版本在中可用[archlinuxcn],遵循最新的git提交。
生成
$git克隆https://github.com/berberman/arch-hs
然后通过堆栈或阴谋构建它。
堆栈
$stack构建
电缆(动态)
$cabal configure--disable-library-vanilla--enable-shared--enable-executable-dynamic--ghc-options=-dynamic$cabal构建
用法
快跑吧拱形-hs
在带有选项和目标的命令行中。以下是一个示例:我们将创建的archlinux包gi-gdk公司.
输出:$arch-hs-o~/test--alpm gi-gdkⓘ 从/home/berberman/.cabal/packages/hackage.haskell.org/01-index.tar加载黑客攻击ⓘ 从libalpm加载extra.dbⓘ 开始运行。。。ⓘ 已解决:...吉格德克├─Cabal(设置)✔ [额外]├─字节存储(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─gi-cairo(库,设置)✔ [额外]├─gi-gdkpixbuf(库,设置)├─gi-gio(库,设置)├─gi-glib(库,设置)├─gi-gobject(库、设置)├─gi pango(Lib,设置)├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]gi gdkpixbufŞ├─Cabal(设置)✔ [额外]├─字节存储(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─gi gio(自由,设置)├─gi-glib(库,设置)├─gi-gobject(库、设置)├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]吉吉奥├─Cabal(设置)✔ [额外]├─字节存储(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─gi glib(Lib,设置)├─gi-gobject(库、设置)├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]吉格利布├─Cabal(设置)✔ [额外]├─字节串(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]gi-g物体├─Cabal(设置)✔ [额外]├─字节存储(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─gi-glib(库,设置)├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]吉哈夫巴斯├─Cabal(设置)✔ [额外]├─字节存储(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─gi-glib(库,设置)├─gi-gobject(库、设置)├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]吉邦戈├─Cabal(设置)✔ [额外]├─字节串(Lib)✔ [额外]├─容器(Lib)✔ [额外]├─gi-glib(库,设置)├─gi-gobject(库、设置)├─gi-harfbuzz(库,设置)├─haskell-gi(库,设置)✔ [额外]├─haskell-gi-base(库)✔ [额外]├─haskell-gi-过载(Lib)✔ [额外]├─文本(Lib)✔ [额外]└─变压器(Lib)✔ [额外]...ⓘ 建议的包装订单:1.油嘴滑舌2.gi-g对象3.吉哈夫巴斯4.吉潘戈5.gi-gio公司6.gi-gdkpixbuf7、gi-gdkⓘ 从目标检测到pkgconfig或extraLib:gi-gdk:gtk4.pcgi-gdkpixbuf:gdk-pixbuf-2.0.pcgi-gio:gio-2.0.pcgi-glib:glib-2.0.pcgi-gobject:gobject-2.0.pcgi-harfbuzz:harfbuzz.pc、harfbuz-gobject.pcgi-pango:pango.pcⓘ 现在使用文件db查找相应的系统包:ⓘ 从libalpm加载[core]文件ⓘ 从libalpm加载[额外]文件ⓘ 完成时间:gtk4.pc⇒gtk4gdk-pixbuf-2.0.pc⇒gdk-pix buf2gio-2.0.pc⇒glib2glib-2.0.pc⇒glib2gobject-2.0.pc⇒glib2harfbuzz.pc⇒harfbuzz公司harfbuzz-gobject.pc⇒harfbuzz公司pango.pc⇒pangoⓘ 写入文件:/home/berberman/test/haskell gi gdk/PKGBUILDⓘ 写入文件:/home/berberman/test/haskell-gi-gdkpixbuf/PKGBUILDⓘ 写入文件:/home/berberman/test/haskell-gi-gio/PKGBUILDⓘ 写入文件:/home/berberman/test/haskell-gi-glib/PKGBUILDⓘ 写入文件:/home/berberman/test/haskell-gi-gobject/PKGBUILDⓘ 写入文件:/home/berberman/test/haskell-gi-harfbuzz/PKGBUILDⓘ 写入文件:/home/berberman/test/haskell-gi-pango/PKGBUILD✔ 成功!
这个输出告诉我们为了打包gi-gdk公司
,我们必须打包其依赖项以套餐顺序列出,但[额外]回购中不存在。特别地,gi-gdk公司
需要外部系统依赖性,因此拱形-hs
可以使用filesdb将它们映射到系统包。
$tree~/test($tree ~/test)/home/berberman/测试├── 哈斯克尔·吉·格德克│ └── PKGBUILD公司├── haskell-gi-gdkpixbuf公司│ └── PKGBUILD公司├── 哈斯克尔·吉奥│ └── PKGBUILD公司├── 哈斯克尔·盖格利布│ └── PKGBUILD公司├── haskell-gi-gobject公司│ └── PKGBUILD公司├── 哈斯克尔·基·哈夫布兹│ └── PKGBUILD公司└── 哈斯克尔·吉·潘戈└── PKGBUILD公司
拱hs
为每个包生成PKGBUILD。让我们看看里面有什么./haskell-gi-harfbuzz/PKGBUILD公司
:
#此文件由生成https://github.com/berberman/arch-hs,请手动检查。#维护人员:您的姓名<youremail@domain.com>_hkgname=gi-harfbuzzpkgname=haskell-gi-harfbuzzpkgver=0.0.3pkgrel=1pkgdesc=“HarfBuzz绑定”url=“https://github.com/haskell-gi/haskell-gi"许可证=(“LGPL2.1”)arch=('x86_64')depends=('ghc-libs''haskell-gi-glib''haskell-gi-gobject''hasbell-gi''haswell-gi-base''hasvell-gi-overloading''harfbuzz')makedependens=('ghc')源=(“https://hackage.haskell.org/packages/archive网站/$_hkgname/$pkgver/$_hkgname-$pkgvers.tar.gz“)sha256sums=('5f61c7b07427d0b77f867c3bc560043239c6184f98921295ce28fc8c9ce257e5')构建(){cd$_hkgname-$pkgverrunhaskell安装程序configure-O--启用共享--启用可执行动态--禁用library-vanilla\--prefix=/usr--docdir=/usr/share/doc/$pkgname--启用测试\--dynlibdir=/usr/lib--libsubdir=\$compiler/site-local/\$pkgid\--ghc-option=-optl-Wl \,-z\,relro \,-z \,现在\--ghc-option=“-pie”runhaskell安装程序版本runhaskell安装寄存器--gen-scriptrunhaskell安装程序注销--gen-scriptsed-i-r-e“s|ghc-pkg.*更新[^]*|&'--force'|”寄存器.shsed-i-r-e“s|ghc-pkg.*unregister[^]*|&'--force'|”unregister.sh}包装(){cd$_hkgname-$pkgver安装-D-m744 register.sh“$pkgdir”/usr/share/haskell/register/$pkgname.shinstall-D-m744 unregister.sh“$pkgdir”/usr/share/haskell/unregister/$pkgname.shrunhaskell安装副本--destdir=“$pkgdir”安装-D-m644 LICENSE-t“$pkgdir”/usr/share/licenses/$pkgname/rm-f“$pkgdir”/usr/share/doc/$pkgname/LICENSE}
拱形-hs
将从黑客数据库收集信息,并在完成一些处理步骤后将其应用于固定模板包括重命名、匹配许可证和填写依赖项等。然而,到目前为止还没有进行包装。拱形-hs
不能保证这个包可以由ghc用最新的依赖项构建;因此,在准备()
,例如乌西语.
选项
输出
$arch-hs-o~/test目标
使用-o(o)
可以生成一系列PKGBUILD,包括目标
将其依赖项放入输出目录。如果不传递它,则只会进行依赖项计算。
标志分配
$arch-hs-f目标:FLAG_A:真正的目标
使用-(f)
可以传递标志,这可能会影响解析的结果。
AUR搜索
$arch-hs-目标
使用-一个
,拱形-hs
将把AUR视为另一个包提供商,并将尝试搜索AUR中丢失的包。
正在跳过组件
$arch-hs-s组件_A目标
使用-秒
可以在依赖项解析中强制跳过可运行的组件。当包没有提供禁用其可运行项的标志时,这很有用,可运行项将在默认情况下构建,但在系统级打包中并不重要。请注意,这只有在拱形-hs
,而生成的PKGBUILD和实际构建过程不会受到影响。
$arch-hs-e~/目标
仅用于测试目的
使用-e(电子)
可以包括额外的.cabal公司
文件作为补充。当目标
还没有发布到hackage。
跟踪
$arch-hs—跟踪目标
使用--轨迹
,拱形-hs
可以将依赖关系解析过程打印到stdout。
$arch-hs--trace-file foo.log目标
类似--轨迹
,但日志将写入文件。
乌西
$arch-hs-o~/test——uusi目标
使用--uusi公司
,拱形-hs
将为每个包生成以下代码段:
准备(){uusi$_hkgname-$pkgver/$_hkgname.cabal}
请参见乌西语了解详细信息。
阿尔卑斯山
请参见Alpm支持.
作用力
$arch-hs—强制目标
使用--力
,拱形-hs
即使提供了目标,也会尝试打包。
杰森
$arch-hs--json/output.json目标
使用--杰森
,拱形-hs
将stdout中显示的信息以JSON格式转储到文件中,包括:
- 异常依赖关系
- 已解决的包
- 建议的包装订单
- 系统相关性
- 旗帜
没有遗漏跳过
$arch-hs--无跳过-缺少目标
使用--无skip缺失
,拱形-hs
如果此包的依赖项存在而此包不存在,则将尝试打包。
要将haskell包分发到archlinux,应该根据命名约定更改包的名称:
然而,仅在字符串前面加上前缀是不够的哈斯克尔-
并转换为小写;在某些特殊情况下,黑客名称可能有哈斯克尔-
前缀已经存在,或者大小写不规则,因此我们必须手动预设名称。一旦包分发到archlinux,如果名称符合上述情况,则应相应升级名称预设。
差异
拱形-hs
还提供了一个名为拱形-hs-diff
.拱形-hs-diff
可以示出包的两个版本之间的包描述的差异,并提醒我们,如果额外repo中的某些必需包不能满足版本约束,或者它们不存在。这在随后的包维护中很有用。例如:
$arch-hs-diff--alpm comonad 5.0.6 5.0.7版本ⓘ 从libalpm加载extra.dbⓘ 开始运行。。。ⓘ 正在从下载cabal文件https://hackage.haskell.org/package/comonad-5.0.6/revision/0.cabal。。。ⓘ 正在从下载cabal文件https://hackage.haskell.org/package/comonad-5.0.7/revision/0.cabal。。。包装:comonad版本:5.0.6⇒5.0.7剧情简介:共鸣曲网址:http://github.com/ekmett/comonad/取决于:基数>=4&&<5容器>=0.3&&<0.7分布>=0.2.2&&<1标记>=0.7&&<1变压器>=0.2和<0.6变压器-兼容>=0.3&&<1--------------------------------------基数>=4&&<5容器>=0.3&&<0.7分布>=0.2.2&&<1索引可移动>=0.1&&<0.2标记>=0.7&&<1变压器>=0.2和<0.6变压器-兼容>=0.3&&<1MakeDepends公司:基本-任何文档测试>=0.11.1&&<0.17--------------------------------------基本-任何文档测试>=0.11.1&&<0.18“doctest”要求在范围内(>=0.11.1&&<0.17),但[额外]提供了(0.17)。旗帜:余单子⚐ 测试十月:描述:默认值:TrueisManual:正确⚐ 容器:描述:可以使用“-f-containers”禁用“containers”包。禁用此选项是不受支持的配置,但它可能有助于专家用户加速沙盒中的构建。默认值:TrueisManual:正确⚐ 分布式:描述:您可以使用“-f-distribute”禁用“distributive”包。禁用此选项是不受支持的配置,但它可能有助于专家用户加速沙盒中的构建。如果禁用,我们将不提供“Distributive”的实例`默认值:TrueisManual:正确--------------------------------------余单子⚐ 测试十月:描述:默认值:TrueisManual:正确⚐ 容器:描述:可以使用“-f-containers”禁用“containers”包。禁用此配置是不受支持的,但它可能有助于加速专家用户在沙盒中的构建。默认值:TrueisManual:正确⚐ 分布式:描述:您可以使用“-f-distribute”禁用“distributive”包。禁用此选项是不受支持的配置,但它可能有助于专家用户加速沙盒中的构建。如果禁用,我们将不提供“Distributive”的实例`默认值:TrueisManual:正确⚐ 索引可移动:说明:您可以使用“-f-indexed-traversable”禁用“indexed-troversable”包。禁用此选项是不受支持的配置,但它可能有助于专家用户加速沙盒中的构建。如果禁用,我们将不提供`FunctorWithIndex的实例`默认值:TrueisManual:正确✔ 成功!
拱形-hs-diff
不需要hackagedb,而是从hackageserver下载cabal文件。
同步
仅针对黑客攻击分发维护者,请参阅arch-hs-sync--帮助
了解详细信息。
限制
-
拱形-hs
如果求解的目标包含循环,则会出错。实际上,由于测试,黑客攻击中普遍存在循环依赖,但基本周期是由维护人员在[额外]中手动解决的。所以在简化了提供者之后,拱形-hs
可以消除这些循环。然而,如果目标引入了新的循环,或者它依赖于未知循环中的包,拱形-hs
会扔循环存在
例外。
-
拱形-hs
无法处理复杂的情况:一个包的库部分存在于黑客攻击中,一些库包含外部源,等等。
-
拱形-hs
的功能仅限于依赖关系处理,而必要的过程如文件修补程序、版本范围过程等需要手动完成,因此请勿对生成的PKGBUILD文件给予过多信任。
Alpm支持
阿尔卑斯山是Arch Linux包管理库。在Arch Linux上运行时,加载额外.db
通过此库的文件dbs比使用内部解析器的速度稍快拱形-hs
.因此,拱形-hs
提供标志阿尔卑斯山
要启用此功能:
阴谋集团建筑-f alpm
此标志在中默认启用拱形-hs
Arch Linux包。使用编译阿尔卑斯山
,拱形-hs
默认情况下,使用alpm加载pacman数据库。在这种情况下,CLI标志--no-alpm-额外
和--no-alpm文件
可用于禁用此功能。
什么时候?阿尔卑斯山
已启用,拱形-hs
将失去指定路径的功能额外.db
和文件db的目录。
贡献
始终欢迎问题和PR。_(:з」∠)_