zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    米洛个人修炼术:导致上班累成狗的三大主因
    米洛个人修炼术:如何倍增你的功力修行速度达成健康体魄
    米洛个人修炼术:注意这三方面,天天都早起
    米洛个人修炼术:情绪的四种常用处理方式,其实都是有问题的
    好公司和差公司的对比
    课程作业二
    课程作业一
    作业四
    寒假作业三
    寒假作业二
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/12983662.html
Copyright © 2011-2022 走看看