MTES-MCT / parcours-r

Valise pédagogique pour la formation à R
https://mtes-mct.github.io/parcours-r/
25 stars 14 forks source link

Utilisation de GNU Make #9

Closed RLesur closed 5 years ago

RLesur commented 5 years ago

Alors, j'ai fait un makefile relativement générique pour un projet bookdown :

OUTDIR=_book
SOURCE=$(wildcard *.Rmd)
PDF_FILE=$(shell Rscript -e "cat(paste0(bookdown:::book_filename(), '.pdf'))")
PDF_FILE:=$(addprefix $(OUTDIR),$(addprefix /,$(PDF_FILE)))

.PHONY: all gitbook pdf clean

all: gitbook pdf

gitbook: $(OUTDIR) 

pdf: $(PDF_FILE)

$(OUTDIR): $(SOURCE)
    Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::gitbook', output_dir = '$(OUTDIR)')"

$(PDF_FILE): $(SOURCE)
    Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::pdf_book', output_dir = '$(OUTDIR)', output_options = list(latex_engine = 'xelatex'))"

clean:
    rm -rf $(OUTDIR)

Il est réutilisable dans le cadre de n'importe quel projet bookdown et s'utilise comme suit (dans le terminal) :

# générer le gitbook :
make gitbook

# générer le pdf :
make pdf

# générer les deux :
make all

# purger le répertoire _book :
make clean

L'intérêt de l'utilisation de make est de ne reconstruire les gitbooks et pdf que si un fichier Rmd a une date de sauvegarde ultérieure aux fichiers générés. Si les fichiers Rmd n'ont pas changé, aucune génération n'est effectuée.

Au niveau de la racine du repo, j'ai fait un Makefile "maître", qui lance en parallèle le make gitbook de chaque module. Seuls les modules pour lesquels au moins un des fichiers Rmd a changé seront reconstruits :

OUTDIR=_book
MODULES=$(sort $(notdir $(wildcard Supports_formations/*)))

.PHONY: all $(MODULES)

all: $(MODULES)

$(MODULES):
    $(MAKE) gitbook -C $(addprefix Supports_formations/,$@) OUTDIR=$(OUTDIR)

Si on se trouve à la racine de parcours-r, les commandes suivantes peuvent être utilisées dans le terminal :

# actualiser le module 3 :
make m3_stats_desc

# générer les trois premiers modules :
make all MODULES=m1_socle m2_preparation_donnees m3_stats_desc

# générer tous les modules y compris mx_travail_collaboratif :
make all

Dans le contexte de Travis, cela impose de conserver les fichiers générés entre chaque build (sinon make reconstruira systématiquement les gitbooks et l'apport sera nul). Pour cela, la solution utilisée dans bookdown est de mettre les fichiers en cache : https://github.com/rstudio/bookdown/blob/a48ead0ba601779c6443203ef02dcac959e5c3f6/.travis.yml#L4-L8

Je ne l'ai jamais tenté jusqu'ici. Logiquement, le premier build sera long car il n'y aura pas de cache. Et les suivants devraient être beaucoup plus rapides (si tout fonctionne comme prévu, mais avec Travis, on ne réussit jamais du 1er coup :smile: )

RLesur commented 5 years ago

Bon, là j'avoue que je ne comprends pas ce qu'il se passe ici https://travis-ci.org/MTES-MCT/parcours-r/builds/575115230#L1215-L1222

edit: résolu par https://github.com/MTES-MCT/parcours-r/pull/9/commits/9dfa0a9d4dbd776a9a192f32097b0f725697b78a

RLesur commented 5 years ago

Bon, j'ai bien galéré et verdict : ça ne marche pas comme je pensais. Le cache de Travis ne permet pas à make de zapper les gitbooks qui n'ont pas changé. Je continuerai de regarder s'il y a une solution. Pour l'instant, je ferme cette PR.

RLesur commented 5 years ago

Après avoir lu ça, https://docs.travis-ci.com/user/caching/ Je réalise que ça ne pouvait pas fonctionner au travers d'une PR. Pour voir si ça fonctionne réellement, il faudrait merger cette PR et relancer un build pour voir si le cache est utilisé. Mais si vous trouvez que ça met trop le bazar dans votre projet, je comprendrais que vous ne préféreriez pas merger.

RLesur commented 5 years ago

Bon, ben ça a y est j'ai compris que l'approche avec make était infructueuse. En fait, j'avais fait l'hypothèse implicite que git conservait la date de modification des fichiers et évidemment, cette hypothèse est fausse. Elle a précisément été prise pour qu'il y ait un peu plus souvent de make de faits que pas assez. C'est une approche défensive.

Bon, ben au moins j'aurai appris quelque chose avec ça. Je ferme la PR.

Mais pour autant, je ne m'avoue pas vaincu, car j'ai une autre idée pour limiter le temps de build :smile:

RLesur commented 5 years ago

Bon, ben j'ai un truc qui marche bien, mon bac à sable est ici : https://github.com/RLesur/mkbkdwn

L'approche est la suivante :

Le script principal est là : https://github.com/RLesur/mkbkdwn/blob/master/script.R

Si ça vous intéresse, je peux vous faire une PR sur cette base.