如何使基于Dist :: Zilla的Perl模块(或应用程序)将文件安装到/ etc /中?
我维护了多个Perl写入(unix-ish)应用程序,其当前安装过程由手动编写,并将配置文件安装到/etc/
中。如何使基于Dist :: Zilla的Perl模块(或应用程序)将文件安装到/ etc /中?
我真的想切换其开发使用Dist::Zilla
,但到目前为止,我还没有发现任何DIST ::吉拉插件或功能,它可以让我把给定的文件到/etc/
当make install
(或./Build install
的情况下,使用Module::Build
而不是ExtUtils::MakeMaker
)由安装我的应用程序的本地管理员运行。
纯粹的ExtUtils::MakeMaker
,我可以在MY::postamble
中定义额外的制作目标,并让install
目标通过depend { install => … }
属性依赖其中的一个目标。做类似的事情,但通过dzil build
,可能就足够了,但我会欣赏一个更明显的方式。
一个正交的方法是让应用程序不要求/etc/
下的文件存在,但只是切换到Dist :: Zilla,尽管我只想更改构建系统,但似乎在实际代码中发生了很大变化目前。
对于好奇:我目前想要切换到Dist :: Zilla的两个应用程序是xen-tools和unburden-home-dir。
为了将一个复杂的模块安装程序移植到Dist :: Zilla,我建议使用我的插件MakeMaker::Custom或ModuleBuild::Custom,具体取决于您喜欢哪种安装程序。这些允许您保留现有的Makefile.PL
或Build.PL
,并且只需要Dist :: Zilla插入必要的位,如依赖关系。
人。根据Dist :: Zilla :: Plugin :: MakeMaker :: Custom的概要,它需要相当多的样板代码(其中我还不确定它实际上是什么)。我看到一个特性就是'Makefile。PL'仍然没有'dzil build'工作,但是我根本不需要这些,而是预期会有'## {$ ALL_EXCEPT_WriteMakefile ##}''然后添加几行附加代码,这些代码可能会修改'% args'和最后一个'WriteMakefile(%args);',即整个文件不需要超过几行加我的添加。 – 2014-09-25 15:04:55
@XTaran,大部分样板都是传统的'Makefile.PL'。除非...... eval'所做的所有'正在做的事情是添加旧版本[ExtUtils :: MakeMaker](https://metacpan.org/pod/ExtUtils::MakeMaker)的兼容性。相反,您可以提高ExtUtils :: MakeMaker的最低版本,或者根本不尝试使用这些功能。 – cjm 2014-09-25 15:11:18
谢谢,这使得它更短,更易于理解。 :-)我建议将这些信息添加到段落中的段落“当然,你的Makefile.PL应该比这更复杂,否则你不需要这个插件。”这或多或少地表明它可能更复杂,但并不复杂。也许用“可以”代替“应该”,并删除“或者你不需要这个插件”这个短语。 – 2014-09-25 15:16:54
最好的办法是避免从任何Perl发行版中将文件安装到/etc
。您无法确保cpan客户端(或安装用户)有权在其中安装,并且系统上可能安装了多个Perls,因此它们中的每一个都会打断另一个安装的/etc
文件。你不能真正阻止后续安装文件被覆盖,所以你不应该把配置数据放在那里,你不想丢失。
如果应用程序知道在那里寻找它,你可以将配置文件放在/etc
/中,但是你应该允许自定义该路径(比如说在测试系统上,在本地目录中查找文件,或者在用户的主目录中)。
对于安装只读模块特定的数据,Perl中的最佳做法是安装到特定于Perl的安装位置,并且要执行该操作的模块是File::ShareDir::Install。您可以使用Dist::Zilla使用[ShareDir]插件,Dist::Zilla::Plugin::ShareDir。它甚至包含在[@Basic]插件包中,所以如果您在dist.ini
中使用[@Basic],则根本不需要执行任何操作,除了将数据文件放入配送库中的share/
目录。
要从代码中访问sharedir的内容,请使用File::ShareDir。
另一种说法是:允许用户写入'/ etc /',但让用户可以写入'/ etc /',然后,只有当他们想覆盖默认值时。 如果他们不想重写默认值,那么他们很高兴使用任何你的发行版放在'share /'目录中,你可以随意使用而不必哭。 – 2014-09-29 18:05:02
当然,对于没有写入权限的情况,配置文件的安装路径需要可配置。我虽然对覆盖事物还没有一个好主意。到目前为止,这是由这两个应用程序的分发包处理程序处理的,但是打包程序需要/更喜欢应用程序将配置文件安装到'$ PREFIX/etc /'中,因为这是他们放置的地方。只读模块特定的数据是一个不同的主题,但确实是不容易的。 – 2014-09-29 19:33:01
实际上像Debian包装中的'debian/install'文件是很整洁的。 – 2014-09-25 15:10:40