Implementation vs api in Gradle

di il
5 risposte

Implementation vs api in Gradle

Un ciao a tutti.
Sto utilizzando Gradle per un progetto Java con Spring. Per quanto riguarda la gestione delle dipendenze vedo nella documentazione che il vecchio comando compile è sconsigliato, a favore di implementation o di api. Sto cercando di capire la differenza tra i due e quando è più opportuno usare l'uno o l'altro. Qualcuno può aiutarmi a schiarirmi le idee?

5 Risposte

  • Re: Implementation vs api in Gradle

    "implementation" ed "api" sono fornite dal plugin "android", per cui se stai facendo un progetto con Spring per desktop/server allora non li potrai/dovrai usare.

    Per rispondere alla tua domanda comunque, "api" è esattamente identico a "compile" (questo sì che fa parte di gradle "standard"), mentre "implementation" indica che una dipendenza è usata esclusivamente come dettaglio implementativo del progetto.
    Cosa cambia? Supponi di avere 2 progetti: libreria-interna e applicazione. Se tu definisci libreria-interna come "api", allora significa che la libreria-interna viene esposta come parte delle API dell'applicazione (cioè sarà accessibile a chiunque possa accedere all'applicazione), ed un cambiamento alla libreria-interna. Viceversa "implementation" indica che la libreria-interna è usata esclusivamente come dettaglio implementativo dell'applicazione, e non sarà quindi accessibile a chi ha accesso all'applicazione.
    In soldoni "api" ti serve solo se vuoi esporre una certa dipendenza agli sviluppatori che useranno il tuo prodotto (es: se sviluppi una libreria)
  • Re: Implementation vs api in Gradle

    Grazie per la risposta.
    Se ho compreso l'uso di "implementation" comporta che le dipendenze siano visibili solo nel modulo in cui sono dichiarate. Nel caso di "api" le dipendenze dichiarate in un modulo sono "ereditate" dai moduli che hanno tale modulo come dipendenza. L'uso di "api" in dependencies è quindi utile se l'applicazione è realizzata a moduli che dipendono tra loro come in una struttura ad albero: i moduli più vicini alla radice possono "vedere" le dipendenze dichiarate nei nodi più lontani. Giusto?
  • Re: Implementation vs api in Gradle

    Esatto! Un altro impatto è che se hai una libreria dichiarata come "api", allora dei cambiamenti alla libreria implicheranno la necessità di ricompilare tutti i progetti che hanno dipendenze anche transitive verso la libreria. Viceversa se la libreria è dichiarata come "implementation" allora un cambiamento alla libreria causerà una ricompilazione della libreria stessa e dei soli moduli che dipendono direttamente da essa (cioè quelli che dichiarano "implementation my-library" fra le dipendenze)
  • Re: Implementation vs api in Gradle

    Ed in effetti mi sa che è proprio per quanto da lei indicato che ha spinto gli sviluppatori di Gradle a sostituire progressivamente "compile" con "implementation" e "api". Se si utilizza la filosofia TDD e l'applicazione è costituita da molti moduli tra loro collegati utilizzando opportunamente le possibili scelte nel dichiarare le dipendenze è immaginabile una discreta riduzione nei tempi di sviluppo.
  • Re: Implementation vs api in Gradle

    Sì, le motivazioni principali sono una maggior velocità di compilazione, almeno per progetti grandi con tanti moduli, e il fatto di non voler esporre dettagli implementativi laddove non necessario
Devi accedere o registrarti per scrivere nel forum
5 risposte