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

我想在Gradle中自动包含最新生成的第三方许可证

配置:

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'