超级sdist
这是一个实用程序,用于解决维护中的特定需求Haskell“mega-repos”或包含多个Cabal的Git存储库项目。其目的是简化决定需要发布包并适当标记这些发布。
它提供以下功能:
- 检测本地代码何时与Hackage上的内容发生更改
- 注意,由于Hackage的修订,有时这种逻辑并不正确很 完美
- 检测何时需要更新版本号
- 转储你的软件包的黑客版本和本地版本
要安装它……好吧,听我说。这个工具是为人们准备的编写Haskell包。很可能,你已经知道该怎么做了这个。如果你不知道,这可能不是一个有用的工具你。无论如何,为了安装它,首先安装堆栈然后运行堆栈安装mega-sdist
,或者只是烟囱安装
在这个里面存储库。
该实用程序在某些方面非常固执己见,例如:
- 它只支持一种Git标记名样式:
packagename版本
。这在非大型回购中可能看起来很奇怪第1.2.3节
看起来比食品-1.2.3
,但对于mega-repos前者没有意义。它还需要标记签名。
- 它依赖于Stack来发现所有本地包,并上传至Hackage。
如果你同意这些观点,请继续阅读以了解用法。
我有什么改变吗?
比方说我正在做无叶单回购(已选择以相对较小的回购为例)。我合并了一些公关最近,或者至少我认为我有。但我不记得是哪一个回购中受此影响的个别套餐。而不是看在提交历史上,我会像一些穴居人一样:
$git pull#确保我有所有最新更改$mega-sdist
这个超级扩音器
命令将:
- 为所有本地包构建tarball
- 检查我在Hackage上的包的最新版本是什么
- 做一个完整的
差异
看看有什么变化
在撰写本文时,以下是此回购的输出:
以下来自Hackage的软件包没有更改:单色-单色-0.2.0以下软件包需要版本更新:单色unlift-ref-0.2.1
这意味着:
- 这个
单体无叶
我在本地拥有的包的版本为0.2.0
.和它与Hackage上的版本完全匹配。无需任何操作。
- 这个
monad unlift参考
我在本地拥有的软件包版本为0.2.1
。而且它与Hackage上的代码不匹配。因此,如果我想跑步堆栈上传monad-unlift-ref
成功,我需要以增加版本号。
我改变了什么?
好吧,再一次,如果我想看看发生了什么变化,我可以跑(再一次,就像洞穴人):
$git diff monad-unlift-ref/0.2.1--monad-unilft-ref
但那太长了!超大尺寸
我支持你。只需运行:
$mega-sdist-monad-unlift-ref--get-diff
这将打印上传到的tarball之间的差异黑客和你在本地拥有的东西。除了我开玩笑的评论如果出于某种原因,您没有或者不要相信Git回购中的标签。
另一件事:此差异当前基于原始tarball来自Hackage,忽略阴谋集团文件修订。所以区别可能是与你得到的略有不同堆栈解压缩monad-unlift-ref-0.2.1
.但是¯\_(ツ)_/¯
这是对你的修改。
的默认行为超级扩音器
就是看所有的包裹在您的堆垛山药
。目标可以是任何目录。而且超级扩音器
将自动查看任何子目录,所以巨型sdist。
与相同超级sdist
在回购的根源。
*假设你所有的包裹在里面你的回购,但只有疯子会做其他事。
准备新版本
好的,现在我继续我的项目,我已经:
- 对进行了一些更改
单体无叶
- 更新了阴谋集团文件的版本号
从回购的根开始,我运行:
$mega-sdist-monad-unlift
或者,等效地,从内部单体无叶
我运行的子目录:
$mega-sdist。
不管怎样,我都会得到:
本地存在以下新包:单线-0.2.1无需版本碰撞,很好!
这告诉我我的包有本地更改,和版本编号已更新,因此堆栈上传monad-unlift
将工作。尼奥!现在,你能够就跑吧堆栈上载。。。
,但这里我通常做的事。首先,我将回顾我要上传的更改并确保没有意外:
$mega-sdist--get-diffs。本地存在以下新包:单线-0.2.1diff-r旧/monad-unlift-0.20/ChangeLog.md新/monad-unlift-0.21/ChangeLog.md0a1,4> ## 0.2.1>>*愚蠢的改变>diff-r旧/monad-unlft-0.2.0/Control/monad/Trans/unlift.hs新/monad-nift-0.2.1/Control/monad/Thans/unlift.hs51年52月54日>>--我只是需要一些空间>diff-r旧/monad-unlift-0.2.0/monad-nlift.cabal新/monad-Unift-0.2.1/monadunlift.cab2平方厘米<版本:0.2.0--->版本:0.2.1无需版本碰撞,很好!
好吧,这就是我想要的。发布时间到了。接下来,我将使用超级扩音器
标记发布:
$mega-sdist--gittag。
从我回购的根源来看,这会注意到单色-非单色-红色
仍然需要版本碰撞,并拒绝继续。但在内部单体无叶
目录,它会注意到所有必要的版本颠簸完成,并愉快地标记:
$mega-sdist--gittag。本地存在以下新包:单线-0.2.1无需版本碰撞,很好!原始命令:git tag-s monad-unlift-0.2.1-m“Release:monad-unilft-0.2.1”
突然我发现了一些新的东西:
$ls柏油球/单线-0.2.1.tar.gz
整洁,超级扩音器
留下的柏油球我可以上传!为此,我运行:
$stack上传tarball/*
请注意,无论我尝试只上传一个,这都会起作用包,或我的回购中所有更新的包。最后,我需要将新标签推送到Github(或其他地方):
$git推送--标记
事实上,这个上传序列非常常见,我有一个shell别名设置:
$alias上传alias upload='mega-sdist--gittag.&&堆栈上传tarball/*&&git推送--tags'
所以你有了它:方便的小实用程序来帮助管理回购里面有很多包裹。