使用Module :: Build的share_dir选项时,如何确保删除旧的共享内容?

时间:2012-11-02 02:13:50

标签: perl module-build

当用户安装我的Perl模块时,我正在使用Module::Build的{​​{1}}选项来安装只读补充内容。

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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

Yanick Champoux最近与this problem打交道。为此,他创建了File::ShareDir::Tarball及其Dist :: Zilla对应Dist::Zilla::Plugin::ShareDir::Tarball。这个想法是你的整个sharedir被tar,所以它只是一个目录。然后,当您的模块升级时,tarball会被替换,并且处于您期望的状态。

答案 1 :(得分: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


";
}

或者更好的是,添加一个执行实际卸载的pre-amble(可能使用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 '] );

答案 2 :(得分:1)

我现在上传了Module::Build::CleanInstall,希望能解决这样的问题。希望它有所帮助。非常感谢Yanick和不那么喜欢openid-匿名的灵感。