File::ShareDir::Dist(3) | User Contributed Perl Documentation | File::ShareDir::Dist(3) |
File::ShareDir::Dist - Locate per-dist shared files
version 0.07
use File::ShareDir::Dist qw( dist_share ); my $dir = dist_share 'Foo-Bar-Baz';
File::ShareDir::Dist finds share directories for distributions. It is similar to File::ShareDir with a few differences:
That does mean that you need to have a .pm that corresponds to your dist name. This is not always the case for some older historical distributions, but it has been the recommended convention for quite some time.
The goal of this project is to have no non-core dependencies for the two most recent production versions of Perl. As of this writing that means Perl 5.26 and 5.24. In the future, we "may" add dependencies on modules that are not part of the Perl core on older Perls.
Example, if you have the directory structure:
lib/Foo/Bar/Baz.pm share/data
and you invoke perl with
% perl -Ilib -MFoo::Bar::Baz -MFile::ShareDir::Dist=dist_share -E 'say dist_share("Foo-Bar-Baz")'
"dist_share" will return the (absolute) path to ./share/data. If you invoked it with:
% export PERL5LIB `pwd`/lib perl -MFoo::Bar::Baz -MFile::ShareDir::Dist=dist_share -E 'say dist_share("Foo-Bar-Baz")'
it would not. For me this covers most of my needs when developing a Perl module with a share directory.
prove foils this heuristic by making @INC absolute paths. To get around that you can use App::Prove::Plugin::ShareDirDist.
% perl -MFile::ShareDir::Dist=-Foo-Bar-Baz=./share -E 'say File::ShareDir::Dist::dist_share("Foo-Bar-Baz")' /.../share
If neither of those work then you can set PERL_FILE_SHAREDIR_DIST to a dist name, directory pair
% env PERL_FILE_SHAREDIR_DIST=Foo-Bar-Baz=`pwd`/share perl -MFile::ShareDir::Dist -E 'say File::ShareDir::Dist::dist_share("Foo-Bar-Baz")'
For File::ShareDir you have to either mock the "dist_dir" function or install File::ShareDir::Override. For testing you can use Test::File::ShareDir. I have never understood why such a simple concept needs three modules to do all of this.
Functions must be explicitly exported. They are not exported by default.
my $dir = dist_share $dist_name; my $dir = dist_share $module_name;
Returns the absolute path to the share directory of the given distribution.
As a convenience you can also use the "main" module name associated with the distribution. That means if you want the share directory for the dist "Foo-Bar-Baz" you may use either "Foo-Bar-Baz" or "Foo::Bar::Baz" to find it.
Returns nothing if no share directory could be found.
[version 0.07]
my $config = dist_config $dist_name;
Returns the config at runtime as created by File::ShareDir::Dist::Install and install time.
All the stuff that is in File::ShareDir but not in this module could be considered either caveats or features depending on your perspective I suppose.
Author: Graham Ollis <plicease@cpan.org>
Contributors:
Yanick Champoux (yanick)
This software is copyright (c) 2017,2018 by Graham Ollis.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
2018-08-30 | perl v5.34.0 |