6

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

  • lua-cliargs:项目根目录中的单个rockspec,(例如lua_cliargs-3.0-1.rockspec
  • ldoc:项目根目录中的单个rockspec,用scm而不是版本号命名(例如ldoc-scm-2.rockspec
  • lua-MessagePack:存储在顶级rockspec/目录中的多个以版本命名的rockspecs(例如lua-messagepack-0.1.0-1.rockspec,... lua-messagepack-0.3.4-1.rockspec),然后是一些在包版本之前插入的额外lua版本(例如lua-messagepack-lua53-0.3.6-1.rockspec)。有时同一个包版本有两个rockspecs,一个包含lua53,一个不包含。
  • luafilesystem : 多个以版本命名的 Rockspecs 存储在顶级/rockspec目录中(例如luafilesystem-1.3.0-1.rockspec,... luafilesystem-1.6.1-1.rockspec),然后是一些cvs在包版本之前插入的包版本号而不是包版本号(例如luafilesystem-cvs-1.rockspecluafilesystem-cvs-2.rockspec)。
  • lpeg:根本没有rockspec
  • luasocket:根目录中的一个rockspec,scm而不是包号(例如luasocket-scm-0.rockspec),以及一个/rockspec包含单个rockspec的目录,其中包含一个包号(例如luasocket-3.0rc2-1.rockspec

现在,这个问题解释了为什么会有一个“工作”的 rockspec 文件和一个单独的目录,里面装满了发布版本的 rockspec,但我仍然有几个问题:

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

1 回答 1

6

什么是 rockspec 修订版?

rockspec 修订版是 rockspec 文件本身的版本。假设您发布 Foo 1.0 版;你创建一个 rockspec foo-1.0-1.rockspec。后来你知道要让 Foo 1.0 在 FreeBSD 中编译,你需要传递一个额外的-D标志;源代码根本不需要更改。您编辑 rockspec 添加一个平台覆盖部分并将其重新提交到luarocks.orgfoo-1.0-2.rockspec.

如果我的 rockspec 在 VCS 中,并且我标记了一个特定的提交,那么这是否有效地修复了该提交中包含的 rockspec 以及版本?

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

事实上,这导致了一个先有鸡还是先有蛋的问题,因为当从 Github 手动签出标签时,Foo 1.0 的最新 Rockspec 不存在v1.0,但这不是预期的工作流程:当使用 LuaRocks 时,用户通常会使用luarocks install foo; 如果他们想查看项目的rockspecs,他们要么访问luarocks.org的Foo 页面,要么查看存储在HEAD 中的rockspecs,无论如何,这是人们首先停留的地方。

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

lpeg 怎么能在 luarocks 上上市却没有 rockspec?

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

[...] 我看到的版本号较低(例如 ldoc-scm-2.rockspec)。这是一个错误吗?

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

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

上述任何示例是否被视为最佳实践?

客观地说,由于运行时使用的 Rockspec 文件luarocks install foo是捆绑在文件中的.src.rock文件,与源档案分开存储,因此对于开发人员在源树中存储他们的 Rockspec 的确切位置没有重大的实际影响。这是个人组织的问题。

将最新的rockspec 保留在根目录有一点优势,即如果您想从本地签出的树进行构建scm,它会自动被拾取。luarocks make

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

于 2016-12-01T16:00:36.230 回答