如何对 erlang 项目进行版本控制?

How to version an erlang project?

有什么方法可以 version/tag 一个 erlang 项目吗?

到目前为止,我一直在使用 git 标签来说明我的版本发布,并在我的应用程序配置中使用自定义字段(例如 {version, "0.0.1-alpha"})。但是有没有更好的方法来实现这一点?

我用的是rebar,我查了一下,没找到这样的功能。我知道钢筋与 git 标签完美搭配,但我还想在我的项目文件随附的配置中说明 version/release。

在扩展中,我想在我的申请中包含 "package-config"。

干杯。

版本在 Erlang 中存在于多个级别:

  • Erlang 模块可以使用 -vsn 属性进行版本控制。例如,mymodule.erl 文件的顶部可能如下所示:

    -module(mymodule).
    -vsn(1.0).
    ...
    

    如果您不指定 -vsn,Erlang 编译器会使用模块文件内容的 MD5 校验和为您生成一个。

  • Erlang 应用程序在其 .app 文件中进行了版本控制。例如,对于名为 myapp 的应用程序,其 myapp.app 的顶部可能如下所示:

    {application,myapp,
        [{description,"My Favorite Application"},
        {vsn, "1.2.3"},
        ...
    
  • Erlang 版本也可以进行版本控制,但是如何操作取决于您使用什么工具来生成版本。以 reltoolrebar 为例,您可以在 reltool.config 文件中指定发布版本。例如,对于名为 myrel 的版本,其 reltool.config 的顶部可能如下所示:

    {sys, [
           {lib_dirs, []},
           {erts, [{mod_cond, derived}, {app_file, strip}]},
           {app_file, strip},
           {rel, "myrel", "1.9",
        ...
    

    {rel, "myrel", "1.9" 行中显示的“1.9”是发布版本号。

    或者,使用 systools,一个 .script 文件,可用于生成一个 .boot 文件以指定如何加载和启动 Erlang 系统,包含元组 {script, {ReleaseName, ReleaseVsn}, Actions} 其中 ReleaseVsn 指定发行版本。例如,myrel.script 的顶部可能如下所示:

    {script,
     {"myrel","1.9"},
      [{preLoaded,
        [erl_prim_loader,erlang,erts_internal,init,otp_ring0,prim_eval,
         prim_file,prim_inet,prim_zip,zlib]},
       {progress,preloaded},
    ...
    

    您可以自己编写这样一个文件,或者更明智地从 release resource file 生成一个带有 systools:make_script 的文件,它通常有一个 .rel 后缀,其顶部指定一个版本版本如下图:

    {release, {RelName,Vsn}, {erts, EVsn},
    ...
    

    其中 Vsn 是发布版本,EVsn 是发布应该使用的 Erlang 运行时系统 (erts) 的版本。

    relx, release versions are specified much as they are for .rel files. See the relx documentation 了解详情。

因此,Erlang 项目由许多版本化的实体组成,其中一些可能在您的控制之下,但其他一些您可能通过其他 libraries/applications 的依赖项继承,包括来自 Erlang 标准库的那些。