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

Sea*_*sey 5 lua luarocks

我正在研究我的第一个lua包,我对于我的rockpec(s)以及放置它们的位置感到非常困惑.我看到的每一个流行的lua包似乎都不同地处理了rockspecs.这与Ruby非常不同,Ruby中每个宝石只有一个gemspec.这里有些例子:

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

现在,这个问题解释了为什么一个人会有一个"工作"的rockspec文件和一个充满释放版本的rockspecs的单独目录,但我还有几个问题:

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

His*_*H M 6

什么是rockspec修订版?

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

如果我的rockspec在VCS中,并且我标记了一个特定的提交,那么这不能有效地修复该提交中包含的rockspec(s),因此版本?

是.但这不是问题,因为建造时使用的rockspec不是源分布中包含的.甲.src.rock文件是包含提交的存档.rockspec文件和源代码压缩包(或者在子目录源结帐如果rockspec使用一个SCM协议如git://).

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

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

如何将lpeg列在luarocks但缺少rockpec?

可能是因为这是一个罕见的情况,上游和打包者不是同一个人.Roberto Ierusalimschy发布了lpeg,但截至2016年12月,Gary Vaughan上传了其中的岩石.

[...]我看到的那些修订号很低(例如ldoc-scm-2.rockspec).这是一个错误吗?

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

  • 如果rockspec使用make内置,则在scm添加或删除文件时,rockspec可能不会更改;
  • 有些项目不会经常更改其文件集,因此修订版本仍然很低;
  • 一些开发人员保留他们的scm岩石规格-0(如"不是发布的修订版"),并且从不将它们上传到luarocks.org(仅保留已发布的版本).因此,获取git修订版时获得的版本是该快照的有效版本.增加修订是rockars发布到luarocks.org的预期做法;
  • rockpec可能确实已经过时了,那就错了.

上述任何一个例子都被认为是最佳做法吗?

客观地说,由于运行时使用的rockspec文件luarocks install foo是捆绑在.src.rock文件中的一个文件,与源存档分开存储,因此开源人员在源树中的确切位置存储其岩石规格没有重大的实际后果.这是个人组织的问题.

将最新的scmrockspec保留在根目录上具有轻微的优势,即luarocks make如果想要从本地检出树进行构建,则会自动获取它.

但只要将railspecs上传到服务器luarocks upload foo,最终用户体验就会一样,无论源树中的岩石属性在哪里.