当用户安装我的 Perl 模块时,我使用Module::Build
'sshare_dir
选项安装只读补充内容。
如何确保在安装新版本的模块时删除以前版本的模块添加的旧内容?
在此先感谢您的帮助。
当用户安装我的 Perl 模块时,我使用Module::Build
'sshare_dir
选项安装只读补充内容。
如何确保在安装新版本的模块时删除以前版本的模块添加的旧内容?
在此先感谢您的帮助。
Yanick Champoux 最近一直在处理这个问题。为此,他创建了File::ShareDir::Tarball及其 Dist::Zilla 对应的Dist::Zilla::Plugin::ShareDir::Tarball。这个想法是你的整个共享目录都被 tar 了,所以它只有一个目录。然后当你的模块升级时,tarball 被替换并且它处于你期望的状态。
如果您要从发行版中删除文件,我建议让 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 '] );
我现在已经上传Module::Build::CleanInstall
,希望能解决这样的问题。希望它有所帮助。非常感谢 Yanick 和 so-not-like-openid-anonymity 的灵感。