API或实现在我自己的库中的依赖关系?

时间:2018-08-21 23:47:33

标签: android gradle

使用自己的库时,是否有充分的理由在gradle中使用api来实现?在其他情况下是否有充分的理由使用它?在其他与此有关的问题中,我找不到答案。还是当您由于从使用compile过渡而不得不这么做时?

1 个答案:

答案 0 :(得分:1)

除了您自己的库之外,最有用的一种情况是您有一个多模块项目。在这类项目中,您极有可能最终拥有具有其他模块依赖性的模块,并且由于如果这些模块api有任何更改,您可能希望gradle重新编译您的模块依赖性。

apicompile等效,并且添加了implementation以改进gradle构建,因为不必重新编译每个依赖项,而只需重新编译需要依赖的依赖项即可。

以下文章是有关它的很好的信息来源,并且非常简洁。

Implementation vs API dependency

Implementation Vs Api in Android Gradle plugin 3.0

更新

从gradle文档中获取:

  

api存储桶用于声明应依赖的依赖项   下游消费者可传递时可见   编译。实现存储桶用于声明依赖项   不应泄漏到使用者的编译类路径中(因为   它们纯粹是内部细节。

这意味着,如果您自己的库希望向其使用者公开任何依赖关系,则应使用api。您自己的库中带有api的所有依赖项都将成为使用您自己的库的应用程序的编译类路径的一部分。使用implementation,您不会将正在自己库中使用的依赖项公开给正在使用它的应用程序。

例如,您可以看到它在ButterKnife之类的知名库中得到了应用。消费者应用程序添加为依赖项的“核心”黄油刀模块通过butterknife-annotations向消费者展示api project(':butterknife-annotations')。这就是允许消费者使用butterknife之类的绑定注释,例如@BindView的原因。

如果在butterknife-annotations中使用butterknife而不是implementation添加了api,则消费者应用将无法使用这些绑定注释。因为butterknife-annotations将不再成为使用者应用程序的编译类路径的一部分。