我曾经复制'编译'使用这个简单的gradle任务依赖于特定文件夹:
task copyLibs(type: Copy) {
from configurations.compile
into "$project.rootDir/reports/libs/"
}
但是在使用Android Studio Gradle插件3.0.1和Gradle工具升级到4.1后,它刚刚升级我的Android项目后停止工作。作为依赖配置'编译'现已被https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations弃用了。我将其更改为' implementation'。但是,我无法使用copyLibs任务来解决配置和实施问题。根据Gradle构建错误输出不允许直接:
$ ./gradlew.bat clean build
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':app:copyLibs'.
> Resolving configuration 'implementation' directly is not allowed
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
BUILD FAILED in 1s
请参阅以下关于app模块的当前build.gradle文件:apply plugin:' com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "newgradle.com.testingnewgradle"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:support-v4:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
task copyLibs(type: Copy) {
from configurations.implementation
into "$project.rootDir/reports/libs/"
}
build.dependsOn copyLibs
如果我使用'编译'它的工作原理,但我希望符合此插件的最新推荐用法。
我需要帮助才能升级我的copyLibs任务,以便在升级我的环境之前工作。 我使用gradle插件2.2.3 for Android Studio和Gradle工具2.14.1。
答案 0 :(得分:9)
最好使用以下方法,而不是使用configuration.implementation: configuration.runtimeClasspath
您还可以考虑: compileClasspath 默认
答案 1 :(得分:7)
这可能无济于事或有更好的解决方法,但......
您可以按照可执行以下操作的方式放置依赖项:
android { ... }
// Add a new configuration to hold your dependencies
configurations {
myConfig
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:support-v4:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
// Now you have to repeat adding the dependencies you want to copy in the 'myConfig'
myConfig fileTree(dir: 'libs', include: ['*.jar'])
myConfig 'com.android.support:appcompat-v7:26.1.0'
myConfig 'com.android.support:support-v4:26.1.0'
...
}
task copyLibs(type: Copy) {
// Now you can use 'myConfig' instead of 'implementation' or 'compile'
from configurations.myConfig
into "$project.rootDir/reports/libs/"
}
如果您有一个Jar任务停止将依赖项放入jar文件,因为您从compile
更改为implementation
,这也会有所帮助。
您可以使用:
from {configurations.myConfig.collect { it.isDirectory() ? it : zipTree(it) }}
而不是:
from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
答案 2 :(得分:4)
我想发表评论,但我仍然缺乏这样做的声誉(一点!!>。<)。看起来没有办法获取implementation
依赖关系列表,the Gradle ticket提到的compileClasspath
如果您直接使用Android,Rafael发布的内容将无效就像我的情况一样,我需要导出依赖项,以便Unity3D可以将它们打包发布。
所以..在这种情况下,看起来唯一的解决方案是使用弃用的compile
类型。
答案 3 :(得分:3)
另一个建议。
我创建了自定义配置,然后将其用作configurations.customConfig
:
configurations {
customConfig.extendsFrom implementation
}
答案 4 :(得分:3)
我使配置可以解决,因此没有异常获取依赖项的文件
configurations.implementation.setCanBeResolved(true)
configurations.api.setCanBeResolved(true)
println configurations.implementation.resolve()
println configurations.api.resolve()
答案 5 :(得分:0)