我维护多个Perl编写的(unix-ish)应用程序,其当前安装过程由手动编写的Makefile
组成,并将配置文件安装到/etc/
。
我真的想将他们的开发转换为使用Dist::Zilla
,但到目前为止我还没有找到任何Dist :: Zilla插件或功能,它允许我将给定的文件放入{{ 1}}当/etc/
(或使用Module::Build
而不是ExtUtils::MakeMaker
时为make install
)由安装我的应用程序的本地管理员运行时。< / p>
使用纯./Build install
,我可以在ExtUtils::MakeMaker
中定义其他制作目标,并让MY::postamble
目标通过install
属性依赖其中一个。做一些类似的事情,但是通过depend { install => … }
,可能就足够了,但我更欣赏一种更明显的方式。
一种正交的方法是让应用程序不要求dzil build
下的文件存在,但只是切换到Dist :: Zilla,尽管我只想改变,但实际代码似乎发生了很大变化现在的构建系统。
对于好奇:我目前想要切换到Dist :: Zilla的两个应用程序是xen-tools和unburden-home-dir。
答案 0 :(得分:4)
最好的办法是避免从任何Perl发行版中将文件安装到/etc
。您无法确保cpan客户端(或安装用户)具有在那里安装的权限,并且系统上可能安装了多个Perls,因此每个Perl都会破坏另一个安装的/etc
个文件。您无法真正阻止文件被后续安装覆盖,因此您不应该将配置数据放在那里,以免丢失。
您可以将配置文件放在/etc
/中,如果应用程序知道在那里查找它,但您应该允许自定义该路径(例如在测试系统上,查找该文件中的文件)本地目录,或在用户的主目录中。)
为了安装只读模块特定数据,Perl中的最佳实践是安装到特定于Perl安装的位置,并且执行该操作的模块是File::ShareDir::Install。您可以使用[ShareDir]插件Dist::Zilla从Dist::Zilla::Plugin::ShareDir使用它。它甚至包含在[@Basic]插件包中,所以如果你在dist.ini
中使用[@Basic],你根本不需要做任何事情,除了将数据文件放入分发存储库中的share/
目录。
要从代码访问sharedir的内容,请使用File::ShareDir。
答案 1 :(得分:2)
要将复杂的模块安装程序移植到Dist :: Zilla,我建议使用我的插件MakeMaker::Custom或ModuleBuild::Custom,具体取决于您喜欢的安装程序。这些允许您保留现有的Makefile.PL
或Build.PL
,并将Dist :: Zilla插入必要的位,如依赖项。