繁体   English   中英

如何使用化石自动生成包版本?

[英]How to use fossil to automatic generate package version?

我想自动生成我的版本号。 git中 ,我可以使用

pkgver() {
    cd local_repo
    printf "%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}

但是,我怎么能用化石做类似的事呢? 我知道我可以使用manifest.uuid,但是它不能提供适合比较版本更新的序列号。

忠告

我的建议是将虚线版本号视为营销工件。 它也可以是代码名称,颜色或其他任何提供识别公共可用构建的简短方法的东西。 但是使用足够短的名字以便人们记住并且也表明某种自然顺序是有利的,因此人们一眼就知道“kitkat”比“jellybean”更新。

让您的修订控制系统以任何类型的自动方式提供它是一个令人头疼的问题。 使用分布式版本控制系统,您还有一个额外的问题,即当不同的开发人员在不同的地方构建不同的版本时,可能会为不同的版本分配相同的名称。 您甚至无法使用构建计数,因为不同的开发人员将在不同的时间构建。

如果所有“官方”构建都来自单个系统,那么您可以使用系统上的自动化为每个此类构建分配唯一的名称。 但是,为许多平台构建的便携式应用程序怎么样?在这种情况下,可能会在许多不同的机器上构建?

恕我直言,唯一合理的出路是承认版本号完全是任意的,对构建系统来说是人为的。

当然,作为项目管理的问题,您需要制定关于如何创建和分配版本号的策略,并仔细遵循该策略。

发布分支

使用fossil ,管理此方法的一种方法是为每个公开发布创建一个分支。 作为该分支上的首批签到之一,您可以更改文档中显示的版本号以及要匹配的代码,可能还包括其他限定符,如“alpha”,“beta”或“release candidate”。 随着发布周期的进行,发现的错误可以在此分支中修复。 同时,未安排发布的功能可以在他们自己的分支机构和/或主干上开发,而不会有破坏发布过程的风险。 当然,一旦发布,它可以并且可能应该合并回主干,以便没有任何错误修复丢失。

但是不要关闭该分支,它为您提供了将来维护该发布版本的逻辑框架,从而可以轻松查看作为该版本最终版本基础的源代码。

在发布中包含UUID

无论是否保留了分支,包括足够的清单UUID来识别在发布本身中实际发布的签入是非常重要的。 这可能意味着在实践中,永远不应该在化石工作空间中建立任何未决更改的版本。

由于在我自己的项目中犯了这个错误,我在项目构建过程中添加了代码,用于验证工作区是否干净,如果没有显示大声警告,并使构建代码显示的版本号表示构建发布也不安全。 该过程还通过命令行选项(如-DUUID=[0123456789]向编译器提供UUID的前几位数字。 这个技巧是通过使用fossil changes来检测脏工作空间,以及manifest.uuid文件来提供UUID。 UUID也可以从fossil info获得。

使用Gnu Make的示例

我的项目的顶级Makefile包含以下代码:

#
# Discover fossil checkin id and public version number
# 
MANIFESTUUID := $(shell sed -e "s/\(.\{10\}\).*/\1/" manifest.uuid)
VERSIONMAJ := $(shell sed -n -e "/define VERSION_MAJ/ s/^[^0-9]*\([0-9]*\)[^0-9]*$$/\1/p" src/version.h)
VERSIONMIN := $(shell sed -n -e "/define VERSION_MIN/ s/^[^0-9]*\([0-9]*\)[^0-9]*$$/\1/p" src/version.h)
VERSIONPAT := $(shell sed -n -e "/define VERSION_PAT/ s/^[^0-9]*\([0-9]*\)[^0-9]*$$/\1/p" src/version.h)
CHECKCLEAN := $(if $(shell fossil changes),-WITH-UNCOMMITTED-CHANGES)

#
# Create a filename-friendly version string like v1.123p42 where
# exacly three digits of the minor version number are displayed.
#
VERSION := v$(VERSIONMAJ).$(shell echo 000$(VERSIONMIN) | sed -n -e s/^.*\([0-9]\{3\}\).*$$/\1/p )p$(VERSIONPAT)$(CHECKCLEAN)

这取决于化石工作区中的两个文件,以及fossil changes命令的输出,以构造一个字符串,该字符串可用作已发布包的文件名的一部分,包括主编号,次编号,补丁级别,如果工作空间不够干净,则额外的文本-WITH-UNCOMMITTED-CHANGES 它还将UUID的前10个字符放在变量MANIFESTUUID ,然后可以将其传递给编译。

根据策略,版本号的主要部分,次要部分和补丁部分都保存在文件src/version.h ,并随着工作的进行src/version.h时更改。

我将忽略使用###。###样式的版本编号,因为更通用的是访问所有签名中唯一的标识符(甚至在分支之间),人们可以随心所欲地使用它。

您可以轻松获得的简单数字是整个项目历史记录中唯一签入的数量。 以下命令提供此编号...

fossil info

为了演示,我克隆了化石scm存储库以查找签到的数量......

project-name: Fossil
repository:   /home/faculty/xxxx/fossil_repos/fossil-scm/../fossil-scm.fossil
local-root:   /home/faculty/xxxx/fossil_repos/fossil-scm/
config-db:    /home/faculty/xxxx/.fossil
project-code: CE59BB9F186226D80E49D1FA2DB29F935CCA0333
checkout:     d3b2dabaa5eb64e1f73595bbe9e42d9586d5ac9e 2014-02-28 20:00:02 UTC
parent:       3d7eaeda866cc831d59abe2b1ddf15184aa14c4a 2014-02-28 19:31:38 UTC
tags:         trunk
comment:      re-generate other makefiles (user: jan.nijtmans)
checkins:     6713

我会从两种方式中提取这个值。 首先,如果你有grep与Perl扩展名(“ - P”)...

fossil info | grep -oP 'checkins:\s*\K\d+'

并非所有的grep安装都支持这个(我教过的大学只在大多数系统上支持这个扩展),所以你可能想用sed代替(下面的例子使用GNU sed)...

fossil info | sed -n 's/checkins:[ \t]*//p'

在任何一种情况下,对于上面提供的示例输出,每个命令将提供......

6713

另外,为了把我的想法抛到脑后,我从SCM获取产品版本/内部版本号并不是一件令人满意的事情。 SCM的作用应该是跟踪产品代码和其他工件的修订。 在您的产品中添加化石化或git化的代码将源与SCM相结合,即使只是一点点。 所以稍后,当你更聪明并且你决定切换SCM时(它发生了,对吗?),你失去了另一个旧的版本编号机制......但不是因为代码中的编号机制不能令人满意。

此外,我使用化石的一个原因是因为它允许我的团队成员使用不同的SCM进行远程开发,因为化石本身支持git并且可以毫无困难地支持其他SCM(如NetBSD使用化石/ CVS)。 在这种开发环境中,人们不希望代码与一个SCM结合。

无论如何......只是我的两分钱。

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM