I maintain multiple Perl written (unix-ish) applications whose current installation process consists of a manually written Makefile
and installs configuration files into /etc/
.
I'd really like to switch their development to use Dist::Zilla
, but so far I haven't found any Dist::Zilla plugin or feature which allows me to put given files into /etc/
when the make install
(or ./Build install
in case of using Module::Build
instead of ExtUtils::MakeMaker
) is run by the local administrator who's installing my application.
With pure ExtUtils::MakeMaker
, I could define additional make targets in MY::postamble
and the let the install
target depend on one of them via the depend { install => … }
attribute. Doing something similar, but via dzil build
, would probably suffice, but I'd appreciate a more obvious way.
One orthogonal approach would be to make the application not to require the files under /etc/
to exist, but for just switching to Dist::Zilla that seems to much change in the actual code despite I only want to change the build system for now.
For the curious: the two applications I currently have in mind for switching to Dist::Zilla are xen-tools and unburden-home-dir.
The best thing to do is to avoid installing files into /etc
from any Perl distribution. You cannot ensure that the cpan client (or the installing user) has permissions to install there, and there can be multiple Perls installed on a system, so each one of them would clobber the /etc
files of another install. You can't really prevent the file from being overwritten by a subsequent install, so you shouldn't put config data there that you don't want to lose.
You could put the config file in /etc
/, if the application knows to look for it there, but you should allow for that path to be customized (say on a test system, look for the file in the local directory, or in a user's home directory).
For installing read-only module-specific data, the best practice in Perl is to install into a Perl-install-specific location, and the module to do that is File::ShareDir::Install. You can use it from Dist::Zilla using the [ShareDir] plugin, Dist::Zilla::Plugin::ShareDir. It is even included in the [@Basic] plugin bundle, so if you use [@Basic] in your dist.ini
, you don't need to do anything at all, other than drop your data files into the share/
directory in your distribution repository.
To access the contents of the sharedir from code, use File::ShareDir.
For porting a complex module installer to Dist::Zilla, I recommend my plugins MakeMaker::Custom or ModuleBuild::Custom, depending on which installer you prefer. These allow you to keep your existing Makefile.PL
or Build.PL
and just have Dist::Zilla plug in necessary bits like the dependencies.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With