0

当用户安装我的 Perl 模块时,我使用Module::Build'sshare_dir选项安装只读补充内容。

如何确保在安装新版本的模块时删除以前版本的模块添加的旧内容?

在此先感谢您的帮助。

4

3 回答 3

1

Yanick Champoux 最近一直在处理这个问题。为此,他创建了File::ShareDir::Tarball及其 Dist::Zilla 对应的Dist::Zilla::Plugin::ShareDir::Tarball。这个想法是你的整个共享目录都被 tar 了,所以它只有一个目录。然后当你的模块升级时,tarball 被替换并且它处于你期望的状态。

于 2012-11-02T03:54:27.093 回答
1

如果您要从发行版中删除文件,我建议让 Makefile.PL 或 Build.PL 拒绝安装,添加这个

my $mod = 'CGI';
if( eval "require $mod; 1" ){
  die "

YOU HAVE TO UNINSTALL $mod before you can upgrade, use one of
cpanp -u  $mod  --force
pm-uninstall -vf $mod


";
}

或者更好的是,添加一个执行实际卸载的前导码(可能使用 ExtUtils::Install::uninstall($packlist) )

通常你会知道你的模块的哪个版本需要完全卸载,所以你可能想添加一个版本检查......

FWIW,这将成为一个很好的 Module::Build/Module::Install/ExtUtils::MakeMaker 添加/扩展/插件,接受类似的东西

requires_uninstall_if_installed  => '<3000' ,
requires_uninstall_if_installed  => { CGI => '<3000', 'CGI::Util' => '<3000' },
requires_uninstall_if_installed  => [ qw' CGI CGI::Util '],

requires_uninstall_if_installed( '<3000' );
requires_uninstall_if_installed( { CGI => '<3000', 'CGI::Util' => '<3000' } );
requires_uninstall_if_installed( [ qw' CGI CGI::Util '] );
于 2012-11-02T11:12:22.583 回答
1

我现在已经上传Module::Build::CleanInstall,希望能解决这样的问题。希望它有所帮助。非常感谢 Yanick 和 so-not-like-openid-anonymity 的灵感。

于 2012-11-03T15:54:03.330 回答