Bonjour,
On a pas mal travaillé avec @TiTidom ces dernières semaines/mois afin de mettre au point un moyen simple d’installer les dépendances python de nos plugins et donc comme promis sur quelques sujets, voici une proposition pour faciliter ces installs:
objectifs en quelques mots:
- dans un venv pour la compatibilité avec debian 12 (mais pas que, même sous debian 10 & 11 c’est un vrai plus car plus d’impact cross plugins sur des dépendances partagées puisqu’elles ne le sont plus)
- avec l’aide de pyenv si besoin d’une version de python pas encore supportée de base par Debian et donc plus de soucis avec de vieille installation debian10 qui bloque les évolutions, c’est machine là vont pouvoir tourner sous python 3.12 si on veut;
- tout en optimisant tout cela pour éviter d’installer 5 fois python pour 5 plugins différents
Et voici donc le résultat qui se repose sur la lib mise au point par @nebz qui est à elle seule un vrai plus (avec auto-correction des erreurs les plus fréquentes etc, je vous laisse lire la doc mais ce n’est pas le sujet du jour)
Actuellement cette nouvelle lib est encore dans un fork sur mon compte mais on va probablement centraliser tout ça
En quelques mots voici comment cela fonctionne, pour plus de détails voir la doc.
Il faut avoir un fichier requirements.txt
qui contient la liste des dépendances requises & le script d’install habituel install_apt.sh
, ces deux fichiers se trouvant à priori dans votre dossier resources
.
Contenu du fichier install_apt.sh
qui devrait convenir dans la plupart des cas:
######################### INCLUSION LIB ##########################
BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
wget https://raw.githubusercontent.com/Mips2648/dependance.lib/master/dependance.lib --no-cache -O ${BASE_DIR}/dependance.lib &>/dev/null
PLUGIN=$(basename "$(realpath ${BASE_DIR}/..)")
LANG_DEP=en
. ${BASE_DIR}/dependance.lib
##################################################################
wget https://raw.githubusercontent.com/Mips2648/dependance.lib/master/pyenv.lib --no-cache -O ${BASE_DIR}/pyenv.lib &>/dev/null
. ${BASE_DIR}/pyenv.lib
##################################################################
# TARGET_PYTHON_VERSION="3.11"
# VENV_DIR=${BASE_DIR}/venv
# APT_PACKAGES="first1 second2"
launchInstall
ce qu’on y trouve:
- chargement des libs: dependance.lib & pyenv.lib
- en option:
- spécifier la version minimum de python voulue
- le dossier venv si on veut un dossier différent de
resources/venv
- une liste de paquet apt à installer (séparés par un espace); aucun rapport avec les dépendances python mais ca permet de couvrir des besoins d’installation assez fréquent en plus des dépendances python
- appel à la fonction
launchInstall
et le boulot sera fait, rien de plus n’est nécessaire :
- création ou mise à jour d’un venv avec une version python >= à la version demandée (ou la version du système si non précisé)
- installation des dépendances listées dans
requirements.txt
Bien sur si vous utilisez ce système pour l’installation des dépendances, cela veut dire que vous n’utilisez pas le système « packages.json » du core et que donc il faut rajouter également quelques lignes à votre class eqLogic pour le dependancy_info()
et dependancy_install()
(je peux proposer des snipets tout fait pour ca)
Pour votre info, j’ai également fait une proposition pour la gestion des venv via le core: Pip on debian 12 by zoic21 · Pull Request #2566 · jeedom/core · GitHub et cela surtout pour offrir la compatibilité avec debian12
les différences avec avantages/inconvénient que je vois entre les 2 options (uniquement sur la partie python bien entendu, le core gère plus que cela) :
packages.json:
- (+) intégré complétement au core, encore moins de boulot à faire que ce qui est présenté ici.
- (-) pas de dependabot possible (en tout cas pas facilement)
- (-) ne gère les venv qu’à partir de debian12 (choix fait pour pouvoir assurer la retro-compatibilité à 100% sur les versions antérieur)
- (-) ne gère pas (encore) l’installation de versions de python différentes via pyenv (mais si l’équipe accepte ca sera possible, j’ai déjà ce qu’il faut sous le coude)
pyenv.lib
- (-) un peu plus de boulot (
dependancy_info()
etdependancy_install()
à écrire +requirements.txt
&install_apt.sh
) - (+) facile d’avoir un dependabot qui tourne sur github sur votre repo pour la gestion de vos dépendances puisqu’on utilise le fichier
requirements.txt
qui est un standard python - (+) gère les venv sur toutes versions de debian (>=10) dès aujourd’hui et vous gérez la transition!
- (+) possible d’utiliser n’importe quelle version de python sur n’importe quelle version de Debian sans le moindre impact en dehors de votre plugin!
- (+) parce que cette lib se base sur dependance.lib de @nebz on bénéficie de tout ces avantages: log bien formaté et clair (c’est subjectif c’est vrai) avec mise en évidence des erreurs avec surtout la correction automatique des erreurs les plus fréquentes rencontrées lors des installations!
donc moins de posts sur community pour ce genre de problème; et ça, ça n’a pas de prix !
edit:
J’avais oublié de préciser et pourtant c’est très important, il faut ajouter cette fonction dans la class eqLogic pour exclure le dossier venv du backup, sinon ca augmente beaucoup la taille du backup jeedom:
public static function backupExclude() {
return [
'resources/venv'
];
}