Rez est un gestionnaire de packages multiplateforme avec une différence. En utilisant Rez, vous pouvez créer des environnements autonomes configurés pour un ensemble donné de packages. Cependant, contrairement à de nombreux autres gestionnaires de packages, les packages ne sont pas installés dans ces environnements autonomes. Au lieu de cela, toutes les versions de packages sont installées dans un référentiel central et les environnements autonomes font référence à ces packages existants. Cela signifie que les environnements configurés sont légers et très rapides à créer, ne prenant souvent que quelques secondes à configurer malgré le fait qu'ils contiennent des centaines de packages.
Voir le wiki pour une documentation complète.
Les gestionnaires de packages typiques installent des packages dans un environnement
Rez installe les packages une fois et configure les environnements de manière dynamique
Rez prend une liste de demandes de packages et construit l'environnement cible, en résolvant toutes les dépendances de packages nécessaires. Tout type de progiciel est pris en charge : compilé, python, applications et bibliothèques.
Les packages sont stockés dans des référentiels sur disque. Chaque package possède un seul fichier de définition concis ( package.py ) qui définit ses dépendances, ses commandes (comment il configure l'environnement qui le contient) et d'autres métadonnées. Par exemple, voici le fichier de définition de package pour le module Python de requêtes populaires :
name = "requests" version = "2.8.1" authors = ["Kenneth Reitz"] requires = [ "python-2.7+" ] def commands(): env.PYTHONPATH.append("{root}/python")
Ce package nécessite python-2.7 ou supérieur. Lorsqu'il est utilisé, le sous-répertoire « python » dans son emplacement d'installation est ajouté à la variable d'environnement PYTHONPATH.
Lorsqu'un environnement est créé avec l'API rez ou l'outil rez-env , un algorithme de résolution de dépendances suit les exigences des packages et résout en une liste de packages nécessaires. Les commandes de ces packages sont concaténées et évaluées, ce qui donne un environnement configuré. Rez est capable de configurer des environnements contenant des centaines de packages, souvent en quelques secondes. Les résolutions peuvent également être enregistrées dans un fichier et, une fois réévaluées ultérieurement, elles reconstruiront à nouveau le même environnement.
Cet exemple place l'utilisateur dans un shell résolu contenant les packages demandés, à l'aide de l'outil rez-env :
]$ rez-env requests-2.2+ python-2.6 'pymongo-0+<2.7' You are now in a rez-configured environment. resolved by [email protected], on Wed Feb 26 15:56:20 2014, using Rez v2.0.0 requested packages: requests-2.2+ python-2.6 pymongo-0+<2.7 resolved packages: python-2.6.8 /software/ext/python/2.6.8 platform-linux /software/ext/platform/linux requests-2.2.1 /software/ext/requests/2.2.1/python-2.6 pymongo-2.6.3 /software/ext/pymongo/2.6.3 arch-x86_64 /software/ext/arch/x86_64 > ]$ _
Cet exemple crée un environnement contenant le package 'houdini' version 12.5 ou supérieure, et exécute la commande 'hescape -h' dans cet environnement :
]$ rez-env houdini-12.5+ -- hescape -h Usage: hescape [-foreground] [-s editor] [filename ...] -h: output this usage message -s: specify starting desktop by name -foreground: starts process in foreground
Les environnements résolus peuvent également être créés via l'API :
>>> import subprocess >>> from rez.resolved_context import ResolvedContext >>> >>> r = ResolvedContext(["houdini-12.5+", "houdini-0+<13", "java", "!java-1.8+"]) >>> p = r.execute_shell(command='which hescape', stdout=subprocess.PIPE) >>> out, err = p.communicate() >>> >>> print(out) '/software/ext/houdini/12.5.562/bin/hescape'
Tout d’abord, installez Rez en utilisant Python 3.7+. Téléchargez la source et, à partir du répertoire source, exécutez (en remplaçant DEST_DIR par votre emplacement d'installation) :
]$ python3 ./install.py -v DEST_DIR
Cela installe les outils de ligne de commande Rez. Il imprimera un message à la fin vous indiquant comment utiliser Rez une fois l'installation terminée. Rez n'est pas un package Python normal et vous ne l'installez donc généralement pas avec pip ou setup.py. Ne déplacez pas l'installation - réinstallez-la vers un nouvel emplacement si vous souhaitez modifier le chemin d'installation. Si vous souhaitez installer rez pour plusieurs systèmes d'exploitation, effectuez des installations distinctes pour chacun de ces systèmes.
Ensuite, vous devez créer quelques packages Rez essentiels. L'outil rez-bind crée des packages Rez basés sur des logiciels déjà installés sur votre système. Essayez de lier la liste de packages suivante (notez que pour Python, vous aurez peut-être besoin de privilèges administratifs) :
]$ rez-bind platform ]$ rez-bind arch ]$ rez-bind os ]$ rez-bind python
Vous devriez maintenant pouvoir créer un environnement contenant Python. Essayez ceci :
]$ rez-env python -- which python /home/ajohns/packages/python-2.7.8/platform-linux/arch-x86_64/os-Ubuntu-12.04/bin/python
L'outil rez-build est utilisé pour créer des packages et les installer localement (généralement dans $HOME/packages ). Une fois que vous avez fait cela, vous pouvez les utiliser via rez-env , comme n'importe quel autre package :
]$ cd example_packages/hello_world ]$ rez-build --install ... ]$ rez-env hello_world -- hello Hello world!
Prend en charge Linux, OSX et Windows ;
Permet un cycle de construction-installation-test rapide et efficace ;
Crée des shells de type : bash, tcsh, autre (les shells peuvent être ajoutés en tant que plugins) ;
Contient un système de déploiement prenant en charge git, mercurial et svn (en tant que plugins) ;
Les résolutions d'environnement peuvent être enregistrées sur le disque et réutilisées ultérieurement (un peu comme VirtualEnv) ;
Hautement enfichable, prend en charge cinq types de plugins différents pour effectuer des tâches allant de l'ajout de nouveaux types de shell à l'ajout de nouveaux systèmes de construction ;
Contient un algorithme de résolution de version, pour éviter les conflits de versions ;
Visualise les environnements résolus dans un graphique à points rendu ;
Les packages sont trouvés dans un chemin de recherche, de sorte que différents packages peuvent être déployés à différents emplacements ;
Prend en charge les numéros de version alphanumériques ;
Possède une syntaxe d'exigences de version puissante, capable de décrire n'importe quelle plage de versions, et un opérateur de conflit pour rejeter les plages de versions ;
« Variantes » de package : un moyen de définir différentes versions de la même version de package, par exemple un plugin conçu pour plusieurs versions de l'application hôte ;
Des crochets de version personnalisés (tels que des opérations post-version) peuvent être ajoutés en tant que plugins ;
Possède une fonction de verrouillage temporel, qui permet de recréer les anciennes résolutions (les packages les plus récents sont ignorés) ;
Les définitions de package constituent un fichier unique et succinct ;
Les packages définissent leur effet sur l'environnement (ajout à PATH, etc.) d'une manière indépendante de la plate-forme et du shell, en utilisant une API python dédiée ;
Dispose d'un système de mise en cache basé sur Memcached, pour les résolutions de l'environnement de mise en cache ;
Dispose d'une fonction de filtrage des packages, permettant des versions de packages par étapes telles que les packages alpha et bêta.
Si vous trouvez un bug, avez besoin d'aide ou souhaitez parler aux développeurs, voici une liste des différentes manières de nous contacter :
Signaler un problème
Salon de discussion : Rejoignez la chaîne #rez
Démarrer une discussion
Liste de diffusion : notez qu'ils sont beaucoup moins actifs sur la liste de diffusion que sur tout autre canal de communication.
Actuellement, les versions CMake ne fonctionnent pas sous Windows avec Rez et les tests associés sont ignorés. Un correctif nécessite plusieurs modifications figurant sur la feuille de route. Les utilisateurs ont mis en œuvre avec succès des solutions de contournement pour utiliser CMake avec Rez sous Windows, mais l'objectif est de fournir une expérience transparente sur n'importe quelle plate-forme à l'avenir. Pour plus de détails, consultez ce numéro