我需要使用hg关键字扩展将构建日期和修订嵌入到源文件中。抛开"你真的不想这么做"的论点不谈,我该怎么做呢?
这是我的源文件(lib/foo/version.rb
)看起来像(碰巧是Ruby,但这只是从我的构建中没有"编译"步骤的角度来看,我可以做一个-DREVISION="$(hg id)"in):
module Foo
VERSION = {
:date => "$Date$",
:changeset => "$Revision$"
}
end
问题是,$Revision$和$Date$是用该文件的更改集和提交日期展开的,而我需要的是整个存储库的提示更改集和提交日期。
我没有看到可以在hg help templates
中使用的明显模板,关键字扩展也没有提到任何具有全局作用域的内容。我想做的事有可能吗?
你可以安装一个post-commit
钩子来更新文件:
[hooks]
post-commit = sed -i lib/foo/version.rb
-e "s|$Date.*$|$Date: $(date)$|"
-e "s|$Version.*$|$Version: $(hg id -i)$|"
您可能应该将版本文件添加到.hgignore
文件中——它将在每次提交后更改,因此总是脏的。您还可以添加一个编码过滤器来清理版本文件:
[encode]
lib/foo/version.rb = sed -e "s|$Date.*$|$Date$|"
-e "s|$Version.*$|$Version$|"
这个脚本将使Mercurial认为文件是干净的——无论它真正包含的日期和更改集是什么,Mercurial将认为它包含未展开的$Date$
和$Version$
关键字:
如果您从签出运行代码,则可以直接调用hg并缓存该值。比如:
module Foo
VERSION = {
:version => system("hg log --template '{note|short}-{latesttag}-{latesttagdistance}' -r .")
}
end
,如果您没有在安装了Mercurial的系统上的签出中运行代码,那么您的部署脚本可以轻松地获取/使用该值——可能通过使用hg archive
获取要发送的tarball,然后自动包含.hg_archive.txt
。
我向你保证,无论你的设置是什么,都有比关键字扩展更漂亮的方法。