如何在 deb 包安装过程中运行任意命令?

如何在 deb 包安装过程中运行任意命令?

我正在为一个 python 模块创建一个 ppa deb 包,以替换一个 pip 包(也是我创建的),并且我想在 deb 安装中运行“pip uninstall”。

如何在 ppa 包安装过程中运行“pip uninstall”?

我想这样做是因为 /usr/local/lib 中的 pip 安装在 /usr/lib 中的 deb 优先级高于 /usr/lib 中的 deb 安装,因此以前使用 pip 安装的用户在安装 deb 版本时可能会无意中使用旧的 pip 版本。


我已经尝试了两件事,但都没有起作用,而且我不知道为什么(任何关于如何更好地解决这个问题的建议都将不胜感激——我尝试了“dpkg --log=log.txt -i”,但日志没有显示任何 pip 卸载错误消息):

A.在setup.py中执行pip uninstall

from setuptools import setup
from setuptools.command.install import install

import os.path
import subprocess

class CustomInstallCommand(install):
    def run(self):
        if os.path.exists("/usr/local/lib/python2.7/dist-packages/bamliquidatorbatch"): 
            print "Old pip bamliquidatorbatch install detected, attempting to remove"
            subprocess.call(["pip", "uninstall", "-y", "BamLiquidatorBatch"])

        install.run(self)

setup(
    ...
    cmdclass={
        'install': CustomInstallCommand,
    }
)

当使用“sudo python setup.py install”安装时,此操作正常,但当使用“dpkg -i”安装包时,pip uninstall 从未运行过。

B. 在规则 makefile 中执行 pip uninstall

#!/usr/bin/make -f

%:
    dh $@ --with python2 --buildsystem=python_distutils
    if [ -d "/usr/local/lib/python2.7/dist-packages/bamliquidatorbatch" ]; then pip uninstall -y BamLiquidatorBatch; echo; fi

当我直接在 makefile 中运行类似的代码时,它运行良好,但是当使用“dpkg -i”安装包时,pip uninstall 再次从未运行。

答案1

即使不建议悄悄删除包,/usr/local您也可以在脚本中执行此操作debian/bamliquidatorbatch.preinst

#!/bin/sh
set -e

if [ -d "/usr/local/lib/python2.7/dist-packages/bamliquidatorbatch" ]; then
    pip uninstall -y BamLiquidatorBatch;
fi

请注意,bamliquidatorbatch应该是您的 debian 二进制包的准确名称(以匹配debian/bamliquidatorbatch.preinst)。

相关内容