Gradle 将生成的第三方许可证复制到资产
我想在Gradle中自动包含最新生成的第三方许可证 配置:Gradle 将生成的第三方许可证复制到资产,gradle,licensing,android-gradle-plugin,Gradle,Licensing,Android Gradle Plugin,我想在Gradle中自动包含最新生成的第三方许可证 配置: task beforeAssemble(dependsOn: assemble) << { downloadLicenses.execute() CopyToAssetsTask.execute() } task CopyToAssetsTask(type: Copy) { description = 'Copies generated Third Party Licenses into assets
task beforeAssemble(dependsOn: assemble) << {
downloadLicenses.execute()
CopyToAssetsTask.execute()
}
task CopyToAssetsTask(type: Copy) {
description = 'Copies generated Third Party Licenses into assets'
from('$buildDir/reports/license') {
include('dependency-license.html')
}
into '$buildDir/intermediates/assets/debug/legal'
}
apply plugin: 'license'
downloadLicenses {
includeProjectDependencies = true
reportByDependency = true
reportByLicenseType = true
dependencyConfiguration = "compile"
}
- 梯度2.x
- 许可证渐变插件0.11.0
task beforeAssemble(dependsOn: assemble) << {
downloadLicenses.execute()
CopyToAssetsTask.execute()
}
task CopyToAssetsTask(type: Copy) {
description = 'Copies generated Third Party Licenses into assets'
from('$buildDir/reports/license') {
include('dependency-license.html')
}
into '$buildDir/intermediates/assets/debug/legal'
}
apply plugin: 'license'
downloadLicenses {
includeProjectDependencies = true
reportByDependency = true
reportByLicenseType = true
dependencyConfiguration = "compile"
}
组装前的任务(依赖于:组装)尝试将CopyToAssetsTask
更改为:
task CopyToAssetsTask << {
copy {
description = 'Copies generated Third Party Licenses into assets'
from('$buildDir/reports/license') {
include('dependency-license.html')
}
into '$buildDir/intermediates/assets/debug/legal'
}
}
任务副本评估任务首先是一些观察结果。最后,解决方案是:
- 您仍在按程序思考:告诉Gradle何时做什么(即在组装之前在任务
中做什么)。利用任务图:指定任务的依赖关系(请参见下面的一些可能性)。当您需要任务的输出时,只要让Gradle执行该任务,Gradle就会找出该任务所依赖的可传递任务。它将执行所有这些任务:只执行一次,并且按照正确的顺序执行
- 此声明:
任务预组装(dependsOn:assemble)
,没有意义。您希望任务在assembly
之前运行,但通过依赖assembly
实现了相反的效果:assembly
将在beforesembly
之前运行
如何指定依赖项?有多种选择:
- 使用直接依赖项:
dependsOn
- 在任务的
输入中引用其他任务
- 设置任务的选项,这将自动创建依赖项。例如:
Copy
任务的from
属性设置为另一个任务的输出,则Copy
任务将自动添加该另一个任务作为输入
这是解决办法。你想要两件事,实现两件事:
- 在构建期间生成许可证信息(在某个特定点)
- 将许可证信息包括在存档中
将此添加到生成脚本:
这个解决方案对我来说很有效,是对Johan Stuyts发布的答案稍加修改的版本
但有一个限制:生成的报告最终将位于根资产文件夹中,而不是预期的子文件夹“legal”
在我的项目(gradle 3.4.1)中,它在Android“Module:app”gradle文件中的工作方式如下:
plugins {
id "com.github.hierynomus.license" version "0.14.0"
}
license {
include "**/*.java"
strictCheck = false
ignoreFailures = true
skipExistingHeaders = true
}
downloadLicenses {
includeProjectDependencies = true
reportByDependency = true
reportByLicenseType = false
dependencyConfiguration = "compile"
licenses = [
(group('com.android.support')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.android.support.constraint')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.google.firebase')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.google.android')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.google.android.gms')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0')
]
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
...
}
sourceSets {
main {
assets.srcDirs = ['src/main/assets', 'build/licenses/']
}
}
buildTypes {
...
}
}
dependencies {
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.android.support:design:25.3.1'
...
}
task copyLicenseReport(type: Copy) {
from('build/reports/license') {
include '**/*.html'
include '**/*.xml'
}
into 'build/licenses/thirdPartyLicenses'
}
project.afterEvaluate {
copyLicenseReport.dependsOn project.tasks.getByName('downloadLicenses')
preBuild.dependsOn copyLicenseReport
}
apply plugin: 'com.google.gms.google-services'
对于您建议的更改,复制仍将在执行阶段进行。这就是它应该发生的地方。不要试图在构建步骤中使用配置阶段。啊,我的错误。我想写“您的复制是在配置阶段完成的”,但事实并非如此。Copy
任务的实例仅在配置阶段使用from
、into
等进行配置。实际的复制将在执行阶段进行。我可以确认更改无效问题是任务没有运行。这非常有帮助,现在它几乎可以工作了,但是文件并没有放在assets文件夹中,而是在apk文件的根目录中编译。另外:sourceset.main.resources.srcDir
应该是sourceset.main.resources.srcDirs
一个小的调整就解决了这个问题。但是,我想把它放在资产中的“legal”文件夹中(生成的文件现在放在根资产文件夹中)。我的调整:assets.srcDirs=['src/main/assets','build/reports/license']
mergeDebugAssets.dependsOn project.tasks.getByName('downloadclicenses')
mergeReleaseAssets.dependsOn project.tasks.getByName('downloadclicenses')
我也有类似的问题,我很难让它正常工作,你能粘贴一个完整的例子@Alix说明你是如何解决的吗?当然可以。我本来想让@JohanStuyts获得荣誉,但现在我已经给出了答案
plugins {
id "com.github.hierynomus.license" version "0.14.0"
}
license {
include "**/*.java"
strictCheck = false
ignoreFailures = true
skipExistingHeaders = true
}
downloadLicenses {
includeProjectDependencies = true
reportByDependency = true
reportByLicenseType = false
dependencyConfiguration = "compile"
licenses = [
(group('com.android.support')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.android.support.constraint')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.google.firebase')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.google.android')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0'),
(group('com.google.android.gms')) : license('Apache License, Version 2.0', 'http://www.apache.org/licenses/LICENSE-2.0')
]
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
...
}
sourceSets {
main {
assets.srcDirs = ['src/main/assets', 'build/licenses/']
}
}
buildTypes {
...
}
}
dependencies {
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.android.support:design:25.3.1'
...
}
task copyLicenseReport(type: Copy) {
from('build/reports/license') {
include '**/*.html'
include '**/*.xml'
}
into 'build/licenses/thirdPartyLicenses'
}
project.afterEvaluate {
copyLicenseReport.dependsOn project.tasks.getByName('downloadLicenses')
preBuild.dependsOn copyLicenseReport
}
apply plugin: 'com.google.gms.google-services'