当用户安装我的Perl模块时,我正在使用Module::Build
的{{1}}选项来安装只读补充内容。
如何在安装新版本的模块时确保删除以前版本的模块添加的旧内容?
提前感谢您的帮助。
答案 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-匿名的灵感。