File: vendorlib.pm

package info (click to toggle)
libvendorlib-perl 0.12-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 112 kB
  • sloc: perl: 56; makefile: 2
file content (100 lines) | stat: -rw-r--r-- 2,317 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use utf8;
package vendorlib;
our $AUTHORITY = 'cpan:RKITOVER';
$vendorlib::VERSION = '0.12';
use strict;
use warnings;
use Config;

=encoding UTF-8

=head1 NAME

vendorlib - Use Only Core and Vendor Libraries in @INC

=head1 SYNOPSIS

    #!/usr/bin/perl

    use vendorlib;
    use strict;
    use warnings;
    use SomeModule; # will only search in core and vendor paths
    ...

=head1 DESCRIPTION

In a system distribution such as Debian, it may be advisable for Perl programs
to ignore the user's CPAN-installed modules and only use the
distribution-provided modules to avoid possible breakage with newer and
unpackaged versions of modules.

To that end, this pragma will replace your C<@INC> with only the core and vendor
C<@INC> paths, ignoring site_perl and C<$ENV{PERL5LIB}> entirely.

It is recommended that you put C<use vendorlib;> as the first statement in your
program, before even C<use strict;> and C<use warnings;>.

=cut

sub import {
    my @paths = (($^O ne 'MSWin32' ? ('/etc/perl') : ()), @Config{qw/
        vendorarch
        vendorlib
        archlib
        privlib
    /});

    # This grep MUST BE on copies of the paths to not trigger Config overload
    # magic.
    @paths = grep $_, @paths;

    # remove duplicates
    my @result;
    while (my $path = shift @paths) {
        if (@paths && $path eq $paths[0]) {
            # ignore
        }
        else {
            push @result, $path;
        }
    }
    @paths = @result;

    # fixup slashes for @INC on Win32
    if ($^O eq 'MSWin32') {
        s{\\}{/}g for @paths;
    }

    # expand tildes
    if ($^O ne 'MSWin32') {
        for my $path (@paths) {
            if ($path =~ m{^~/+}) {
                my $home = (getpwuid($<))[7];
                $path =~ s|^~/+|${home}/|;
            }
            elsif (my ($user) = $path =~ /^~(\w+)/) {
                my $home = (getpwnam($user))[7];
                $path =~ s|^~${user}/+|${home}/|;
            }
        }
    }

    # remove any directories that don't actually exist
    # this will also remove /etc/perl on non-Debian systems
    @paths = grep -d, @paths;

    @INC = @paths;
}

=head1 ACKNOWLEDGEMENTS

Thanks to mxey, jawnsy and ribasushi for help with the design.

=head1 AUTHOR

Rafael Kitover <rkitover@gmail.com>

=cut

__PACKAGE__; # End of vendorlib