Une explication montrant l'évolution de la stack JS depuis 2010 et pourquoi autant d'outils ont fait leur apparition depuis.
Un plugin Maven pour exécuter les tests unitaires à chaque changement et recompiler les classes aussi. Cela permet à Maven de rattraper un peu Gradle sur ce sujet et de proposer ce qu'il est possible de faire en JS.
Bon, je dois refaire du Webpack pour mettre à jour le build d'un tool de la boite. Comme j'ai eu beaucoup de peine à retrouver comment et quoi faire, voici un bref résumé des trucs et astuces à connaître sur Webpack.
Comment concaténer des fichiers JS inter-dépendants ?
Principe : mon fichier JS (Main.js) importe d'autres fichiers JS (cf. le mot-clef require de TypeScript / ES6). Et ces fichiers JS importent également d'autres fichiers. L'idée ici est d'avoir un Webpack qui parcours le graphe des dépendances en analysant le code afin de produire un et un seul fichier JS qui n'inclut que ce dont mon application se sert.
Contenu du fichier webpack.conf.js :
module.exports = {
entry: {
Car : './src/Main.js' // Charge ce fichier ainsi que tous ceux dont il dépend via le mot-clef 'require'.
},
output: {
path: './target',
filename: 'merged-file.js'
}
};
Comment créer un bundle de fichiers JS qui n'ont aucune dépendance entre-eux ?
Principe : j'ai plein de libs écrites en JavaScript avec mes petites mimines (ou pas), ces librairies n'ont aucune dépendance entre-elles, cependant je souhaiterais les concaténer dans un gros bundle de sorte à minimiser le nombre de requêtes réseau.
Contenu du fichier webpack.conf.js :
module.exports = {
entry: [
'./src/Car.js', // La liste des fichiers à concaténer
'./src/Vehicule.js'
],
output: {
path: './target',
filename: 'merged-file.js'
}
};
Comment créer plusieurs bundles de fichiers JS qui n'ont aucune dépendance entre-eux ?
Principe : je reprends les fichiers JS du point précédent à ceci près que je souhaite créer plusieurs bundles, un pour chaque types de véhicules par exemple.
Contenu du fichier webpack.conf.js :
module.exports = {
entry: {
four-wheels : [
'./src/Car.js',
'./src/Vehicule.js'
],
two-wheels : [
'./src/Bike.js',
'./src/Vehicule.js'
]
},
output: {
path: './target',
filename: '[name].bundle.js',
chunkFilename : '[id].bundle.js'
}
};
Comment minifier mes bundles JS ?
Principe : mes fichiers JS sont gros et je souhaite supprimer le maximum d'espace, les commentaires, réduire le nom des fonctions, variables & Co de sorte à fournir le plus petit fichier possible.
Contenu du fichier webpack.conf.js :
var webpack = require("webpack");
module.exports = {
entry: [
'./src/Car.js',
'./src/Vehicule.js'
],
output: {
path: './target',
filename: 'app.minified.js'
},
plugins: [
new webpack.optimize.UglifyJsPlugin({minimize: true})
]
};
Un tuto de build fournit par LinuxFromScratch
Tout est dans le titre. L'idée est d'arriver aux choses suivantes :
1) Automatiser le build de OpenJDK 1.8 pour architecture linux x64
2) Arriver à produire de manière automatique trois JVM compactées à partir des profiles 1, 2 et 3 à partir du build d'OpenJDK 1.8 fournit ci-dessus.
Ce répo GitHub montre comment faire.
Tout est dans le titre
Pourquoi ce tuto ?
Grosso-modo je dois apprendre comment reproduire un build Maven mais en JS avec les outils JS qui vont bien ; et qui soient plus ou moins les standards de facto du moment (i.e en ce début 2017).
Définitions :
À quoi sert quel outil dans ce gloubi-boulga d'outils tous plus hypes les uns que les autres ?
NodeJS :
C'est une machine virtuelle qui permet de faire tourner du JavaScript côté serveur.
NPM :
C'est le gestionnaire de paquets permettant de récupérer les dépendances transitives de vos projets (façon Maven). Certains disent que NPM signifie Node Package Manager mais l'auteur atteste que non.
Yarn :
NPM c'est top, mais ça possède trois inconvénients :
- La ligne de commande pu des fesses.
- NPM ne sait pas mettre les paquets dans un répo local (comme le fait a contrario Maven), donc NPM passe son temps à re-télécharger les dépendances qu'il a déjà téléchargé pour le projet précédent.
- NPM ne gère pas le build concurrent (il n'est pas multi-threadé) donc le build rame (enfin tout est relatif #CompilationC++).
Yarn est un outils qui réponds à ces trois problématiques avec un chat tout mimi en guise de logo.
TypeScript :
C'est à la fois un langage mais également un compilateur éponyme. En gros, les mecs de Microchiotte se sont dits que JavaScript ça ne sentait pas bon des fesses (comme la ligne de commande de NPM) et qu'il valait mieux coder avec de vraies classes, des vrais namespaces, de vraies visibilités (public, private, etc) et une fois que tout ceci était correctement codé en TypeScript, ont transpile ce code en du JavaScript ; autrement dit on convertir le code du TypeScript dans une syntaxe cohérente et fortement typée, vers du JS (incohérent et faiblement typé) ; et comme cela plus besoin de se prendre la tête à connaître tous les hacks de ce langage merdique (une référence ici sur la merdicitude de JS et une autre là sur la retard community - ces deux articles sont pour toi Lenny).
Jasmine :
C'est un framework permettant d'écrire des tests en JavaScript. Ces derniers peuvent être au niveau unitaire (façon JUnit) ou fonctionnel / intégration (façon Cucumber). En général Jasmine est considéré comme faisant partie des framework destinés au BDD (mais bon, je ne suis pas d'accord).
Karma :
Un outil permettant de charger une suite de tests écrits en Jasmine ou en tout autre chose. Le concurrent le plus sérieux est MochaJS qui est une sorte de medley entre Karma et Jasmine, mais comme je n'ai pas encore eu le temps de l'étudier,que Karma à l'avantage d'être soutenu par les développeurs Google qui bossent sur Angular 2 et que j'ai déjà utilisé Jasmine par le passé... Bah Karma & Jasmine.
PhantomJS :
NodeJS permet d'exécuter du JavaScript côté serveur, et bien PhantomJS est un navigateur sans interface graphique permettant d'exécuter du JavaScript dans une console afin de le tester (ndr. en s'appuyant sur Jasmine et Karma). Vous vous doutez bien qu'un navigateur sans IHM est un navigateur ultra-rapide pour faire tourner du JS (sous-entendu parfait pour avoir des phases de run de TU rapides durant nos builds).
Webpack :
Webpack peut quasiment tout faire à l'aide de ses plugins mais l'idée ici est de s'en servir pour trois choses :
- Packager l'ensemble du JS dans un seul fichier qui soit unique.
- Minifier au taquet ce fichier packagé.
- Ne pas inclure dans le package minifié le code mort, c'est-à-dire les classes qui ne sont jamais chargées directement ou transitivement par la classe Main.
Et donc dans tout ça ? Et bien dans tout cela vous aurez donc un build JS qui va chercher les dépendances tout seul, qui respecte le cycle de vie de Maven, qui assure la séparation du code à livrer (les sources) du code à ne pas livrer (les plugins du build et le code des tests), qui centralise la production des binaires en un seul endroit et qui soit capable de releaser votre build (i.e fabriquer des tags et incrémenter le numéro de version). Pas mal hein ?
La suite des posts à lire figure ici (en cours de complétion) :
Je précise ici que je cherche à reproduire l'architecture de dossier et le life-cycle de Maven mais pour un projet NodeJS / Aurelia. Nous allons donc avoir ce type de dossiers :
. (root folder) # La racine du répo
|__ node_modules/ # Le répertoire des éléments téléchargés par NPM
|
|__ src/ # Le répertoire contenant les sources
| |__ main/ # Les sources qui seront livrées
| | |__ js/
| |
| |__ test/ # Les sources qui ne seront jamais livrées (les tests)
| |__ js/
|
|__ target/ # Le répertoire contenant les éléments générés lors de build
|
|_ karma.conf.js # Le fichier de configuration de Karma (le générateur de suite de tests)
|_ package.js # Le fichier de configuration de Yarn (le build manager)
|_ tsconfig.json # Le fichier de configuration de TypeScript (le transpilateur)
|_ webpack.config.js # Le fichier de configuration de Webpack (le packager / minifier)
- Comment installer et configurer NodeJS & NPM
- Comment installer et configurer le transpilateur TypeScript ?
C'est partiiii #JoueLaCommeBarnabé
Fabriquer son propre set d'outils pour fabriquer une application JavaScript React-JS.
Comment builder sa version de Chromium embarquée pour du Java.
Le site du projet : https://bitbucket.org/chromiumembedded/java-cef
Les pré-requis à avoir pour le build (version de GCC, la GLIBC toussa) : https://bitbucket.org/chromiumembedded/java-cef/wiki/BranchesAndBuilding
Un tuto de build sur Stackoverflow : http://stackoverflow.com/questions/21192279/how-to-integrate-chromium-embedded-framework-cef-with-java
Avec un copier-coller du tuto pour exécuter un build en C/C++ de Chromium :
Yes!
It took me a short time to initialize a JCEF project. Following is steps i did:
Please note that i use Maven Project and JVM 64bit
Download JCEF and extract it JCEF
Declare Environment Variable to point to ${EXTRACT_DIR}/bin/lib/win64
Install following files in local repository: ${EXTRACT_DIR}/bin/{gluegen-rt.jar,
gluegen-rt-natives-windows-amd64.jar, jogl-all.jar,
jogl-all-natives-windows-amd64.jar, jcef.jar}.
Example: mvn install:install-file -Dfile=gluegen-rt.jar -DgroupId=org.jcef -DartifactId=gluegen -Dversion=1.0 -Dpackaging=jar
Create a maven project and declare installed artifacts in pom.xml
Copy sample: ${EXTRACT_DIR}/bin/tests/simple/MainFrame.java to your project and try it
Je ne suis pas une grande fana de Gradle (je n'aime pas avoir du code dans ma configuration de build, parce que cela transforme ma configuration tout bête et déclarative, en un script avec du code potentiellement très compliqué dedans).
Apache Buildr reprend les bonnes pratiques de Maven c'est-à-dire :
- Séparer la partie du build qui exécute quelque chose (les plugins)
- De la partie qui dit quoi exécuter et quand (le pom.xml)
L'autre bénéfice, c'est que cela vous pousse à simplifier votre processus de build plutôt que de couvrir votre dette technique avec un script Groovy/Gradle par-dessus : on ne résout pas un problème d'organisation avec du code, il faut être soit débile (cf. écrits de Deleuze) soit un gros nerd à moitié taré pour penser ça car ce faisant on ne remonte pas à la root cause du problème. #MonPointDeVue #SiTuTeSensViséTesKunKon.
Gradle promeut cette croyance de noob qui dit que fusionner la préoccupation de workflow de build avec la préoccupation d'exécution (c'est-à-dire avec du code, avec des if-then-else, while-for, throw-catch...) c'est jeun's, cool, rebelle et vachement-plus-rapide-nempêche. Or si vous m'avez suivi jusque-là, vous comprenez en quoi il est essentiel de séparer ces préoccupations !
C'est pour cela que Maven force les gens à développer des plugins, pour que ce travers de tout mélanger par fainéantise ne vous gagne pas. Une dette technique impardonnable en Java depuis 2010, c'est bien celle qui se situe au niveau du build, alors en 2016, c'est juste une honte.
Copier-coller les lignes suivantes à la fin de votre fichier .bashrc pour colorier les mots clefs (info, warning, error) et les résultats de l'exécution de Maven.
ADD MAVEN COLORATION :
Formatting constants
export BOLD=tput bold
export UNDERLINE_ON=tput smul
export UNDERLINE_OFF=tput rmul
export TEXT_BLACK=tput setaf 0
export TEXT_RED=tput setaf 1
export TEXT_GREEN=tput setaf 2
export TEXT_YELLOW=tput setaf 3
export TEXT_BLUE=tput setaf 4
export TEXT_MAGENTA=tput setaf 5
export TEXT_CYAN=tput setaf 6
export TEXT_WHITE=tput setaf 7
export BACKGROUND_BLACK=tput setab 0
export BACKGROUND_RED=tput setab 1
export BACKGROUND_GREEN=tput setab 2
export BACKGROUND_YELLOW=tput setab 3
export BACKGROUND_BLUE=tput setab 4
export BACKGROUND_MAGENTA=tput setab 5
export BACKGROUND_CYAN=tput setab 6
export BACKGROUND_WHITE=tput setab 7
export RESET_FORMATTING=tput sgr0
Wrapper function for Maven's mvn command.
mvn_color() {
Filter mvn output using sed
mvn $@ | sed -e "s/\(\[INFO\]\)\(\ BUILD\ SUCCESS\)/${TEXT_BLUE}${BOLD}\1${TEXT_GREEN}\2${RESET_FORMATTING}/g" \
-e "s/\(\[INFO\]\)\(.*\)/${TEXT_BLUE}${BOLD}\1${TEXT_WHITE}\2/g" \
-e "s/\(\[WARNING\]\)\(.*\)/${BOLD}${TEXT_YELLOW}\1${TEXT_WHITE}\2${RESET_FORMATTING}/g" \
-e "s/\(\[ERROR\]\)\(.*\)/${BOLD}${TEXT_RED}\1${TEXT_WHITE}\2${RESET_FORMATTING}/g" \
-e "s/Tests run: \([^,]*\), Failures: \([^,]*\), Errors: \([^,]*\), Skipped: \([^,]*\)/${BOLD}${TEXT_GREEN}Tests run: \1${RESET_FORMATTING}, Failures: ${BOLD}${TEXT_RED}\2${RESET_FORMATTING}, Errors: ${BOLD}${TEXT_RED}\3${RESET_FORMATTING}, Skipped: ${BOLD}${TEXT_YELLOW}\4${RESET_FORMATTING}/g"
Make sure formatting is reset
echo -ne ${RESET_FORMATTING}
}
Override the mvn command with the colorized one.
alias mvn="mvn_color"
Comment booster un peu les temps de build de notre Maven
Si vous configurer Surefire avec certaines options, il ne vous sera plus possible de produire des rapports avec JaCoCo (le fichier jacoco.exec dédié à l'agent JaCoCo ne sera plus produit).
Ce poste explique comment résoudre le problème en remplaçant les configurations de Surefire
et