HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: //usr/local/share/man/man3/Test::File::ShareDir.3pm
.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings.  \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
.    ds -- \(*W-
.    ds PI pi
.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
.    ds L" ""
.    ds R" ""
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds -- \|\(em\|
.    ds PI \(*p
.    ds L" ``
.    ds R" ''
.    ds C`
.    ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{\
.    if \nF \{\
.        de IX
.        tm Index:\\$1\t\\n%\t"\\$2"
..
.        if !\nF==2 \{\
.            nr % 0
.            nr F 2
.        \}
.    \}
.\}
.rr rF
.\" ========================================================================
.\"
.IX Title "Test::File::ShareDir 3"
.TH Test::File::ShareDir 3 "2017-03-01" "perl v5.26.3" "User Contributed Perl Documentation"
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
Test::File::ShareDir \- Create a Fake ShareDir for your modules for testing.
.SH "VERSION"
.IX Header "VERSION"
version 1.001002
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 1
\&    use Test::More;
\&
\&    # use FindBin; optional
\&
\&    use Test::File::ShareDir
\&        # \-root => "$FindBin::Bin/../" # optional,
\&        \-share => {
\&            \-module => { \*(AqMy::Module\*(Aq => \*(Aqshare/MyModule\*(Aq }
\&            \-dist   => { \*(AqMy\-Dist\*(Aq    => \*(Aqshare/somefolder\*(Aq }
\&        };
\&
\&    use My::Module;
\&
\&    use File::ShareDir qw( module_dir dist_dir );
\&
\&    module_dir( \*(AqMy::Module\*(Aq ) # dir with files from $dist/share/MyModule
\&
\&    dist_dir( \*(AqMy\-Dist\*(Aq ) # dir with files from $dist/share/somefolder
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\f(CW\*(C`Test::File::ShareDir\*(C'\fR is some low level plumbing to enable a distribution to perform tests while consuming its own \f(CW\*(C`share\*(C'\fR
directories in a manner similar to how they will be once installed.
.PP
This allows \f(CW\*(C`File::ShareDir\*(C'\fR to see the \fIlatest\fR version of content instead of simply whatever is installed on whichever target
system you happen to be testing on.
.PP
\&\fBNote:\fR This module only has support for creating 'new' style share dirs and are \s-1NOT\s0 compatible with old File::ShareDirs.
.PP
For this reason, unless you have File::ShareDir 1.00 or later installed, this module will not be usable by you.
.SH "SIMPLE INTERFACE"
.IX Header "SIMPLE INTERFACE"
Starting with version \f(CW0.4.0\fR, there are a few extra interfaces you can use.
.PP
These will probably be more useful, and easier to grok, because they don't have a layer of
indirection in order to simultaneously support both \f(CW\*(C`Module\*(C'\fR and \f(CW\*(C`Dist\*(C'\fR \f(CW\*(C`ShareDir\*(C'\fR's.
.SS "Simple Exporter Interfaces"
.IX Subsection "Simple Exporter Interfaces"
\fI\f(CI\*(C`Test::File::ShareDir::Dist\*(C'\fI\fR
.IX Subsection "Test::File::ShareDir::Dist"
.PP
\&\f(CW\*(C`Test::File::ShareDir::Dist\*(C'\fR provides a simple export interface
for making \f(CW\*(C`TempDir\*(C'\fR \f(CW\*(C`ShareDir\*(C'\fR's from a given path:
.PP
.Vb 1
\&    use Test::File::ShareDir::Dist { "Dist\-Name" => "share/" };
.Ve
.PP
This will automatically create a \f(CW\*(C`ShareDir\*(C'\fR for \f(CW\*(C`Dist\-Name\*(C'\fR in a \f(CW\*(C`TempDir\*(C'\fR based on the contents of \f(CW\*(C`CWD/share/\*(C'\fR
.PP
See \f(CW\*(C`Test::File::ShareDir::Dist\*(C'\fR for details.
.PP
\fI\f(CI\*(C`Test::File::ShareDir::Module\*(C'\fI\fR
.IX Subsection "Test::File::ShareDir::Module"
.PP
\&\f(CW\*(C`Test::File::ShareDir::Module\*(C'\fR provides a simple export interface
for making \f(CW\*(C`TempDir\*(C'\fR \f(CW\*(C`ShareDir\*(C'\fR's from a given path:
.PP
.Vb 1
\&    use Test::File::ShareDir::Module { "Module::Name" => "share/" };
.Ve
.PP
This will automatically create a \f(CW\*(C`ShareDir\*(C'\fR for \f(CW\*(C`Module::Name\*(C'\fR in a \f(CW\*(C`TempDir\*(C'\fR based on the contents of \f(CW\*(C`CWD/share/\*(C'\fR
.PP
See \f(CW\*(C`Test::File::ShareDir::Module\*(C'\fR for details.
.SS "Simple Object Oriented Interfaces"
.IX Subsection "Simple Object Oriented Interfaces"
\fI\f(CI\*(C`Test::File::ShareDir::Object::Dist\*(C'\fI\fR
.IX Subsection "Test::File::ShareDir::Object::Dist"
.PP
\&\f(CW\*(C`Test::File::ShareDir::Object::Dist\*(C'\fR provides a simple object oriented interface for
making \f(CW\*(C`TempDir\*(C'\fR \f(CW\*(C`ShareDir\*(C'\fR's from a given path:
.PP
.Vb 1
\&    use Test::File::ShareDir::Object::Dist;
\&
\&    my $obj = Test::File::ShareDir::Object::Dist\->new( dists => { "Dist\-Name" => "share/" } );
\&    $obj\->install_all_dists;
\&    $obj\->register;
.Ve
.PP
This will automatically create a \f(CW\*(C`ShareDir\*(C'\fR for \f(CW\*(C`Dist\-Name\*(C'\fR in a \f(CW\*(C`TempDir\*(C'\fR based on the contents of \f(CW\*(C`CWD/share/\*(C'\fR
.PP
See \f(CW\*(C`Test::File::ShareDir::Object::Dist\*(C'\fR for details.
.PP
\fI\f(CI\*(C`Test::File::ShareDir::Object::Module\*(C'\fI\fR
.IX Subsection "Test::File::ShareDir::Object::Module"
.PP
\&\f(CW\*(C`Test::File::ShareDir::Object::Module\*(C'\fR provides a simple object oriented interface
for making \f(CW\*(C`TempDir\*(C'\fR \f(CW\*(C`ShareDir\*(C'\fR's from a given path:
.PP
.Vb 1
\&    use Test::File::ShareDir::Object::Module;
\&
\&    my $obj = Test::File::ShareDir::Object::Module\->new( modules => { "Module::Name" => "share/" } );
\&    $obj\->install_all_modules;
\&    $obj\->register;
.Ve
.PP
This will automatically create a \f(CW\*(C`ShareDir\*(C'\fR for \f(CW\*(C`Module::Name\*(C'\fR in a \f(CW\*(C`TempDir\*(C'\fR based on the contents of \f(CW\*(C`CWD/share/\*(C'\fR
.PP
See \f(CW\*(C`Test::File::ShareDir::Object::Module\*(C'\fR for details.
.SH "SCOPE LIMITED UTILITIES"
.IX Header "SCOPE LIMITED UTILITIES"
\&\f(CW\*(C`Test::File::ShareDir\*(C'\fR provides a few utility functions to aide in temporarily adjusting \f(CW\*(C`ShareDir\*(C'\fR behavior.
.PP
.Vb 1
\&    use Test::File::ShareDir qw( with_dist_dir with_module_dir );
\&
\&    with_dist_dir({ \*(AqDist\-Name\*(Aq => \*(AqSome/Path\*(Aq }, sub {
\&      # dist_dir() now behaves differently here
\&    });
\&    with_module_dir({ \*(AqModule::Name\*(Aq => \*(AqSome/Path\*(Aq }, sub {
\&      # module_dir() now behaves differently here
\&    });
.Ve
.PP
See \f(CW\*(C`EXPORTABLE FUNCTIONS\*(C'\fR for details.
.SH "IMPORTING"
.IX Header "IMPORTING"
Since \f(CW1.001000\fR, there are 2 ways of passing arguments to \f(CW\*(C`import\*(C'\fR
.PP
.Vb 2
\&  use Foo { \-root => ... options }, qw( functions to import );
\&  use Foo \-optname => option, \-optname => option, qw( functions to import );
.Ve
.PP
Both should work, but the former might be less prone to accidental issues.
.SS "\s-1IMPORT OPTIONS\s0"
.IX Subsection "IMPORT OPTIONS"
\fI\-root\fR
.IX Subsection "-root"
.PP
This parameter is the prefix the other paths are relative to.
.PP
If this parameter is not specified, it defaults to the Current Working Directory ( \f(CW\*(C`CWD\*(C'\fR ).
.PP
In versions prior to \f(CW0.3.0\fR, this value was mandatory.
.PP
The rationale behind using \f(CW\*(C`CWD\*(C'\fR as the default value is as follows.
.IP "\(bu" 4
Most users of this module are likely to be using it to test distributions
.IP "\(bu" 4
Most users of this module will be using it in \f(CW\*(C`$project/t/\*(C'\fR to load files from \f(CW\*(C`$project/share/\*(C'\fR
.IP "\(bu" 4
Most \f(CW\*(C`CPAN\*(C'\fR tools run tests with \f(CW\*(C`CWD\*(C'\fR = \f(CW$project\fR
.PP
Therefor, defaulting to \f(CW\*(C`CWD\*(C'\fR is a reasonably sane default for most people, but where it is not it can
still be overridden.
.PP
.Vb 1
\&  \-root => "$FindBin::Bin/../" # resolves to project root from t/ regardless of Cwd.
.Ve
.PP
\fI\-share\fR
.IX Subsection "-share"
.PP
This parameter is mandatory, and contains a \f(CW\*(C`hashref\*(C'\fR containing the data that explains what directories you want shared.
.PP
.Vb 1
\&  \-share =>  { ..... }
.Ve
.PP
\-module
.IX Subsection "-module"
.PP
\&\f(CW\*(C`\-module\*(C'\fR contains a \f(CW\*(C`hashref\*(C'\fR mapping Module names to path names for module_dir style share dirs.
.PP
.Vb 3
\&  \-share => {
\&    \-module => { \*(AqMy::Module\*(Aq => \*(Aqshare/mymodule/\*(Aq, }
\&  }
\&
\&  ...
\&
\&  module_dir(\*(AqMy::Module\*(Aq)
.Ve
.PP
Notedly, it is a \f(CW\*(C`hashref\*(C'\fR, which means there is a limitation of one share dir per module. This is simply because having more
than one share dir per module makes no sense at all.
.PP
\-dist
.IX Subsection "-dist"
.PP
\&\f(CW\*(C`\-dist\*(C'\fR contains a \f(CW\*(C`hashref\*(C'\fR mapping Distribution names to path names for dist_dir style share dirs. The same limitation
applied to \f(CW\*(C`\-module\*(C'\fR applies here.
.PP
.Vb 5
\&  \-share => {
\&    \-dist => { \*(AqMy\-Dist\*(Aq => \*(Aqshare/mydist\*(Aq }
\&  }
\&  ...
\&  dist_dir(\*(AqMy\-Dist\*(Aq)
.Ve
.SH "EXPORTABLE FUNCTIONS"
.IX Header "EXPORTABLE FUNCTIONS"
.SS "with_dist_dir"
.IX Subsection "with_dist_dir"
Sets up a \f(CW\*(C`ShareDir\*(C'\fR environment with limited context.
.PP
.Vb 2
\&  # with_dist_dir(\e%config, \e&sub);
\&  with_dist_dir( { \*(AqDist\-Name\*(Aq => \*(Aqshare/\*(Aq } => sub {
\&
\&      # File::ShareDir resolves to a copy of share/ in this context.
\&
\&  } );
.Ve
.PP
\&\f(CW%config\fR can contain anything \f(CW\*(C`Test::File::ShareDir::Dist\*(C'\fR accepts.
.ie n .IP """\-root"": Defaults to $CWD" 4
.el .IP "\f(CW\-root\fR: Defaults to \f(CW$CWD\fR" 4
.IX Item "-root: Defaults to $CWD"
.PD 0
.ie n .IP """\fI$distName\fP"": Declare $distName's ""ShareDir""." 4
.el .IP "\f(CW\f(CI$distName\f(CW\fR: Declare \f(CW$distName\fR's \f(CWShareDir\fR." 4
.IX Item "$distName: Declare $distName's ShareDir."
.PD
.PP
\&\fISince 1.001000\fR
.SS "with_module_dir"
.IX Subsection "with_module_dir"
Sets up a \f(CW\*(C`ShareDir\*(C'\fR environment with limited context.
.PP
.Vb 2
\&  # with_module_dir(\e%config, \e&sub);
\&  with_module_dir( { \*(AqModule::Name\*(Aq => \*(Aqshare/\*(Aq } => sub {
\&
\&      # File::ShareDir resolves to a copy of share/ in this context.
\&
\&  } );
.Ve
.PP
\&\f(CW%config\fR can contain anything \f(CW\*(C`Test::File::ShareDir::Module\*(C'\fR accepts.
.ie n .IP """\-root"": Defaults to $CWD" 4
.el .IP "\f(CW\-root\fR: Defaults to \f(CW$CWD\fR" 4
.IX Item "-root: Defaults to $CWD"
.PD 0
.ie n .IP """\fI$moduleName\fP"": Declare $moduleName's ""ShareDir""." 4
.el .IP "\f(CW\f(CI$moduleName\f(CW\fR: Declare \f(CW$moduleName\fR's \f(CWShareDir\fR." 4
.IX Item "$moduleName: Declare $moduleName's ShareDir."
.PD
.PP
\&\fISince 1.001000\fR
.SH "THANKS"
.IX Header "THANKS"
Thanks to the \f(CW\*(C`#distzilla\*(C'\fR crew for ideas,suggestions, code review and debugging, even though not all of it made it into releases.
.IP "\(bu" 4
\&\s-1DOLMEN\s0 <cpan:///author/dolmen>
.IP "\(bu" 4
\&\s-1ETHER\s0 <cpan:///author/ether>
.IP "\(bu" 4
\&\s-1HAARG\s0 <cpan:///author/haarg>
.IP "\(bu" 4
\&\s-1RJBS\s0 <cpan:///author/rjbs>
.SH "AUTHOR"
.IX Header "AUTHOR"
Kent Fredric <kentnl@cpan.org>
.SH "COPYRIGHT AND LICENSE"
.IX Header "COPYRIGHT AND LICENSE"
This software is copyright (c) 2017 by Kent Fredric <kentnl@cpan.org>.
.PP
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.