我曾经使用这个简单的 gradle 任务将“编译”依赖项复制到特定文件夹:
task copyLibs(type: Copy) {
from configurations.compile
into "$project.rootDir/reports/libs/"
}
但是在使用 gradle plugin 3.0.1 for Android Studio 和 Gradle 工具将我的 Android 项目升级到 4.1 后,它就停止了工作。由于依赖配置“编译”现在已被 https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations 弃用,因此我将其更改为“实现”。但是,我无法使用我的 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 文件:应用插件:'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 任务,以便像升级我的环境之前一样工作。我正在为 Android Studio 和 Gradle 工具 2.14.1 使用 gradle 插件 2.2.3。
最好的选择是使用 configurations.runtimeClasspath
,而不是使用 configurations.implementation
。
也可以考虑一下:compileClasspath default
我使配置可解析,因此获取依赖项时没有异常
configurations.implementation.setCanBeResolved(true)
configurations.api.setCanBeResolved(true)
println configurations.implementation.resolve()
println configurations.api.resolve()
build.gradle
的什么位置?尝试添加时,我不断收到错误 > Cannot change strategy of configuration ':app:api' after it has been resolved.
。
另一个建议。
我创建了自定义配置,然后将其用作 configurations.customConfig
:
configurations {
customConfig.extendsFrom implementation
}
复制任务必须进行相应的编辑:
task copyLibs(type: Copy) {
from configurations.customConfig
into "$project.rootDir/reports/libs/"
}
[...] Resolving dependency configuration 'implementation' is not allowed as it is defined as 'canBeResolved=false'. Instead, a resolvable ('canBeResolved=true') dependency configuration that extends 'implementation' should be resolved.
对应的任务 copyLibs
将复制 from configurations.customConfig
。
from configuration.customConfig
吗?
看起来好像没有办法获取 implementation
依赖项列表,并且如果您直接使用 Android,Rafael 发布的 the Gradle ticket 中提到的 compileClasspath
将不起作用,就像我需要的情况一样要导出的依赖项,以便 Unity3D 可以打包它们以供发布。
所以..在这种情况下,唯一的解决方案似乎是使用已弃用的 compile
类型。
这可能无济于事或有更好的方法来解决,但是......
您可以以一种可以复制的方式放置您的依赖项,执行以下操作:
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 任务由于您从 compile
更改为 implementation
而停止将依赖项放入 jar 文件,这也会有所帮助。
您可以使用:
from {configurations.myConfig.collect { it.isDirectory() ? it : zipTree(it) }}
代替:
from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
classpath 'com.android.tools.build:gradle:3.2.1'
和 distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip
。我不确定它是否仍然有效...
不定期副业成功案例分享
configurations.compile
替换为configurations.compileClasspath
就可以了(至少对我而言)。Could not get unknown property 'runtimeClasspath' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.
。我错过了什么?compileClasspath
也是如此。我的代码看起来一样,除了它是一个库而不是一个应用程序。configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
对我来说效果很好(对于 androidjava-library
)