Yarn vs Npm – in cosa si differenziano oggi?

Y

Yarn, made in facebook

Ci sono linguaggi come Go che non riescono ancora ad ottenere un package manager di riferimento nella comunità e linguaggi come javascript, invece, che ne hanno una miriade (qui una lista incompleta).
Per completare l’opera, a giugno del 2016, Facebook ha pubblicato su Github Yarn (inizialmente fbkpm): un package manager parallelo a NPM (all’epoca alla sua quarta versione) ma con svariate funzionalità in più le quali hanno fatto registrare un entusiasmo non da poco nella community che lo ha velocissimamente adottato facendolo diventare il package manager principale di molti developer: vediamo perché e soprattutto cerchiamo di capire come NPM5 è cambiato dopo l’introduzione di questo “nuovo” package manager.

Yarn.lock

Yarn è venuto fuori dai progetti open source di facebook proprio per compensare le grosse lacune che NPM4 dimostrava di avere in diverse aree. Una di queste era il sistema non deterministico di gestione dei pacchetti che portava, due volte sì ed una no, al cosiddetto problema del:

it works on my machine

Ed esempi del genere si trovano un po’ ovunque (qui abbiamo persino una spiegazione ufficiale del problema da parte di npm).
Per sopperire a questa mancanza è stato introdotto il file “yarn.lock” accanto al già conosciuto “package.json“.
Come viene descritto nella guida di migrazione da npm (che una migrazione alla fine non è) questo file va spinto nella repo insieme agli altri file del progetto:

You don’t need to read or understand this file – just check it into source control

Però noi siamo curiosi e vogliamo anche comprendere questo file analizzando il suo interno.
Scaricate il package manager qui per la vostra piattaforma, create una cartella e con il nostro terminale di fiducia digitiamo: yarn init per inizializzare un file package.json. Difatti vi sarà richiesto di inserire il nome, la versione e tutte le altre informazioni generali sul progetto.

Subito dopo aggiungiamo lodash come dipendenza con: yarn add lodash e vediamo come, oltre ad essere listato nel package.json, Yarn creerà un file yarn.lock con il seguente contenuto:

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


lodash@^4.17.4:
  version "4.17.4"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"

Quanto troviamo scritto qui non è semplicemente una lista di dipendenze, ma una lista che, per prima cosa non punta ai server npm, e che contiene anche un hash (sha1) per controllare che il package scaricato sia precisamente quello che vogliamo e senza alcuna modifica extra che non ci aspetteremmo.
Capiamo quindi perfettamente che tutto questo lavoro serve a far si che i pacchetti su cui facciamo affidamento all’interno del nostro progetto, siano esatamente cosi come ce li aspettavamo quando abbiamo scritto il codice.

package-lock.json

I developers che lavorano su NPM però, non hanno aspettato affatto nell’aggiornare il loro package manager per prendere le ottime novità implementate da facebook creando anche loro un file che mantenga le stesse informazioni di yarn.lock ma in notazione JSON (una struttura decisamente più consona), chiamato: package-lock.json.

Differenze tra npm5 e yarn

Quindi se Yarn poteva definirsi innovativo e quasi necessario da utilizzare in alcuni casi, oggi con la versione 5 di NPM (presente di default dalla versione 8.0.0 di Node.js) molte delle diversità sono state soppiantate. Vediamo però in cosa si differenziava con NPM4 per poter così accennare alle modifiche che sono state apportate nella versione 5 e cosa ancora va aggiornato:

  • Digitando il comando yarn nella directory del package.json, l’installazione dei pacchetti viene lanciata di default, mentre con npm5 bisogna scrivere npm install
  • Yarn add, equivalente di npm install, salverà automaticamente la dipendenza all’interno del package.json. npm5 ha implementato questa feature
  • E’ possibile installare pacchetti anche quando si è offline con Yarn, a patto che siano già stati installati in precedenza. npm5 ha implementato questa feature e attraverso l’opzione --prefer-offline è possibile anche prelevare i pacchetti dalla cache in presenza di connessione (e scaricare quelli non presenti)
  • Con Yarn abbiamo una chicca per quanto riguarda le licenze. Possiamo infatti verificare la lista di licenze con cui sono stati pubblicati tutti i pacchetti su cui facciamo affidamento (anche le dipendenze di una nostra dipendenza) attraverso: yarn licenses list.
    yarn licenses generate-disclaimer invece stampa una licenza utilizzabile per il nostro progetto che racchiude informazioni sulle nostre dipendenze. Nessuna versione di npm mette a disposizione queste due feature.
  • Un altra comodissima funzione che npm ancora non implementa è: yarn why package-name che verifica per quale motivo è stato installato un determinato pacchetto (pensate a tutti quei pacchetti che non installate manualmente ma che installano per voi framework come react, angular ecc.)

Benchmarks

Possiamo analizzare alcuni benchmark in questa repo.
Riporto due screenshot:

Installazione React con Yarn
Installazione React
Installazione Angular con Yarn
Installazione Angular

Cosa conviene utilizzare?

NPM con la versione 5 ha davvero implementato un grande numero di feature e se questo da un lato è un’ottima cosa, dall’altro ha introdotto un severo numero di bug al punto che molte persone, me compreso, sono dovute tornare alla versione 4 (guarda create-react-app).
Yarn invece c’è da un po’ e ha avuto il tempo necessario per maturare ed essere stabile, quindi il mio consiglio, per ora, è quello di tenere entrambi (npm5 ovviamente) e di usare il secondo in produzione a fronte di una maggiore velocità e sicurezza.

A proposito di me

Giacomo Cerquone

Appassionato di informatica sin da piccolo, cinefilo accanito, amante di tè e dei posti freddi. Focalizzato in full-stack JavaScript developing, contributor di diversi progetti open source e amante delle tecnologie bleeding edge nell'ambito della programmazione.

Gli articoli più letti

Articoli recenti

Commenti recenti