我正在使用Android Studio 3.0 Preview来启动新的Kotlin项目。当我尝试在build.gradle
中添加依赖项时,我看到了implementation
范围,而不是通常的compile
。
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:25.3.1'
testImplementation 'junit:junit:4.12'
还有androidTestImplementation
和testImplementation
范围。
最后,我添加了compile
来添加第三方依赖项,它可以正常运行。
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
所以我的问题是......
implementation
,androidTestImplementation
和testImplementation
范围? compile
,testCompile
和androidTestCompile
有什么不同?编辑: 我的不好,这个问题不是Kotlin具体的。这是新的Android Gradle Plugin configuration。
答案 0 :(得分:20)
这不是特定于Kotlin,而是与Android的新Gradle插件有关。
compile
,provided
和apk
现已弃用
使用implementation
或api
代替compile
,compileOnly
代替provided
,runtimeOnly
代替apk
。
这样做的原因是为了加速多模块构建。给定模块A
取决于模块B
,模块C
又取决于模块C
,模块A
中的更改将触发模块A
的重新编译。如果C
未直接使用A
,则C
更改后implementation
无需重新编译。
implementation project(':C')
配置确保了这一点:如果您在B
中指定C
,则无法从A
访问A = rand(3) ;
B = rand(1,3) ;
C = bsxfun(@plus, A, B);
% is same as
C1 = repmat(B,3,1) ;
,并且您无法构建不必要的模块。在大型多模块项目中,这可以节省大量时间。
有关详细信息,请参阅Migrate to the new Gradle plugin。
答案 1 :(得分:1)
早期版本的gradle v3.0.0-alpha1
曾使用compile
,但现在已弃用。
为什么?
compile
配置中出现的依赖关系将传递给库的使用者,因此将出现在使用者的编译类路径中。另一方面,实现配置中的依赖关系不会暴露给消费者,因此不会泄漏到消费者的编译类路径中。
让我们举一个例子来理解这一点。比方说,我创建了一个支持Library_Image_Upload
的{{1}}到服务器。我在Image uploading
中使用Library_Network
lib来支持所有网络操作。我的图书馆只使用图片上传,并提供上传图片的便捷方式。现在,当我在Library_Image_Upload
项目中使用Library_Network
lib时,使用此lib的每个人都将具有Library_Image_Upload
的功能以及所有网络操作,有人也可以使用( 重要强>)。后来我认为Image Uploading
有Library_Network
作为Library_Magic_Image
的更好替代方案并使用它。因此,Library_Network
公开的所有API函数都已消失,使用这些函数的任何人都破坏了构建。
implementation
带来了好处:
要了解详情,请阅读The Java Library Plugin
所以我认为你有三个问题的答案。
我希望它有所帮助。