Skip to content

(pixi + npm) au lieu de (conda + pip + npm)

propos

est-ce que conda c’est le top ?

conda existe depuis très longtemps; c’est un avantage car il est très utilisé et donc bien connu, et relativement stable également
toutefois son âge commence à se faire sentir, et le développeur exigeant peut avoir envie d’utiliser des outils plus modernes qui auraient moins d’inconvénients

quels inconvénients me direz-vous ? le principal est sans aucun doute la lenteur !
la création d’un environnement virtuel avec conda est une opération très lourde, du coup on prend facilement l’habitude .. de le faire le moins possible; or il se trouve qu’il existe à présent des alternatives beaucoup plus efficaces pour cela, et c’est le but ici

et pip alors ?

c’est un peu la même histoire avec pip, il existe aujourd’hui des alternatives qui rendent en gros le même service, mais qui sont beaucoup plus efficaces

remplacer conda par pixi

à quoi nous sert conda finalement ?
essentiellement pour ce qui nous concerne, on s’en sert pour créer des environnements virtuels dans lesquels on peut mettre, par exemple python-3.13, ou node-24

pixi est un outil écrit en Rust, très rapide et moderne, qui permet de gérer les versions d’outils et de langages de programmation. Il remplace avantageusement conda pour installer différentes versions des langages de développement les plus répandus.

la logique consiste à pouvoir dire par exemple

dans le dossier /un/dossier (et ses descendants), si je tape python ça veut dire la version 3.14 et si je tape node ça veut dire la version 24

pas tout à fait ça...

en pratique on n’obtient ce comportement qu’après avoir aussi installé direnv; mais bon c’est l’idée générale tout de même

et bien sûr on peut faire ça dans autant de dossiers qu’on veut
de cette façon, il suffit de changer de dossier pour changer de version !

pixi utilise uv pour remplacer pip

sous le capot, pixi utilise uv, un outil spécifique à Python; il s’agit d’un gestionnaire de librairies Python ultra-rapide, écrit également en Rust; il offre une alternative beaucoup plus efficace à pip tout en restant compatible avec l’écosystème Python existant

essentiellement uv va créer un environnement virtuel qui est associé, lui aussi, au dossier courant

pour les installer

pixi

on installe
  1. installer pixi
    Terminal window
    powershell -ExecutionPolicy Bypass -c "irm -useb https://pixi.sh/install.ps1 | iex"
on vérifie pixi (tous OS)

comme d’hab: n’oubliez pas de relancer un nouveau terminal

Terminal window
pixi --version

direnv

à quoi ça sert ?

un autre inconvénient avec conda, c’est la nécessité de faire explicitement le conda activate qui va bien; c’est un peu lourd, et on peut facilement oublier de le faire !

il existe une alternative, direnv, qui permet d’automatiser l’activation de l’environnement; ça demande un peu de setup initial, mais le retour sur investissement est rapide !

l’idée consiste à faire en sorte que l’activation soit déclenchée par un simple changement de dossier courant (un cd, quoi)

on installe direnv
  1. Terminal window
    # Windows
    winget install direnv.direnv
  2. configurer le shell pour qu’il utilise direnv
    Terminal window
    cat >> ~/.bashrc << 'EOF'
    eval "$(direnv hook bash)"
    EOF
on vérifie direnv (tous OS)

comme d’hab: n’oubliez pas de relancer un nouveau terminal

Terminal window
direnv --version

un exemple de projet avec pixi

sans direnv

Terminal window
mkdir monprojet
cd monprojet
# recommended: initialize pixi with conda-forge channel
pixi init --channel conda-forge
# install python-3.14 and node-24
pixi add python=3.14 nodejs=24
# add numpy as a Python requirement
pixi add numpy
# if you need to add a package with 'extras' quantifier
# you need to use this form - it's safer with quotes around
pixi add --pypi 'fastapi[standard]'
# add a node dependency - here lodash as an example
pixi add lodash
# see our requirements
pixi list --explicit
# now, without direnv, we have two ways to invoke the "right" python and node
# 1. via 'pixi run'
pixi run python --version
pixi run node --version
# 2. via 'pixi shell' to enter a subshell with the right versions
# the first line will apparently do nothing
# this is because it creates a subshell (a shell within the current shell)
pixi shell
python --version
node --version
# and when we exit this subshell we are back to the first one
exit

avec direnv

le début est le même, mais en configurant direnv on peut faire en sorte que l’activation des bonnes versions soit automatique à chaque fois qu’on entre dans le dossier du projet !

Terminal window
mkdir monprojet
cd monprojet
# recommended: initialize pixi with conda-forge channel
pixi init --channel conda-forge
# select python-3.14 and node-24
pixi add python=3.14 nodejs=24
# add numpy as a Python requirement
pixi add numpy
# if you need to add a package with 'extras' quantifier
# you need to use this form - it's safer with quotes around
pixi add --pypi 'fastapi[standard]'
# add a node dependency - here lodash as an example
pixi add lodash
# see our requirements
pixi list --explicit
# configure direnv
cat > .envrc << 'EOF'
watch_file pixi.lock
eval "$(pixi shell-hook)"
EOF
# Allow direnv to load this .envrc
direnv allow
# et là tout baigne
python --version
python -c "import numpy; print(numpy.__version__)"

le prompt

comme avec conda, il est crucial d’avoir un prompt qui indique l’environnement actif; si nécessaire

voyez ici la section sur le prompt starship

références

influences

voyez aussi ces différents outils qui ont certains comportements avec ceux-ci

  • uv qui est utilisé en sous-main par pixi pour la gestion des dépendances Python
  • npm pour l’idée d’installer les dépendances tout en les mémorisant dans package.json
  • venv qui est utilisé en sous-main par uv pour les environnements virtuels Python (et qui n’existait pas à l’époque de conda)