Dart: pub, il gestore di pacchetti

Di - 24 November 2012 - in

Oggi la rubrica Impara Dart e mettilo da part tocca un altro punto cruciale di Dart: la modularità. Oggi vedremo infatti come vengono gestite le applicazioni e le loro dipendenze — ovvero i pacchetti — che nella convenzione del linguaggio sono rispettivamente application packages e library packages.

La relazione fra i due tipi di pacchetto è che i primi usano i secondi ma non sono a loro volta riutilizzabili; la stessa libreria può essere importata in più applicazioni, ma nessuna applicazione può importare una seconda applicazione, e questo è piuttosto ovvio. A livello strutturale applicazioni e librerie sono molto simili, tanto che, una volta afferrata la differenza, le identificheremo entrambe con il nome di package .

I pacchetti vengono gestiti da Dart tramite l’applicazione pub, alla quale abbiamo più volte accennato nel corso di questi articoli. Basandosi sul contenuto di un file di configurazione del packagepubspec.yamlpub si occuperà di importare “fisicamente” le dipendenze all’interno della directory dell’applicazione, creando una serie di link simbolici che ne agevoleranno l’importazione nella applicazione.

pub ha due metodi principali per il reperimento dei pacchetti:

  1. hosted packages
  2. git repositories

Il primo metodo si riferisce ai pacchetti presenti nella repository ufficale di Dart, pub.dartlang.org, mentre il secondo metodo si riferisce ad una qualsiasi repository git.

Sulla repository ufficiale sono già disponibili diverse librerie molto utili, per esempio html5lib, js, mongo_dart

Se volessimo importare in un’applicazione la libreria html5lib, il file di configurazione pubspec.yaml avrebbe questo contenuto:

name: GooglabApp
version: 0.1.0
dependencies:
  html5lib: 0.2.0

Se invece volessimo importare una libreria da una repository git, ad esempio Bot di Kevin Moore, il file di configurazione sarebbe il seguente:

name: GooglabApp
version: 0.1.0
dependencies:
  bot:
    git: https://github.com/kevmoo/bot.dart

Eseguendo il comando pub install, le dipendenze saranno copiate all’interno della directory della nostra applicazione, e potremmo caricarle con l’istruzione

import 'package:bot/bot.dart';

La sintassi package:nome_libreria suggerisce il significato del link simbolico packages creato da pub.

Approfondiamo il discorso delle librerie occupandoci dello sviluppo di un’applicazione di prova, GooglabApp, che utilizza la libreria googlab_lib: vogliamo che googlab_lib definisca la classe Articolo e che GooglabApp usi questa classe nel suo codice; vogliamo infine che la libreria sia importata come repository git.

Importante: affinchè le istruzioni seguenti funzionino è necessario che il percorso ai programmi dart, pub e git sia presente nella variabile d’ambiente Path (su Windows) o $PATH su sistemi UNIX.

Creiamo innanzitutto le due directory principali, GooglabApp e googlab_lib. Assumiamo che le due directory siano nella nostra cartella utente, ad esempio:

Win7    C:\Users\io\GooglabApp
        C:\Users\io\googlab_lib

Linux   /home/io/GooglabApp
        /home/googlab_lib

OS X    /Users/io/GooglabApp
        /Users/io/googlab_lib

La struttura di googlab_lib sarà

/googlab_lib
/googlab_lib/lib/googlab_lib.dart
/googlab_lib/pubspec.yaml

Mentre quella di GooglabApp sarà

/GooglabApp
/GooglabApp/bin/GooglabApp.dart
/GooglabApp/pubspec.yaml

Occupiamoci prima di googlab_lib. Il file di configurazione conterrà solo il nome della libreria (ovvero la configurazione minima di un package);

pubspec.yaml:

name: googlab_lib

È necessario che i files che costituiscono la libreria siano nella sotto-directory lib; il contenuto di lib/googlab_lib.dart:

library googlab_lib;

class Articolo{

  String autore, titolo, categoria;
  Articolo(this.autore,this.titolo,this.categoria){
    print('Articolo di $autore: $titolo. In $categoria');
  }
}

Alla prima riga dichiariamo che il contenuto del file fornirà una libreria di nome googlab_lib. Il restante contenuto ormai dovrebbe essere facilmente comprensibile: definiamo una classe che ha 3 attributi e che quando viene inizializzata stampa una stringa.

Ora dobbiamo far sì che questa libreria possa essere importata tramite git da una applicazione, quindi dobbiamo inizializzare una repository e aggiungere i files.

Da riga di comando entriamo nella directory e diamo queste istruzioni:

git init
git add lib/googlab_lib.dart
git add pubspec.yaml
git commit -m "Un messaggio qualsiasi"

A questo punto possiamo passare all’applicazione GooglabApp. Occupiamoci subito del file di configurazione:

pubspec.yaml

name: GooglabApp
dependencies:
  googlab_lib:
    git: file:///home/io/googlab_lib

La configurazione è piuttosto semplice da leggere: l’applicazione GooglabApp ha una dipendenza, googlab_lib, che è una repository git e che si trova all’indirizzo file:///home/io/googlab_lib.

Vediamo il contenuto di bin/GooglabApp.dart:

import 'package:googlab_lib/googlab_lib.dart' as gl;

main(){

  Articolo nuovoArticolo = new gl.Articolo('Adrian Leverkuhn',
  'Nuovo aggiornamento per Google Chrome','Chrome');
}

A differenza dei files di una libreria, i files di un’applicazione non devono necessariamente essere posti in una determinata sotto-directory; per convenzione si utilizza bin nel caso delle applicazioni da riga di comando e web nel caso delle web-app: l’unico requisito richiesto è che non risiedano nella directory principale del progetto.

Leggiamo la prima riga del file: vogliamo importare il package “googlab_lib/googlab_lib.dart” e vogliamo riferirci ad esso usando — per comodità — il nome gl.

A questo punto lanciamo il comando pub install da riga di comando, e l’output sarà:

Resolving dependencies...
Dependencies installed!

Abbiamo finito, lanciamo l’applicazione

dart bin/GooglabApp.dart

che stampa questa riga

Articolo di Adrian Leverkuhn: Nuovo aggiornamento per Google Chrome. In Chrome

Con questo articolo su pub termina la sezione relativa agli strumenti di sviluppo disponibili in Dart; Dal prossimo torneremo ad occuparci di elementi strettamente relativi al linguaggio e inizieremo ad analizzare applicazioni HTML5 più complesse.

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: