AutoInstall.pmとlib::xiとWindows

AutoInstall.pmはそのままでは動きません。 lib::xiの方は、cpanmではインストール出来ません。 まあ、どうせWindowsなんて。 …と、言っていても仕方ありません。 なんとかしようではありませんか。 AutoInstallが動かないのは、Windowsに「/usr/bin/env」が無いだけなので、ちょっと書き換えれば普通に使えます。 重宝していました。

 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
package AutoInstall;

# perl -MAutoInstall pl.pl
use strict;
use warnings;

BEGIN {
    push @INC, sub {
        my ($self, $filename) = @_;
        my ($modulename) = ($filename =~ /^(.*)\.pm$/m);
        return unless $modulename;
        $modulename =~ s{/}{::}g;

        #        system('/usr/bin/env', 'cpanm', $modulename);
        system(qq{cpanm $modulename});
        my $result;
        foreach my $prefix (@INC) {
            ref($prefix) and next;
            my $realfilename = "$prefix/$filename";
            if (-f $realfilename) {
                open my $fh, "<", $realfilename;
                return $fh;
            }
        }
    };
}

1;

一方、lib::xiの方は、生のファイルをそのまま使えば動きます。 生のファイルを「xi.pm」という「名前を付けて保存」して、script.plと同じフォルダにある「lib」という名前のフォルダの中にコピーします。

1
2
3
- script.pl
- lib
- xi.pm

lib::xiはcpanmに対してオプションを設定できるのがいいですね。 最初にフォルダ名を書くと、自動的に「–local-lib」オプションのフォルダ名として認識してくれます。 なので、スクリプトに以下のように書いておくと、

1
use lib::xi qw/extlib/;

そのスクリプトを実行するごとに、足りないモジュールがあれば、スクリプトと同じフォルダにある「extlib」というフォルダの中にインストールされていきます。 しかも、別途「use lib」しなくても良いので、スクリプトもすっきりです。 ただし、この場合に注意が必要なのは、「extlib」をあらかじめ作っておく必要がある、ということです。 「extlib」以下のフォルダは自動的に作ってくれますので、「extlib」という名前のフォルダだけは作っておきましょう。

Comments

comments powered by Disqus