内容

名称

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 将重新创建原始条目。

函数

new()

此方法接受一个可选参数,即 .packlist 文件的名称。如果文件存在,它将被打开,并且文件的内容将被读取。new() 方法返回对哈希的引用。此哈希为 .packlist 中的每一行保存一个条目。对于旧式 .packlist,与每个键关联的值为 undef。对于新式 .packlist,与每个键关联的值是一个哈希,其中包含 .packlist 中文件名后面的键=值对。

read()

此方法接受一个可选参数,即要读取的 .packlist 文件的名称。如果未指定文件,将读取传递给 new() 的 .packlist。如果 .packlist 不存在,将调用 Carp::croak。

write()

此方法接受一个可选参数,即要写入的 .packlist 文件的名称。如果未指定文件,将覆盖传递给 new() 的 .packlist。

validate()

此方法检查 .packlist 中列出的每个文件是否实际存在。如果给出了一个计算结果为真的参数,任何丢失的文件将从内部哈希中删除。返回值是丢失文件的列表,如果所有文件都存在,则该列表为空。

packlist_file()

此方法返回关联的 .packlist 文件的名称。

EXAMPLE

以下是 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);
	     }
	  }
       }
    }

AUTHOR

Alan Burlison <[email protected]>