FindBin-libs
view release on metacpan or search on metacpan
version/v5.8/lib/FindBin/libs.pm view on Meta::CPAN
to check the code.
=back
=head1 Notes
=head2 Alternatives
FindBin::libs was developed to avoid pitfalls with
the items listed below. As of FindBin::libs-1.20,
this is also mutli-platform, where other techniques
may be limited to *NIX or at least less portable.
=over 4
=item PERL5LIBS
PERL5LIB can be used to accomplish the same directory
lookups as FindBin::libs. The problem is PERL5LIB often
contains absolte paths and does not automatically change
depending on where tests are run. This can leave you
modifying a file, changing directory to see if it works
with some other code and testing an unmodified version of
the code via PERL5LIB. FindBin::libs avoids this by using
$FindBin::bin to reference where the code is running from.
The same is true of trying to use almost any environmental
solution, with Perl's built in mechanism or one based on
$ENV{ PWD } or qx( pwd ).
Aside: Combining an existing PERL5LIB for
out-of-tree lookups with the "p5lib" option
works well for most development situations.
=item use lib qw( ../../../../Lib );
This works, but how many dots do you need to get all
the working lib's into a module or #! code? Class
distrubuted among several levels subdirectories may
have qw( ../../../lib ) vs. qw( ../../../../lib )
or various combinations of them. Validating these by
hand (let alone correcting them) leaves me crosseyed
after only a short session.
=item Anchor on a fixed lib directory.
Given a standard directory, it is possible to use
something like:
BEGIN
{
my ( $libdir ) = $0 =~ m{ ^( .+? )/SOMEDIR/ }x;
eval "use lib qw( $libdir )";
}
This looks for a standard location (e.g., /path/to/Mylib)
in the executable path (or cwd) and uses that.
The main problem here is that if the anchor ever changes
(e.g., when moving code between projects or relocating
directories now that SVN supports it) the path often has
to change in multiple files. The regex also may have to
support multiple platforms, or be broken into more complicated
File::Spec code that probably looks pretty much like what
use FindBin::libs qw( base=Mylib )
does anyway.
=back
=head2 FindBin::libs-1.2+ uses File::Spec
In order to accmodate a wider range of filesystems,
the code has been re-written to use File::Spec for
all directory and volume manglement.
There is one thing that File::Spec does not handle,
hoever, which is fully reolving absolute paths. That
still has to be handled via abs_path, when it works.
The issue is that File::Spec::rel2abs and
Cwd::abs_path work differently: abs_path only
returns true for existing directories and
resolves symlinks; rel2abs simply prepends cwd()
to any non-absolute paths.
The difference for FinBin::libs is that
including redundant directories can lead to
unexpected results in what gets included;
looking up the contents of heavily-symlinked
paths is slow (and has some -- admittedly
unlikely -- failures at runtime). So, abs_path()
is the preferred way to find where the lib's
really live after they are found looking up the
tree. Using abs_path() also avoids problems
where the same directory is included twice in a
sandbox' tree via symlinks.
Due to previous complaints that abs_path did not
work properly on all systems, the current
version of FindBin::libs uses File::Spec to
break apart and re-assemble directories, with
abs_path used optinally. If "abs_path cwd" works
then abs_path is used on the directory paths
handed by File::Spec::catpath(); otherwise the
paths are used as-is. This may leave users on
systms with non-working abs_path() having extra
copies of external library directories in @INC.
Another issue is that I've heard reports of
some systems failing the '-d' test on symlinks,
where '-e' would have succeded.
=head1 See Also
=over 4
=item File::Spec
( run in 1.491 second using v1.01-cache-2.11-cpan-0b58ddf2af1 )