# Configuration d'un environnement de développement

Quelques indications pour développer avec ScoDoc 7.x, à adapter à vos goûts et outils.

# Machine virtuelle

Il est confortable de développer dans une VM (un container Docker ferait aussi bien l'affaire, mais Docker a été créé bien après ScoDoc ! Les utilisateurs étant dans des VM, on a l'avantage d'être dans les mêmes conditions qu'eux).

## Conseils pour VirtualBox
[VirtualBox](https://www.virtualbox.org/) est facile à installer sur Mac, Linux ou Windows. Créer une VM avec Debian 10, et suivre la [procédure habituelle d'installation de ScoDoc](GuideInstallDebianDix.md).

En général, vous préférez développer sur la machine hôte pour disposer de votre éditeur préféré. Mais vous exécutez ScoDoc dans la VM.

### Configuration réseau
  La VM a besoin d'accéder à Internet pour l'installation, et aussi pour les mises à jour et peut-être certains tests que vous voudrez lancer. L'accès à la VM depuis l'hôte doit être possible via un réseau privé interne (car vous ne serez pas toujours conencté à Internet, et ne souhaitez pas que l'on accède à votre serveur de test de l'extérieur).

Modifier la config réseau via l'UI graphique de VirtualBox, la VM étant éteinte.

 - `Adapter 1` : accès à la VM depuis l'hôte: réseau privé hôte vboxnet0

 - `Adapter 2` : accès à Internet depuis la VM, configurer un interface réseau NAT.

Dans le Debian, j'utilise `/etc/network/interfaces`

    # The loopback network interface
    auto lo
    iface lo inet loopback

    # The primary network interface
    allow-hotplug enp0s3
    iface enp0s3 inet dhcp

(le `enp0s3` désigne chez moi l'`Adapter 1`, mais c'est susceptible de changer. Normalement, l'installeur créé ce fichier )

Pour lancer l'interface externe , quand on a besoin d'accéder à Internet depuis la VM (en fait assez rarement):

    dhclient enp0s8

ici `enp0s8` correspond à l'`Adapter 2`. Si vous travaillez sur une machine fixe avec connexion permanente, vous pouvez dans Debian activer cette interface constamment (modifier `/etc/network/interfaces`).

### Noms des machines
Modifier le `/etc/hosts` (ou équivalent) de l'hôte, et y ajouter l'IP de votre VM, par exemple (adapter l'IP !):

    192.168.12.10 scodoc scodoc.dev.net


### Partage de fichiers
Pour éditer votre code au chaud sur votre hôte, il y a plein de solutions. L'une consiste à laisser le code dans la VM, mais de monter un répertoire (par exemple `/opt`) sur l'hôte, par exemple via `sshfs`.

Une autre solution (que j'utilise sur mon MacBook), est de laisser le source (clone git) sur l'hôte, et de partager ce répertoire avec la VM.

Dans VirtualBox / config. VM / Dossiers partagés, ajouter un partage. Par exemple, vous mettez vos sources sur l'hôte dans `~/src`, et dans la VM sur `/src`. 
Dans ScoDoc, `/opt/scodoc/Products/ScoDoc` est alors un lien symbolique vers votre `src/ScoDoc`. 

Attention, VirtualBox gère mal les droits/permissions du répertoire partagé. les utilisateurs linux (dans la VM) doit être dans le groupe `vboxsf`:

    usermod -a -G vboxsf root

Typiquement, les fichiers sources vus de la VM ont les droits

    -rwxrwx--- 1 root vboxsf 129579 Feb  1 15:04 ZNotes.py

alors que le même fichier sera vu de l'hôte 

    -rw-r--r--  1 viennet  staff   127K Feb  1 15:04 ../ScoDoc/ZNotes.py

Compte-tenu de ces différences, je préfères utiliser git sur l'hôte.

Il arrive (?) que Virtual Box change les droits unix sur les fichiers partagés. Dans ce cas, j'utilise, sur l'hôte

    git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply

# Interaction avec ScoDoc 7

ScoDoc 7 utilise Zope, et ce n'est pas un environnement commode pour débugguer.

Pour avoir un terminal interactif permettant de jouer avec ScoDoc, lancer

    cd /opt/scodoc/Product/ScoDoc

    scotests/scointeractive.sh DEPT

où `DEPT` est un département existant.

Ce script lance ScoDoc et charge `debug.py`.

Vous pouvez lancer un script avant d'entrer en mode interactif, par exemple

         scotests/scointeractive.sh -r DEPT scotests/test_capitalisation.py

(voir plus d'exemples dans le répertoire `scotests`).

## problèmes de verrous
Zope créé un verrou pour ne jamais avoir deux process accédant à sa base de données objet à la fois. Celà empêche de lancer les scripts intercatif si un serveur ScoDoc est lancé, ce qui est ennuyeux quand on debugue. On peut, sur une machine de développement seulement, contourner cela en hackant le code du serveur:

Éditer
    /opt/zope213/lib/python2.7/site-packages/zc.lockfile-1.0.2-py2.7.egg/zc/lockfile/__init__.py

Ligne 56, méthode `_lock_file`
ajouter juste

     return






