Ta odpowiedź będzie wykazać różnicę między implementation
, api
oraz compile
nad projektem.
Powiedzmy, że mam projekt z trzema modułami Gradle:
- aplikacja (aplikacja na Androida)
- myandroidlibrary (biblioteka Androida)
- myjavalibrary (biblioteka Java)
app
ma myandroidlibrary
jako zależności. myandroidlibrary
ma myjavalibrary
jako zależności.
myjavalibrary
ma MySecret
klasę
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
ma MyAndroidComponent
klasę, która manipuluje wartością z MySecret
klasy.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Wreszcie app
interesuje się tylko wartością zmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Porozmawiajmy teraz o zależnościach ...
app
trzeba konsumować :myandroidlibrary
, więc w app
build.gradle użyj implementation
.
( Uwaga : możesz również użyć interfejsu API / kompilacji. Ale przytrzymaj tę myśl przez chwilę.)
dependencies {
implementation project(':myandroidlibrary')
}
Jak myślisz, jak myandroidlibrary
powinna wyglądać build.gradle? Z jakiego zakresu powinniśmy korzystać?
Mamy trzy opcje:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
Jaka jest różnica między nimi a tym, czego powinienem używać?
Kompiluj lub API (opcja nr 2 lub nr 3)
Jeśli używasz compile
lub api
. Nasza aplikacja na Androida ma teraz dostęp do myandroidcomponent
zależności, która jest MySecret
klasą.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Realizacja (opcja nr 1)
Jeśli używasz implementation
konfiguracji, MySecret
nie jest narażony.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Którą konfigurację wybrać? To naprawdę zależy od twoich wymagań.
Jeśli chcesz ujawnić zależności, użyj api
lub compile
.
Jeśli nie chcesz ujawniać zależności (ukrywanie modułu wewnętrznego), użyj implementation
.
Uwaga:
To tylko streszczenie konfiguracji Gradle, patrz Tabela 49.1. Wtyczka Java Library - konfiguracje używane do deklarowania zależności w celu uzyskania bardziej szczegółowych wyjaśnień.
Przykładowy projekt dla tej odpowiedzi jest dostępny na https://github.com/aldoKelvianto/ImplementationVsCompile