Gradle 依赖关系中 compile和 implementation的区别
将在一个项目中展示implementation,api以及compile之间的差异。
假设我有一个包含三个Gradle模块的项目:
- app(Android应用)
- my-android-library(Android库)
- my-java-library(Java库)
app具有my-android-library与依赖。my-android-library具有my-java-library依赖。
依赖1
my-java-library有一个MySecret班
public class MySecret {
public static String getSecret() {
return "Money";
}
}
my-android-library 拥有一个类 MyAndroidComponent,里面有调用 MySecret 类的值。
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
最后,app 只对来自 my-android-library
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
现在,让我们谈谈依赖性...
app需要:my-android-library库,所以在app build.gradle
文件中使用implementation
。
(注意:您也可以使用api/compile, 但是请稍等片刻。)
dependencies {
implementation project(':my-android-library')
}
依赖2
您认为 my-android-library 的 build.gradle
应该是什么样?我们应该使用哪个范围?
我们有三种选择:
dependencies {
// 选择 #1
implementation project(':my-java-library')
// 选择 #2
compile project(':my-java-library')
// 选择 #3
api project(':my-java-library')
}
依赖3
它们之间有什么区别,我应该使用什么?
compile 或 api(选项#2或#3)
依赖4
如果您使用 compile 或 api。我们的 Android 应用程序现在可以访问 MyAndroidComponent 依赖项,它是一个MySecret 类。
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// 你可以访问 MySecret
textView.setText(MySecret.getSecret());
implementation(选项1)
依赖5
如果您使用的是 implementation 配置,MySecret 则不会公开。
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// 你无法访问 MySecret 类
textView.setText(MySecret.getSecret()); // 无法编译的
那么,您应该选择哪种配置?取决于您的要求。
如果要公开依赖项,请使用 api 或 compile。
如果您不想公开依赖项(隐藏您的内部模块),请使用implementation。