Cette réponse démontrera la différence entre implementation
, api
et compile
sur un projet.
Disons que j'ai un projet avec trois modules Gradle:
- application (une application Android)
- myandroidlibrary (une bibliothèque Android)
- myjavalibrary (une bibliothèque Java)
app
a myandroidlibrary
comme dépendances. myandroidlibrary
a myjavalibrary
comme dépendances.
myjavalibrary
a une MySecret
classe
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
a une MyAndroidComponent
classe qui manipule la valeur de la MySecret
classe.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Enfin, app
ne s'intéresse qu'à la valeur demyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Parlons maintenant des dépendances ...
app
besoin de consommer :myandroidlibrary
, donc dans app
build.gradle use implementation
.
( Remarque : Vous pouvez également utiliser api / compile. Mais maintenez cette pensée pendant un moment.)
dependencies {
implementation project(':myandroidlibrary')
}
À quoi myandroidlibrary
devrait ressembler build.gradle? Quelle portée utiliser?
Nous avons trois options:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
Quelle est la différence entre eux et que dois-je utiliser?
Compiler ou Api (option # 2 ou # 3)
Si vous utilisez compile
ou api
. Notre application Android peut désormais accéder à la myandroidcomponent
dépendance, qui est une MySecret
classe.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Mise en œuvre (option # 1)
Si vous utilisez la implementation
configuration, MySecret
n'est pas exposé.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Alors, quelle configuration choisir? Cela dépend vraiment de vos besoins.
Si vous souhaitez exposer les dépendances, utilisez api
ou compile
.
Si vous ne souhaitez pas exposer les dépendances (masquer votre module interne), utilisez implementation
.
Remarque:
Ceci n'est qu'un aperçu des configurations Gradle, reportez-vous au tableau 49.1. Plugin Java Library - configurations utilisées pour déclarer les dépendances pour une explication plus détaillée.
L'exemple de projet pour cette réponse est disponible sur https://github.com/aldoKelvianto/ImplementationVsCompile