管理 luarocks rockspec 文件的好方法是什么?为什么?

What is a good way to manage luarocks rockspec files and why?

我正在制作我的第一个 lua 包,我对如何命名我的 rockspec(s) 以及将它们放在哪里深感困惑。我看到的每个流行的 lua 包似乎都以不同的方式处理 rockspecs。这与 Ruby 非常不同,其中每个 gem 只有一个 gemspec。以下是一些示例:

现在,this question 解释了为什么会有一个 "working" rockspec 文件和一个单独的目录,里面装满了发布版本的 rockspecs,但我还有几个问题:

  1. rockspec 修订有什么用? luarocks wiki 说软件包发布应该在 git 中用版本号标记,它给出的示例不包括 rockspec 修订版。如果我的 rockspec 在 VCS 中,并且我标记了一个特定的提交,那么这是否有效地修复了该提交中包含的 rockspec 以及版本?以后对 rockspec 的修订不可能在标记的提交中。
  2. 如何 lpeg 被列在 luarocks 上却缺少 rockspec
  3. luarocks wiki 指出,如果您希望 rockspec 引用 HEAD,则应使用 scm 代替包版本号。但是由于 HEAD 不断变化,并且 rockspec 必须列出所有文件,因此似乎需要不断增加 scm rockspec 的 revision 数量才能跟上与任何添加或删除的文件。人们可以通过根本不使用 scm rockspecs 的修订号来解决这个问题,但我看到的那些具有低修订号(例如 ldoc-scm-2.rockspec)。这是一个错误吗?
  4. 以上任何示例是否被视为最佳做法?

What are rockspec revisions for?

rockspec 修订版是 rockspec 文件本身的版本控制。假设你发布了 Foo 版本 1.0;您创建了一个 rockspec foo-1.0-1.rockspec。后来你知道要让 Foo 1.0 在 FreeBSD 中编译,你需要传递一个额外的 -D 标志;源代码根本不需要更改。您编辑 rockspec 添加 platform override section and re-submit it to luarocks.org 作为 foo-1.0-2.rockspec.

If my rockspec is in VCS, and I tag a particular commit, then doesn't that effectively fix the rockspec(s) included in that commit and therefore version?

是的。但这不是问题,因为构建时使用的 rockspec 不是源代码分发中包含的。 .src.rock 文件是包含提交的 .rockspec 文件和源代码 tarball 的存档(如果 rockspec 使用 SCM 协议,例如 git:// ).

的确,这会导致一个先有鸡还是先有蛋的问题,因为当从 Github 手动签出标签 v1.0 时,Foo 1.0 的最新 rockspec 并不存在,但事实并非如此预期的工作流程:使用 LuaRocks 时,用户通常会使用 luarocks install foo;如果他们想检查项目的岩石规格,他们会访问 luarocks.org 上的 Foo 页面,或者他们会查看存储在 HEAD 中的岩石规格,这是人们首先停下来的地方。

请注意,如果想要分发包含 rockspec 的源 tarball,然后想在 rockspec 中设置 tarball source.url 及其相应的 source.md5,则会发生类似的鸡和蛋的情况.那里有一个 MD5 意味着 rockspec 本身不能在 tarball 中。一种解决方法是简单地避免 source.md5 字段,或者在打包 tarball 时跳过 rockspec。这与在上游 tarball 中包含 Linux-分发包元数据时发生的情况相同;在这里更明显,因为上游和打包者往往是同一个人。

How can lpeg be listed on luarocks but lack a rockspec?

可能是因为上游和打包者不是同一个人的情况很少见。 Roberto Ierusalimschy 发布了 lpeg,但截至 2016 年 12 月,它的 rockspecs 由 Gary Vaughan 上传。

[...] the ones I see have low revision numbers (e.g. ldoc-scm-2.rockspec). Is this a mistake?

这可能有很多原因,也可能是错误的。

  • 如果 rockspec 使用 make 内置,那么 scm rockspec 在文件添加或删除时可能不会改变;
  • 有些项目只是不经常更改他们的文件集,所以修订版仍然很低;
  • 一些开发人员将他们的 scm rockspecs 保持在 -0(如 "not a released revision")并且从不将它们上传到 luarocks.org(只在那里保留已发布的版本)。因此,当您获取 git 修订版时获得的版本是该快照的有效版本。增量修订是发布到 luarocks.org;
  • 的 rockspecs 的预期做法
  • rockspec 可能确实过时了,那是个错误。

Are any of the above examples considered a best practice?

客观地说,由于运行 luarocks install foo 时使用的 rockspec 文件是捆绑在 .src.rock 文件中的文件,与源存档分开存储,因此对于在哪里没有重大的实际影响开发人员恰好在源代码树中存储了他们的 rockspecs。这是个人组织的问题。

将最新的 scm rockspec 保留在根目录下有一点好处,即如果有人想从本地签出的树中进行构建,luarocks make 会自动获取它。

但只要使用 luarocks upload foo 将 rockspecs 上传到服务器,最终用户体验将是相同的,无论 rockspecs 在源代码树中的什么位置。