Как сделать Perl-модуль (или приложение) на основе Dist::Zilla установочными файлами в /etc/?

Я поддерживаю несколько написанных на Perl (unix-ish) приложений, текущий процесс установки которых состоит из написанного вручную Makefile и установки файлов конфигурации в /etc/.

Я бы очень хотел переключить их разработку на использование Dist::Zilla, но пока этого не сделал. нашел какой-либо плагин Dist::Zilla или функцию, которая позволяет мне помещать данные файлы в /etc/, когда make install (или ./Build install в случае использования Module::Build вместо ExtUtils::MakeMaker) запускается локальным администратором, установка моего приложения.

С чистым ExtUtils::MakeMaker я мог бы определить дополнительные цели make в MY::postamble и позволить цели install зависеть от одной из них через атрибут depend { install => … }. Сделать что-то подобное, но через dzil build, вероятно, будет достаточно, но я был бы признателен за более очевидный способ.

Один ортогональный подход состоял бы в том, чтобы приложение не требовало существования файлов под /etc/, а просто переключалось на Dist::Zilla, что, похоже, сильно меняет фактический код, несмотря на то, что я хочу изменить только систему сборки на данный момент.

Для любопытных: в настоящее время я имею в виду два приложения для перехода на Dist::Zilla: xen- инструменты и разгрузить-home-dir.


person Axel Beckert    schedule 25.09.2014    source источник
comment
На самом деле, что-то вроде файла debian/install в упаковке Debian было бы неплохо.   -  person Axel Beckert    schedule 25.09.2014


Ответы (2)


Лучше всего избегать установки файлов в /etc из любого дистрибутива Perl. Вы не можете гарантировать, что клиент cpan (или пользователь, выполняющий установку) имеет права на установку там, и в системе может быть установлено несколько Perl, поэтому каждый из них будет затирать /etc файлы другой установки. Вы не можете предотвратить перезапись файла при последующей установке, поэтому вам не следует помещать туда данные конфигурации, которые вы не хотите потерять.

Вы можете поместить файл конфигурации в /etc/, если приложение знает, что нужно искать его там, но вы должны разрешить настройку этого пути (скажем, в тестовой системе ищите файл в локальном каталоге или в папке пользователя). домашний каталог).

Для установки данных, специфичных для модуля только для чтения, в Perl рекомендуется устанавливать в место, специфичное для установки Perl, а модуль для этого — Файл::ShareDir::Install. Вы можете использовать его из Dist::Zilla с помощью подключаемого модуля [ShareDir], Dist::Zilla::Plugin::ShareDir. Он даже включен в комплект плагинов [@Basic], поэтому, если вы используете [@Basic] в своем dist.ini, вам вообще ничего не нужно делать, кроме как поместить файлы данных в каталог share/ в вашем репозитории дистрибутива. .

Чтобы получить доступ к содержимому общего каталога из кода, используйте File::ShareDir.

person Ether    schedule 29.09.2014
comment
Другой способ выразить это: разрешить пользователям писать в /etc/, но сделать запись в /etc/ ответственностью пользователя, и только в том случае, если они хотят переопределить значения по умолчанию. Если они не хотят переопределять значения по умолчанию, то они будут счастливы использовать все, что поставляются вашими дистрибутивами в каталоге share/, который вы можете стереть по своему желанию, не плача. - person Kent Fredric; 29.09.2014
comment
Конечно, путь установки для файлов конфигурации должен быть настраиваемым для тех случаев, когда нет разрешения на запись. Хотя у меня пока нет хорошего представления о перезаписывании. До сих пор этим занимались упаковщики дистрибутива для этих двух приложений, но упаковщикам нужно/предпочитается, чтобы приложение устанавливало файлы конфигурации в $PREFIX/etc/, поскольку именно туда они его поместили. Данные, относящиеся только к модулю, предназначенные только для чтения, — это отдельная тема, но на самом деле это не проблема. - person Axel Beckert; 29.09.2014

Для переноса сложного установщика модулей на Dist::Zilla я рекомендую свои плагины MakeMaker::Custom или ModuleBuild::Custom, в зависимости от того, какой установщик вы предпочитаете. Это позволяет вам сохранить существующие Makefile.PL или Build.PL и просто добавить в Dist::Zilla необходимые биты, такие как зависимости.

person cjm    schedule 25.09.2014
comment
Хрм. Согласно синопсису Dist::Zilla::Plugin::MakeMaker::Custom, для этого требуется довольно много стандартного кода (из которого я еще не уверен, что он на самом деле делает). Я вижу, что одна особенность заключается в том, что Makefile.PL все еще работает без dzil build, но мне это вообще не нужно, и я скорее ожидал чего-то, что будет просто с ##{ $ALL_EXCEPT_WriteMakefile ##}, затем добавлением очень нескольких строк дополнительного кода, который может изменить %args, и финальный WriteMakefile(%args);, т.е. весь файл занимает всего несколько строк плюс мои дополнения. - person Axel Beckert; 25.09.2014
comment
@XTaran, большая часть шаблона - это то, как выглядит традиционный Makefile.PL. Все, что делает unless ... eval, — это добавляет совместимость со старыми версиями ExtUtils::MakeMaker. Вместо этого вы можете либо поднять минимальную версию ExtUtils::MakeMaker, либо вообще не пытаться использовать эти функции. - person cjm; 25.09.2014
comment
Спасибо, так короче и понятнее. :-) Я предлагаю добавить эту информацию в POD перед абзацем. Конечно, ваш Makefile.PL должен быть более сложным, иначе вам не нужен этот плагин. что более или менее предполагает, что он может быть сложнее, но не менее сложным. И, возможно, замените должен на может и опустите фразу, или вам не нужен этот плагин. - person Axel Beckert; 25.09.2014