在构建我的依赖项时,我试图找出 api 和 implementation 配置之间的区别。
在文档中,它说 implementation 有更好的构建时间,但是,看到这个 comment在一个类似的问题中,我想知道这是不是真的。
由于我不是 Gradle 专家,希望有人能提供帮助。我读过 documentation已经,但我想知道一个易于理解的解释。
最佳答案
Gradle compile 关键字已弃用,取而代之的是 api 和 implementation 关键字来配置依赖项。
使用 api 等同于使用已弃用的 compile,因此如果您将所有 compile 替换为 api一切都会一如既往。
要理解 implementation 关键字,请考虑以下示例。
示例
假设您有一个名为 MyLibrary 的库,它在内部使用另一个名为 InternalLibrary 的库。像这样:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
假设 MyLibrary build.gradle 在 dependencies{} 中使用 api 配置,如下所示:
dependencies {
api project(':InternalLibrary')
}
您想在代码中使用 MyLibrary,因此在您应用的 build.gradle 中添加此依赖项:
dependencies {
implementation project(':MyLibrary')
}
使用 api 配置(或弃用的 compile),您可以在应用程序代码中访问 InternalLibrary:
// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
// Can ALSO access the internal library too (but you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
通过这种方式,模块 MyLibrary 可能会“泄露”某些内容的内部实现。你不应该(能够)使用它,因为它不是你直接导入的。
引入了implementation 配置来防止这种情况。
所以现在,如果您在 MyLibrary 中使用 implementation 而不是 api:
dependencies {
implementation project(':InternalLibrary')
}
您将无法再在您的应用代码中调用 InternalLibrary.giveMeAString()。
这种装箱策略允许 Android Gradle 插件知道,如果您在 InternalLibrary 中编辑某些内容,它只能触发 MyLibrary 的重新编译,不会 重新编译整个应用程序,因为您无权访问 InternalLibrary。
当你有很多嵌套的依赖时,这个机制可以大大加快构建速度。 (观看最后链接的视频以充分理解这一点)
结论
当您切换到新的 Android Gradle 插件 3.X.X 时,您应该将所有的 compile 替换为 implementation 关键字 *(1)。然后尝试编译和测试您的应用程序。如果一切正常,请按原样保留代码,如果您遇到问题,则可能是您的依赖项有问题,或者您使用了现在私有(private)且无法访问的东西。 *Android Gradle 插件工程师 Jerome Dochez 的建议 (1))
如果您是库维护者,您应该为库的公共(public) API 所需的每个依赖项使用 api,同时为测试依赖项使用 implementation或最终用户不得使用的依赖项。
Useful article展示实现和api
之间的区别引用文献 (这是为了节省时间而拆分的同一视频)
Google I/O 2017 - How speed up Gradle builds (FULL VIDEO)
Google I/O 2017 - How speed up Gradle builds (NEW GRADLE PLUGIN 3.0.0 PART ONLY)
Google I/O 2017 - How speed up Gradle builds (reference to 1*)
关于android - Gradle 实现与 API 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231886/
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO