4.2 Deploy
4.2.2 NPM
NPM, abbreviazione di Node Package Manager, `e appunto un gestore di pacchetti per Javascript ed `e predefinito per l’ecosistema Node.js. I pacchetti disponibili sono ospitati su un repository interno, che `e anche disponibile, tramite comandi shell, ad upload di progetti esterni. Includere queste operazioni nella build di un progetto, garantisce una migliore gestione e ripetibilit`a delle stesse, ci`o `e possibi-le attraverso il plugin ”com.moowork.node”, che permette di scaricare Node.js a livello progettuale ed eseguire script js al suo interno.
Listato 4.8: Plugin ”com.moowork.node”
p l u g i n s {
id (" com . m o o w o r k . node ") v e r s i o n " 1 . 3 . 1 "
}
Il comando per pubblicare su npm `e npm publishche accetta la cartella con-tenente il file package.json che rappresenta il metadata che contiene le dipendenze e la descrizione generale dello stesso in formato JSON. I comandi shell sono sup-portati attraverso i task di tipo ”npmTask”, il listato 4.9, ne mostra un esempio di creazione.
Listato 4.9: Task per pubblicare un package su npm t a s k s . register < NpmTask >(" p u b b l i s h ") {
s e t W o r k i n g D i r ( b u i l d D i r . t o P a t h () . t o S t r i n g () + " / js / p a c k a g e s / p r o j e c t ")
s e t A r g s ( s e t O f (" p u b l i s h ") ) }
Per eseguire il task e pubblicare i sorgenti online con successo, `e necessario prima per`o possedere un account sulla piattaforma npm ed effettuare il login da shell con il comando npm adduser.
4.2. DEPLOY 53 Le operazioni rappresentate possono essere racchiuse in unico tipo di task, grazie ad un plugin diverso, ”com.liferay.gradle.plugins.node”, che mette a disposizione diversi task relativi ad npm, tra cui PublishNodeModuleTask, che permette sia di accedere ad npm che pubblicare sul registro un pacchetto. Si presenta pi`u completo rispetto al task del listato 4.9, in quanto consente la generazione del metadata package.json, e la sua configurazione.
In conclusione, queste due fasi sono fondamentali e devono essere susseguite e non indipendenti, JS rimane ancora una parte critica e non totalmente supportata da Kotlin, tuttavia con gli ultimi aggiornamenti (Kotlin 1.3.40) le configurazioni manuali sono ridotte. Nel prossimo capitolo, le notazioni e gli argomenti espressi verranno applicati a due progetti multipiattaforma.
Capitolo 5
Caso di studio: Kt-math
La documentazione e le notazioni espresse nei capitoli precedenti sono finalizzate alla costruzione di diversi aspetti del processo di sviluppo di una libreria multi-piattaforma, denominata kt-math. Il progetto in questione consiste in un porting delle classi BigInteger e BigDecimal appartenenti a java.math in Kotlin, in mo-do da rendere il progetto multipiattaforma ed estendere le funzionalit`a di queste classi ad altri ambienti sviluppativi. Queste classi superano i limiti tecnici di alcu-ne variabili primitive, permettendo di gestire a livello di programmazioalcu-ne numeri abbastanza grandi anche per long o int, o di usare numeri con una precisione de-cimale maggiore di float e double. Le applicazioni di questa libreria vanno dal campo finanziario, nella gestione delle valute e dei loro decimali, a quello della crittografia, nella gestione di numeri estremamente grandi.
Il contributo personale si `e focalizzato sull’integrazione delle fase di testing e di deploy in ambiente Javascript, che come si `e denotato dal capitolo precedente ne-cessita di configurazioni aggiuntive per integrarsi con Gradle e Kotin.
Questo porting eseguito dal dott. Giovanni Ciatto mancava delle configurazioni aggiuntive per i test e i deploy nell’ecosistema JS, il mio contributo `e iniziato pri-ma dell’update 1.3.40 di Koltin che ha apportato diversi miglioramenti in questo campo, quindi verranno mostrate due configurazioni diverse, pre e post update.
Dal capitolo precedente, `e emersa l’incompletezza della libreria kotlin ”js-test” che da sola non riesce a garantire l’esecuzione dei test in Javascript ma necessita di
55
un framework esterno per completare le funzioni di asserzione, per questo `e fon-damentale aggiungere alle dipendenze del progetto quello opportuno. La maggior parte dei framework viene distribuito attraverso NPM, per questo il primo passo
`e stato aggiungere un plugin che includesse la sua logica e permettesse di usu-fruire l’ambiente node.js, la scelta iniziale `e ricaduta su ”com.moowork.node”. La configurazione, dopo aver aggiunto questo plugin, passa per la creazione di diversi task, il primo nominato ”popoulateNodeModules” permette per semplicit`a nelle operazioni successive di copiare tutte i moduli e le dipendenze del progetto per Javascript nella cartella di build, in questo modo si potr`a accedere al framework dopo averlo scaricato.
Listato 5.1: Filtra e copia tutti i file js contenuti nelle dipendenze e usati durante la compilazione del target JS nella cartella node modules contenuta nella folder build
57 c o m p i l e T e s t K o t l i n J s ") )
}
Una volta predisposto questo metodo, `e fondamentale scaricare il framework, in questo caso `e stato adoperato Jest, tuttavia `e facile cambiarlo con un altro in quanto a livello funzionale il risultato rimane pressoch´e identico.
Listato 5.2: Jest pu`o essere cambiato con Mocha, Karma, Jasmine o Tape t a s k s . create < NpmTask > (" i n s t a l l J e s t ") {
s e t A r g s ( s e t O f (" i n s t a l l ", " jest ") ) }
Una volta installato, il plugin ”com.moowork.node” mette a disposizione un ”Npm-Task” utile per eseguire lo script js di Jest, questo `e contenuto nella cartella ”node
modules” popolata con il task del lisitato 5.1.
Listato 5.3: Lo script accetta come argomento i sorgenti js del test t a s k s . create < NodeTask > (" r u n J e s t ") {
Infine impostata la dipendenza tra il task test e runJest, in modo da non escludere i test in Javascript.
L’aggiornamento 1.3.40 di Kotin ha portato con s´e una maggiore integrazione dell’ambiente JS in Kotlin, in particolare dei test e del ambiente esecutivo nodejs, questo si traduce in minor codice di configurazione.
Listato 5.4: L’ambiente esecutivo `e il browser ma poteva essere adoperato anche
Questa nuova configurazione, sicuramente pi`u sintetica, predilige l’uso di Karma in quanto questo framework `e gi`a presente insieme a Mocha nel dominio appli-cativo del DSL, a differenza degli altri strumenti, inoltre rende obsoleto il plugin
”com.moowork.node”. Questo `e stato sostituito con il plugin ”com.liferay.node”, che non `e stato adoperato nella fase di testing ma bensi durante la pubblicazione su NPM della libreria in JS.
Listato 5.5: I dati di accesso ad NPM non sono stati dichiarati nella build t a s k s . register < P u b l i s h N o d e M o d u l e T a s k >(" p u b l i s h N p m M o d u l e "
59 s e t P r o p e r t y (" m o d u l e D e s c r i p t i o n ", " P u b b l i s h C o m p i l e d
M o d u l e to n p m j s . com , pass u s e r n a m e and p a s s w o r d "
+
" by a r g u m e n t s or set them in g r a d l e . p r o p e r t i e s in G R A D L E _ U S E R _ H O M E ") s e t P r o p e r t y (" m o d u l e N a m e ", " kt - math ")
s e t P r o p e r t y (" m o d u l e K e y w o r d s ", l i s t O f (" kt - math ", "
math ", " b i g i n t e g e r ", " b i g d e c i m a l ", " d e c i m a l ", "
i n t e g e r ") )
s e t P r o p e r t y (" n p m E m a i l A d d r e s s ", n p m E m a i l ) s e t P r o p e r t y (" n p m U s e r N a m e ", n p m U s e r n a m e ) s e t P r o p e r t y (" n p m P a s s w o r d ", n p m P a s s w o r d )
s e t P r o p e r t y (" o v e r r i d d e n P a c k a g e J s o n K e y s ", s e t O f (" name
") ) }
Le variabili d’accesso a NPM, sono state dichiarate nel file gradle.properties conte-nuto nella cartella d’installazione ”.gradle”, ci`o `e stato necessario per non esporre questi dati privati a Git e quindi a terzi. In conclusione, Kotlin e Gradle si sono rilevati degli strumenti in continuo aggiornamento, fornendo soprattutto Kotlin, attraverso i suoi plugin, delle configurazioni base sempre pi`u performante e com-plete, minimizzando non soltanto le configurazioni del programmatore ma anche i possibili errori e i tempi di produzione.
Capitolo 6 Conclusioni
L’obbiettivo centrale di questa tesi non era soltanto indagare lo stato d’arte del-la tecnologia nel campo delle applicazioni multipiattaforma ma anche garantire un ruolo guida nella costruzione di un progetto del genere. Nel secondo capitolo (2), `e stata impostata la impalcatura concettuale di un sistema multipiattaforma, mostrando gli strumenti Gradle e Kotlin. Il primo si `e rilevato un sistema gi`a navigato nella gestione dello sviluppo del codice, ed `e stato fondamentale nella co-struzione di un progetto multipiattaforma visto la sua natura estendibile. Infatti, le funzionalit`a espresse da questo strumento sono in continua crescita attraverso il continuo sviluppo di plugin, che permettono non soltanto di gestire il codice in mo-do diverso ma di cambiare profondamente l’organizzazione e la struttura interna di un progetto, come in questo caso con il plugin ”kotlin-multipiattaforma”. Kotlin, che si `e mostrato estremamente flessibile, `e un linguaggio in grande crescita visti i continui aggiornamenti, e sicuramente `e una valida alternativa se non il futuro di molti linguaggi di programmazione nell’ambito delle applicazioni multipiattaforma e non solo. La potenzialit`a espresse nel setup di un applicazione multipiattafor-ma come mostrato nel terzo capitolo, sono molteplici e non riguardano soltanto il livello tecnico ma anche operativo di un ipotetico team di sviluppatori, infat-ti, scrivere in Kotlin vuol dire disinteressarsi della piattaforma di rilascio, e dare maggiore importanza alla logica di base. Questo approccio si traduce in una mag-giore coesione del team, che non si deve diversificare necessariamente per ogni
61
piattaforma. Infine, scrivere un applicativo in Kotlin, oggi si dimostra anche un investimento per il futuro, infatti non `e importante capire quale sar`a la piattafor-ma dominante del mercato futuro, perch´e questo linguaggio potr`a supportarla con pochi accorgimenti, indipendentemente che sia il Web, Android o iOS.
Bibliografia
Authoring Multi-Project Builds. url: https : / / docs . gradle . org / current / userguide/multi_project_builds.html#sec:configuration_on_demand.
Beams, Chris (2016). Kotlin Meets Gradle. Gradle. url: https://blog.gradle.
org/kotlin-meets-gradle.
Belov, Roman (2017). Kotlin 1.1 Released with JavaScript Support, Coroutines and more. url: https://blog.jetbrains.com/kotlin/2017/03/kotlin-1-1/.
Berglund, Tim (2013). Gradle Beyond the Basics. 1aed. The name of the publisher.
isbn: 1449304672.
Building Multiplatform Projects with Gradle. url: https://kotlinlang.org/
docs/reference/building-mpp-with-gradle.html.
Carbonnelle, Pierre (2019). PYPL PopularitY of Programming Language. http:
//pypl.github.io/PYPL.html. Kudos.
Cleron, Mike (2017). Android Announces Support for Kotlin. https://android- developers.googleblog.com/2017/05/android-announces-support-for-kotlin.html. Google.
Deleuze, S´ebastien (2017). Introducing Kotlin support in Spring Framework 5.0.
https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0. spring.
GNU Make Manual. url: https://www.gnu.org/software/make/manual/make.
pdf (visitato il 22/05/2016).
Jemerov, Dmitry (2017). Kotlin 1.2 Released: Sharing Code between Platforms.
url: https : / / blog . jetbrains . com / kotlin / 2017 / 11 / kotlin 1 2 -released/.
63
Kotlin 1.3.40 released (2019). url: https : / / blog . jetbrains . com / kotlin / 2019/06/kotlin-1-3-40-released/.
Muschko, Benjamin. Gradle in Action. Manning Publications Co. isbn: 9781617291302.
Paraschiv, Eugen (2017). Java in 2017 Survey Results. url: http://web.archive.
org / web / 20080207010024 / http : / / www . 808multimedia . com / winnt / kernel.htm (visitato il 21/02/2018).
Speeding Up Your Android Gradle Builds (Google I/O ’17). url: https://www.
youtube.com/watch?v=7ll-rkLCtyk&feature=youtu.be&t=22m20s (visitato il 17/05/2017).
Tobias Heine, Said Tahsin Dane (2018). (Code) Sharing is caring - An Introduc-tion to Kotlin Multiplatform Projects. url: https : / / blog . novoda . com / introduction-to-kotlin-multiplatform/.
touchlab, cur. (2019). Cross-Platform? We Don’t Say That Around Here Anymore.
url: https : / / hackernoon . com / cross platform we dont say that -around-here-anymore-cd269fcd4a5b.
Using Gradle Plugins. url: https://docs.gradle.org/current/userguide/
plugins.html#sec:plugins_block.