Как лучше всего управлять файлами luarocks rockpec и почему?

Я работаю над своим первым пакетом lua, и я глубоко запутался, как назвать мои рокспеки и куда их поместить. Кажется, что каждый популярный пакет lua, на который я смотрю, работает с рокспеками по-разному. Это очень отличается, скажем, от Ruby, где у каждого драгоценного камня есть только один gemspec. Вот некоторые примеры:

  • lua-cliargs: одна спецификация в корне проекта (например, lua_cliargs-3.0-1.rockspec)
  • ldoc: одиночный спецификатор в корне проекта, названный scm вместо номера версии (например, ldoc-scm-2.rockspec)
  • lua-MessagePack: несколько спецификаций с названиями версий, хранящихся в каталоге rockspec/ верхнего уровня (например, lua-messagepack-0.1.0-1.rockspec, ... lua-messagepack-0.3.4-1.rockspec), за которыми следуют некоторые с дополнительной версией lua, вставленной перед версией пакета (например, lua-messagepack-lua53-0.3.6-1.rockspec). Иногда для одной и той же версии пакета есть две рокспеки, одна содержит lua53, а другая нет.
  • luafilesystem: несколько спецификаций с названиями версий, хранящихся в каталоге /rockspec верхнего уровня (например, luafilesystem-1.3.0-1.rockspec, .. . luafilesystem-1.6.1-1.rockspec), за которыми следуют те, которые имеют cvs вместо номера версии пакета, вставленного перед версией пакета (например, luafilesystem-cvs-1.rockspec, luafilesystem-cvs-2.rockspec).
  • lpeg: рокспек отсутствует вообще
  • luasocket: одна спецификация в корне, содержащая scm вместо номера пакета (например, luasocket-scm-0.rockspec), и каталог /rockspec, содержащий одну спецификацию породы с номером пакета (например, luasocket-3.0rc2-1.rockspec)

Теперь этот вопрос объясняет, почему есть "рабочий" файл рокспеков и отдельный каталог, полный релизных версий рокспеков, но у меня все еще есть несколько вопросов:

  1. Для чего нужны пересмотры Rockspec? В вики luarocks говорится, что выпуски пакетов должны быть помечены в git номером версии, а приведенный пример не включает версию Rockspec. Если моя спецификация находится в VCS, и я помечаю конкретную фиксацию, разве это не исправит рок-спецификации, включенные в эту фиксацию, и, следовательно, версию? Более поздняя версия Rockspec не может быть в помеченном коммите.
  2. Как lpeg может быть указано на luarocks, но не иметь rockspec?
  3. В вики luarocks сказано, что scm следует использовать вместо номера версии пакета, если вы хотите, чтобы ваш Rockspec ссылался на HEAD. Но поскольку HEAD постоянно меняется, а в спецификации должны быть перечислены все файлы, может показаться, что необходимо постоянно увеличивать число revision в спецификации scm, чтобы не отставать от любых добавленных или удаленных файлов. Можно было бы обойти это, вообще не используя номер версии для scm Rockspecs, и тем не менее те, которые я вижу, имеют низкие номера версии (например, ldoc-scm-2.rockspec). Это ошибка?
  4. Считаются ли какие-либо из приведенных выше примеров передовой практикой?

person Sean Mackesey    schedule 01.12.2016    source источник


Ответы (1)


Для чего нужны пересмотры Rockspec?

Версия Rockspec — это версия самого файла Rockspec. Предположим, вы выпустили Foo версии 1.0; вы создаете рокспек foo-1.0-1.rockspec. Позже вы узнаете, что для компиляции Foo 1.0 во FreeBSD вам нужно передать дополнительный флаг -D; исходный код вообще не требует изменений. Вы редактируете спецификацию, добавляя раздел переопределения платформы, и повторно отправляете его в luarocks.org как foo-1.0-2.rockspec.

Если моя спецификация находится в VCS, и я помечаю конкретную фиксацию, разве это не исправит рок-спецификации, включенные в эту фиксацию, и, следовательно, версию?

Да. Но это не проблема, потому что Rockspec, использованный при сборке, не входит в исходный дистрибутив. Файл .src.rock — это архив, содержащий отправленный файл .rockspec и tar-архив с исходным кодом (или извлечение исходного кода в подкаталоге, если в спецификации Rockspec используется SCM, например git://).

Действительно, это приводит к проблеме курицы и яйца в том, что последняя спецификация для Foo 1.0 отсутствует, когда кто-то извлекает тег v1.0 вручную из Github, но это не ожидаемый рабочий процесс: при использовании LuaRocks пользователь обычно будет использовать luarocks install foo; и если они захотят ознакомиться со спецификациями проекта, они либо зайдут на страницу Foo по адресу luarocks.org, либо смотрели бы характеристики камней, хранящиеся в HEAD, куда люди в любом случае заглядывают в первую очередь.

Обратите внимание, что аналогичная ситуация с курицей и яйцом возникает, если кто-то хочет распространить исходный архив, содержащий спецификацию, а затем хочет установить архив source.url и соответствующий ему source.md5 в спецификации. Наличие MD5 означает, что сам рокспек не может находиться внутри архива. Один из способов обойти это — просто избегать поля source.md5 или пропускать спецификацию при упаковке архива. Это та же самая ситуация, которая произошла бы, если бы метаданные пакета дистрибутива Linux были включены в исходный tarball; здесь это более очевидно, потому что апстрим и упаковщик, как правило, являются одним и тем же лицом.

Как lpeg может быть указан на luarocks, но не иметь рок-спецификации?

Вероятно, потому что это редкий случай, когда апстрим и упаковщик не являются одним и тем же лицом. Роберто Иерусалимский выпустил lpeg, но по состоянию на декабрь 2016 года спецификации для него загружены Гэри Воганом.

[...] те, которые я вижу, имеют низкие номера ревизий (например, ldoc-scm-2.rockspec). Это ошибка?

У этого может быть много причин, и это может быть ошибкой или нет.

  • Если в рокспеке используется встроенная функция make, то рокспек scm, скорее всего, не изменится при добавлении или удалении файлов;
  • Некоторые проекты просто не так часто меняют свой набор файлов, поэтому ревизия остается низкой;
  • Некоторые разработчики сохраняют свои scm рокспеки на уровне -0 (например, «не выпущенная версия») и никогда не загружают их на luarocks.org. (сохраняя там только выпущенные версии). Таким образом, тот, который вы получаете, когда получаете версию git, является допустимым для этого моментального снимка. Добавление редакций является ожидаемой практикой для спецификаций, опубликованных на luarocks.org;
  • Rockspec может быть действительно устаревшим, и тогда это ошибка.

Считаются ли какие-либо из приведенных выше примеров передовой практикой?

Объективно говоря, поскольку файл Rockspec, используемый при запуске luarocks install foo, является файлом, включенным в файл .src.rock и хранящимся отдельно от исходных архивов, нет серьезных практических последствий в отношении того, где именно в дереве исходного кода разработчик хранит свои Rockspecs. Это вопрос личной организации.

Сохранение самой последней версии scm в корне имеет небольшое преимущество: она автоматически подхватывается luarocks make, если кто-то хочет сделать сборку из локально проверенного дерева.

Но пока спецификации загружаются на сервер с luarocks upload foo, взаимодействие с конечным пользователем будет одинаковым, независимо от того, где находятся спецификации в исходном дереве.

person Hisham H M    schedule 01.12.2016