代码之家  ›  专栏  ›  技术社区  ›  Sled bayer

我使用mercurial hooks将版本号嵌入到应用程序中的方法有多好?

  •  7
  • Sled bayer  · 技术社区  · 14 年前

    这不是一个特别的问题,我更喜欢对我目前的方法提出批评。

    我想在我正在开发的程序中包含程序版本号。这不是一个商业产品,而是一个研究应用程序,因此了解生成结果的版本非常重要。

    我的方法如下:

    1. 在我的.hg/hgrc文件链接到version_gen.sh中有一个“预提交”挂钩
    2. 版本_gen.sh仅包括: hg parent --template "r{rev}_{date|shortdate}" > version.num
    3. 在makefile中, version="%__VERSION__% 在主脚本中,将替换为version.num文件的内容。

    有更好的方法吗?唯一真正的缺点 我能看见 如果您只提交一个特定的文件,那么version.num将被更新,但不会被提交,并且如果我试图添加Always committing该文件,这将导致一个infite循环(除非我创建了一些临时文件来表明我已经在提交中,但这看起来很难看…)。

    4 回复  |  直到 11 年前
        1
  •  1
  •   VonC    14 年前

    您要做的是称为关键字扩展,而不是 supported in Mercurial core .

    你可以把扩展集成到 make file 或(更简单)与 Keyword extension .

    此扩展允许扩展mercurial跟踪的文本文件中的类似rcs/cvs的键和用户定义的键。
    扩展发生在工作目录或/和创建分发时,使用“ hg archive

        2
  •  6
  •   Community taleinat    7 年前

    问题

    正如你所确定的,你确实创造了 Catch-22 这里的情况。

    你不能把有意义的信息 version.num 文件,直到提交更改,因为您正在存储 版本号 在存储库中,只有填充了 版本号 文件。

    我的解决方案

    我的建议是:

    1. 摆脱“预提交”陷阱 hg forget 这个 版本号 文件。
    2. 添加 版本号 给你的 .hgignore 文件。
    3. 调整 version_gen.sh 包括:

      hg parent --template "r{node|short}_{date|shortdate}" > version.num

    4. 在makefile中,确保 版本控制系统 运行之前 版本.num 用于设置版本参数。

    我的理由

    AS @Ry4an suggests ,使生成系统在生成时使用信息将修订信息插入软件 版本控制系统是更好的选择。唯一的问题是,如果您试图从 hg archive 在存储库中,构建系统无法提取相关信息。

    但是,我倾向于不鼓励这样做——在我自己的构建系统中,如果无法提取修订信息,那么构建就会失败。

    此外,作为 @Kai Inkinen suggests ,使用修订 不可携带。一台机器上的版本21可能是另一台机器上的版本22。虽然这现在可能不是问题,但如果你开始与其他人通婚,将来可能是问题所在。

    最后,我解释了我不喜欢在 question 我的问题与你自己的问题类似:

    我研究了mercurials关键字扩展,因为它似乎是一个显而易见的解决方案。然而,我看得越多,读到人们的意见,我就越得出结论,认为这不是正确的事情。

    我还记得关键字替换在以前公司的项目中给我带来的问题。…

    另外,我并不特别想启用Mercurial扩展来完成构建。我希望解决方案是自包含的,这样就不容易在没有嵌入版本信息的情况下意外编译应用程序,因为没有启用扩展或没有安装正确的助手软件。

    然后对建议使用 keyword 无论如何,扩展名:

    …我拒绝使用关键字扩展,因为它太容易被编译成可执行文件中的字符串“$id$”。如果关键字扩展内置于mercurial而不是扩展中,那么在默认情况下,我可能会考虑它,但就目前而言,它是不可靠的。_

    A不要认为有更可靠的解决方案。如果有人不小心损坏了.hg,或者不是从克隆人而是从档案馆构建的呢?猫先生

    @猫先生-我不认为 较少的 比关键字扩展更可靠的解决方案。如果您没有显式地启用扩展(或者有人禁用了扩展),那么您将得到文本字符串 "$ID$" 编译到目标文件中,无需抱怨。如果mercurial或repo损坏(不确定您的意思),您无论如何都需要先修复它。至于 汞档案 ,如果您试图从存档中构建它,我的原始解决方案将无法编译!那就是 精确地 我想要什么。我不希望任何源代码在未受修订控制的情况下被编译到我们的应用程序中!_

        3
  •  1
  •   Ry4an Brase    14 年前

    使用预提交钩子是关键所在。您不应该将剩下的版本_Gen.sh放在源文件thesmves中,只放在构建/发布工件中,您可以使用“更新”钩子更准确地执行这些操作。

    您不希望makefile在每次提交时都在repo中发生实际更改,这只会让合并变得很糟糕。您希望在生成之前签出文件之后插入版本,这就是更新挂钩所做的。

        4
  •  0
  •   Kai Inkinen    14 年前

    在像Mercurial这样的分布式系统中,实际的“版本号”在每个环境中并不一定意味着相同的东西。即使这是一个单人项目,并且您非常小心只拥有中央回购,您仍然可能希望使用sha1 sum,因为它对于给定的存储库状态是真正唯一的。sha1可以通过模板节点获取

    作为一个建议,我认为更好的工作流程应该是使用标签,而在您将它们推到上游之前,这些标签也是您的存储库的本地标签。不要把你的号码写进一个文件,而是用一个有意义的标签来标记你的发布代码,比如
    释放2

    版本号:2010-04-01
    或者编写这个脚本并使用模板创建标记?

    然后,可以将标记添加到要添加到构建中的非版本化(in.hgignore)version.num文件中。通过这种方式,您可以为发布提供有意义的名称,并将发布绑定到唯一标识符。