Je suis en train de construire une app de barre de menus pour macOS. Elle fonctionne parfaitement sur mon Mac. Maintenant je dois savoir si elle fonctionne sur un macOS propre : sans mes configurations, sans mes autorisations, sans mes données. Un utilisateur qui l’installe à partir de zéro.

Comment on teste ça ? Il faut une machine virtuelle.

“Facile”, me suis-je dit. “J’ai UTM installé. J’ouvre l’assistant, je crée une VM macOS, et c’est parti.”

Ça n’allait pas être si facile.

UTM : joli mais indomptable

UTM est une application formidable. Interface soignée, support pour macOS comme invité sur Apple Silicon, plein écran, presse-papiers partagé. Pour un usage manuel, c’est génial.

Le problème arrive quand on essaie de l’automatiser.

UTM a un CLI appelé utmctl. Il peut lister les VMs, les démarrer, les arrêter, les cloner. Ce qu’il ne peut pas faire, c’est créer une VM. Et pour un invité macOS, même l’AppleScript d’UTM ne permet pas de les créer — le champ du système d’exploitation est hardcodé sur Linux.

En clair : si vous voulez une VM macOS dans UTM, vous la créez manuellement par l’assistant. À chaque fois. Avec ses clics, son téléchargement de l’IPSW (l’image d’installation de macOS pour Apple Silicon — l’équivalent d’un ISO classique, mais empaqueté par Apple), son attente d’installation.

Pour un dev qui doit créer et détruire des VMs dans le cadre d’un flux de QA, c’est vraiment pénible.

Tart : VMs macOS for the rest of us

Tart c’est ce qui arrive quand quelqu’un conçoit un outil de virtualisation en pensant aux développeurs plutôt qu’aux utilisateurs finaux.

Il utilise exactement le même Virtualization.framework d’Apple qu’UTM. Même technologie, mêmes performances, même vitesse native. La différence c’est l’interface : Tart est CLI-first.

1
brew install cirruslabs/cli/tart

Et voilà. Pas de GUI de configuration, pas d’assistant. Un binaire dans votre PATH.

Une commande pour les gouverner tous

Créer une VM macOS avec la dernière version disponible :

1
tart create ma-vm --from-ipsw latest

C’est tout. latest dit à Tart “donne-moi la dernière version de macOS que ce Mac supporte”. Tart consulte l’API d’Apple, télécharge l’IPSW (~15 GB — oui, macOS ça pèse), crée le disque virtuel, installe le système d’exploitation et vous laisse la VM prête à démarrer. Allez prendre un café, parce que ça prend du temps — mais vous n’avez rien à toucher.

Démarrer la VM :

1
tart run ma-vm

Une fenêtre s’ouvre avec le bureau de macOS. Souris, clavier, écran. Exactement comme UTM, mais lancé depuis un tart run.

Dossier partagé : le détail qui fait la différence

C’est là que Tart m’a conquis. J’ai besoin de copier mon app depuis le Mac hôte vers la VM. Dans UTM il faut configurer VirtioFS manuellement, le monter depuis le terminal de l’invité, et prier pour que le config.plist ne se corrompe pas (il y a des bugs connus).

Dans Tart :

1
tart run ma-vm --dir=shared:~/code/tokamak/build

Dans la VM, le dossier apparaît dans /Volumes/My Shared Files/shared. Vous glissez l’app vers /Applications et c’est bon. Sans rien configurer, sans rien monter.

Mon flux de QA réel

Voici ce que je fais pour tester mon app sur un macOS propre :

1
2
3
4
5
6
7
8
# Créer la VM (seulement la première fois)
tart create tokamak-qa --from-ipsw latest --disk-size 50

# Compiler l'app
cd ~/code/tokamak && make build

# Démarrer la VM avec le build partagé
tart run tokamak-qa --dir=build:~/code/tokamak/build/Build/Products/Debug

Dans la VM :

  1. J’ouvre /Volumes/My Shared Files/build/
  2. Je glisse Tokamak.app vers /Applications/
  3. J’exécute et vérifie : login, autorisations, sandbox, barre de menus, notifications

Si j’ai besoin de repartir de zéro (tester l’expérience de premier lancement) :

1
2
tart delete tokamak-qa
tart create tokamak-qa --from-ipsw latest --disk-size 50

Détruire et recréer. Sans questions, sans confirmations, sans assistant.

Configurer les ressources

Par défaut Tart assigne des ressources raisonnables, mais vous pouvez les ajuster :

1
2
3
4
5
# 4 cœurs, 8 GB RAM
tart set ma-vm --cpu 4 --memory 8192

# Redimensionner le disque
tart set ma-vm --disk-size 80

Ce que Tart n’a pas (et pourquoi ce n’est pas grave)

Il n’a pas d’interface de gestion avec des vignettes de chaque VM. Il n’a pas de drag and drop pour les ISOs. Il n’a pas de joli bouton “Nouvelle VM”.

Si ce dont vous avez besoin c’est une app de bureau pour gérer des VMs, utilisez UTM. C’est fantastique pour ça.

Mais si ce dont vous avez besoin c’est tester votre app sur un macOS propre, détruire la VM, la recréer, partager un dossier, et faire tout ça depuis un script ou un Makefile… UTM ne peut pas. Tart si.

La recette complète

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Installer
brew install cirruslabs/cli/tart

# Créer VM macOS (télécharge ~15 GB, prend ~20 min)
tart create test-vm --from-ipsw latest --disk-size 50

# Démarrer avec dossier partagé
tart run test-vm --dir=app:~/mon-projet/build

# Autres commandes utiles
tart list                      # VMs existantes
tart stop test-vm              # Arrêter
tart clone test-vm copie-vm    # Cloner (rapide)
tart delete test-vm            # Supprimer
tart ip test-vm                # IP pour SSH

La documentation tient dans un README. La courbe d’apprentissage tient dans un café. Si vous développez pour macOS et n’utilisez pas Tart, vous vous compliquez la vie inutilement.