Как я могу автоматически обновить $ VERSION модулей Perl с помощью Git? - PullRequest
23 голосов
/ 21 сентября 2009

Допустим, команда программистов делает веб-приложение на Perl и использует git для размещения своего кода. Теперь у них есть небольшая проблема с версиями своих модулей:

  • Perl::Critic и PBP оба рекомендуют $VERSION переменную с поддержкой RCS в коде
  • git явно рекомендует против , используя заменяемые номера ревизий в коде (с вескими аргументами)

Я понимаю, почему git не выполняет расширение ключевых слов. Тем не менее, я прекрасно понимаю необходимость номеров ревизий для небольшого кода:

  • Вам нужно требуется отдельное управление версиями для каждого модуля, так как вы можете использовать версионное use
  • Вы, вероятно, не хотите изменить эти номера версий для быстро меняющегося модуля вручную

Глобальную версию продукта для упаковки и тестирования можно легко реализовать с помощью тегов и git describe, но я до сих пор не вижу способа внедрить автоматическое управление версиями для отдельных модулей.

У вас есть какое-нибудь решение для меня?

Ответы [ 4 ]

20 голосов
/ 21 сентября 2009

Забудьте, что Perl Best Practices говорит.Это не Библия, а просто предлагает использовать ключевые слова RCS, потому что в то время, когда она была написана, никто не думал о других системах контроля версий.Вашей целью никогда не должно быть соответствие конкретной реализации PBP, а адаптация ideas в PBP к вашей собственной ситуации.Не забудьте прочитать первую главу этой книги.

Сначала давайте исправим ваши предположения:

  1. Вам не нужна отдельная версия для каждого модуля в дистрибутиве.Вам нужно только дать каждому файлу модуля версию, отличающуюся от предыдущей версии.Каждый модуль в дистрибутиве может иметь одну и ту же версию, и когда они это делают, все они могут быть больше, чем версия из последнего дистрибутива.

  2. Почему бы не изменить версии быстроменять модуль вручную?Вы должны были определить точки, где ваш код становится тем, что люди могут использовать.В этот момент вы делаете что-то, чтобы сказать, что вы приняли решение о том, что ваш рабочий продукт должен распространяться, будь то тестовый или стабильный выпуск.Вы изменяете версии как способ рассказать людям о своей разработке.Когда вы позволяете системе контроля версий делать это только потому, что делаете это, вы теряете возможность обозначать циклы в своей разработке.Например, я обычно использую два небольших места выпуска.Это означает, что я получаю 100 выпусков до того, как сортировка выйдет из строя, и мне нужно поднять основную версию, чтобы восстановить правильный порядок сортировки.Недостаточно места для версии, если я позволю VCS справиться с этим для меня.

Я использовал ключевые слова RCS, чтобы связать версии моих модулей с их номером регистрации или номером редакции, но я никогдаэто действительно понравилосьЯ делаю много коммитов в файл, прежде чем он будет готов к следующей версии, и мне не нужно менять $VERSION просто потому, что я исправил опечатку в документации.В номерах версий будут большие скачки, потому что я внес много небольших изменений.

Теперь я просто изменяю версии всех файлов моего модуля, когда я готов выпустить новый дистрибутив.Я использую ppi_version для одновременного изменения всех версий:

ppi_version change 1.23 1.24

Все мои файлы модулей получают одинаковые $VERSION.Мне не нужно использовать $VERSION, чтобы различать их, потому что для этого я использую обычные функции управления исходным кодом.Мне не нужно $VERSION, чтобы связать его с определенным коммитом.

Если я работаю над новым дистрибутивом версии 1.23, я начинаю делать версии разработки 1.23_01, 1.23_02 и т. Д.,но только когда я готов позволить людям попробовать эти версии.Я изменяю версию в начале цикла, а не в конце.Все мои коммиты, ведущие к следующему релизу, уже имеют свою следующую версию.Я также делаю заметки о том, чего я хочу добиться в этом цикле.

Когда я думаю, что это начало нового цикла, я снова поднимаю версию.Когда я думаю, что у меня стабильная версия, я меняю разработку $VERSION на стабильную, например, с 1.23_04 до 1.24.Всякий раз, когда я выпускаю что-то, я также отмечаю это в управлении исходным кодом.Я могу видеть, где мои основные точки развития довольно легко совмещаются с контролем версий.

Для меня все намного проще.Ничто не связано с управлением исходным кодом, которое я решил использовать, поэтому мне не нужно переделывать все, если я изменяю то, что я использую.

3 голосов
/ 21 сентября 2009

Что вы используете для сборки вашего модуля Perl?

Решение, используемое ядром Linux и самим проектом Git, заключается в замене "++ VERSION ++" (или "++ PROJECT_VERSION ++", или "@@ PROJECT_VERSION @@") заполнителей на система сборки , в этом случае Makefile. (В файлах на C это делается путем определения константы препроцессора "PROJECT_VERSION" с помощью опции '-DPROJECT_VERSION=$(PROJECT_VERSION)', передаваемой компилятору). В вашем случае это может быть что-то вроде Module::Install, Module::Build или ExtUtils::MakeMaker.

Оба ядра Git и Linux используют для этого GIT-VERSION-GEN скрипт, который:

  1. использует git describe, если проект собран из репозитория git,
  2. возвращается к файлу version (или VERSION, или GIT-VERSION-FILE), если сборка выполняется из моментального снимка (этот файл создается при создании моментального снимка / архива),
  3. и, наконец, возвращается к заранее определенному номеру версии, номер которого обновляется в коммите, который отмечает новую выпущенную версию (например, cb572206 коммит в репозитории git, он же коммит v1.6.4.4).

Надеюсь, это поможет вам.

3 голосов
/ 21 сентября 2009

Я бы пошел на ручное повышение версий при внесении несовместимых изменений, потому что, конечно, не каждое изменение оправдывает изменение.

Вы также можете зайти на справочную страницу ' gitattributes ' для атрибута filter - возможно, вы захотите ввести собственный фильтр для выполнения подстановок, основанный на ' git description 'выводится автоматически.

0 голосов
/ 21 сентября 2009

Как насчет чего-то действительно ленивого, немного грязного:

Вы можете написать крошечную оболочку для git-add. Перед фактическим вызовом git-add оболочка подталкивает номер версии где-то в модуле, где его можно найти с помощью простого регулярного выражения.

Обновление:

В настоящее время я сам не использую что-то подобное, но я серьезно об этом думаю.

Мои нынешние рассуждения:

  • В отличие от CVS или subversion, git ничего не знает о номерах версий и ревизий.
  • Драйверы фильтров должны иметь другой источник информации, чтобы иметь возможность вставлять номер версии, и этот источник должен быть доступен на компьютере любого из разработчиков.
  • Таким образом, лучшим источником номера версии является сам версионный файл.
  • И чтобы сам файл можно было использовать в качестве источника для следующего номера версии, номер версии должен быть частью его соответствующего двоичного объекта git.

Преимущества:

  • Это происходит автоматически, и нет способа забыть обновить номер вашей версии.
  • Плавный переход с CVS / SVN на git. Каждый коммит вводит новую версию.

Недостатки:

  • Ленивый разработчик, который всегда делает git add ., будет подталкивать номера версий файлов, к которым он не прикасался.
  • Похоже, нет способа принудительно использовать сценарий оболочки.
...