ExtUtils::Packlist - 管理 .packlist 文件
use ExtUtils::Packlist;
my ($pl) = ExtUtils::Packlist->new('.packlist');
$pl->read('/an/old/.packlist');
my @missing_files = $pl->validate();
$pl->write('/a/new/.packlist');
$pl->{'/some/file/name'}++;
or
$pl->{'/some/other/file/name'} = { type => 'file',
from => '/some/file' };
ExtUtils::Packlist 提供了一种标准的方式来管理 .packlist 文件。它提供了用于读取和写入 .packlist 文件的函数。原始的 .packlist 格式是一个简单的绝对路径列表,每行一个。此外,此包还支持扩展格式,除了文件名外,每行还可以包含一个属性列表,形式为以空格分隔的键值对列表。例如,installperl 脚本使用它来区分文件和链接。
由 new() 函数返回的哈希引用可用于检查和修改 .packlist 的内容。可以通过修改哈希来向 .packlist 添加/删除项目。如果与哈希键关联的值是标量,则任何后续 write() 写入 .packlist 的条目将是一个简单文件名。如果值是哈希,则写入的条目将是文件名,后跟哈希中的键值对。读取 .packlist 将重新创建原始条目。
此方法接受一个可选参数,即 .packlist 文件的名称。如果文件存在,它将被打开,并且文件的内容将被读取。new() 方法返回对哈希的引用。此哈希为 .packlist 中的每一行保存一个条目。对于旧式 .packlist,与每个键关联的值为 undef。对于新式 .packlist,与每个键关联的值是一个哈希,其中包含 .packlist 中文件名后面的键=值对。
此方法接受一个可选参数,即要读取的 .packlist 文件的名称。如果未指定文件,将读取传递给 new() 的 .packlist。如果 .packlist 不存在,将调用 Carp::croak。
此方法接受一个可选参数,即要写入的 .packlist 文件的名称。如果未指定文件,将覆盖传递给 new() 的 .packlist。
此方法检查 .packlist 中列出的每个文件是否实际存在。如果给出了一个计算结果为真的参数,任何丢失的文件将从内部哈希中删除。返回值是丢失文件的列表,如果所有文件都存在,则该列表为空。
此方法返回关联的 .packlist 文件的名称。
以下是 modrm
,一个用于干净地删除已安装模块的小型实用程序。
#!/usr/local/bin/perl -w
use strict;
use IO::Dir;
use ExtUtils::Packlist;
use ExtUtils::Installed;
sub emptydir($) {
my ($dir) = @_;
my $dh = IO::Dir->new($dir) || return(0);
my @count = $dh->read();
$dh->close();
return(@count == 2 ? 1 : 0);
}
# Find all the installed packages
print("Finding all installed modules...\n");
my $installed = ExtUtils::Installed->new();
foreach my $module (grep(!/^Perl$/, $installed->modules())) {
my $version = $installed->version($module) || "???";
print("Found module $module Version $version\n");
print("Do you want to delete $module? [n] ");
my $r = <STDIN>; chomp($r);
if ($r && $r =~ /^y/i) {
# Remove all the files
foreach my $file (sort($installed->files($module))) {
print("rm $file\n");
unlink($file);
}
my $pf = $installed->packlist($module)->packlist_file();
print("rm $pf\n");
unlink($pf);
foreach my $dir (sort($installed->directory_tree($module))) {
if (emptydir($dir)) {
print("rmdir $dir\n");
rmdir($dir);
}
}
}
}
Alan Burlison <[email protected]>