Como posso executar comandos arbitrários como parte de uma instalação do pacote deb?

1

Estou criando um pacote ppa deb para um módulo python, substituindo um pacote pip (que também criei), e gostaria de executar a "desinstalação pip" como parte da instalação deb.

Como posso executar "pip uninstall" como parte da instalação do pacote ppa?

Eu quero fazer isso porque a instalação do pip em / usr / local / lib tem prioridade sobre a instalação do deb em / usr / lib, então os usuários que previamente instalaram com o pip podem estar usando a versão antiga do pip quando instalam o versão deb.

Já experimentei duas coisas, nenhuma das quais funcionou e não sei porquê (quaisquer sugestões de como resolver isto melhor seriam muito apreciadas - tentei "dpkg --log = log.txt -i" mas o log não mostrou nenhuma mensagem de erro de desinstalação pip):

execute a desinstalação do pip no setup.py

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,
    }
)

Isso funcionou bem quando instalado com o "sudo python setup.py install", mas a desinstalação do pip nunca foi executada quando o pacote foi instalado com o "dpkg -i".

execute a desinstalação do pip no makefile de regras

#!/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

Quando eu corri código similar em um makefile diretamente, ele funcionou bem, mas novamente a desinstalação do pip nunca foi executada quando o pacote foi instalado com o "dpkg -i".

    
por JDiMatteo 03.10.2014 / 09:22

1 resposta

0

Mesmo que não seja realmente recomendado remover silenciosamente um pacote em /usr/local , você pode fazer isso em um script debian/bamliquidatorbatch.preinst :

#!/bin/sh
set -e

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

Observe que bamliquidatorbatch deve ser o nome exato do seu pacote binário debian (para corresponder a debian/bamliquidatorbatch.preinst ).

    
por Sylvain Pineau 03.10.2014 / 10:23