在 dependsOn 时自定义 gradle 任务属性
Customize gradle task properties when dependsOn
我创建了自定义任务,它应该处理 gradle dependencies
任务的输出(正好是 ./gradlew dependencies --configuration myFlavorDebugRuntimeClasspath
)。我想为每个 buildVariant (PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)
) 创建自定义任务。
但我无法为每个 passportGen 自定义 dependenciesReportTask 属性。当我为特定的 buildVariant 调用 passportGen 时,它使用所有 (project.android.applicationVariants.all).
中最后一个构建变体的 dependenciesReportTask.setProperty("configurations", ...)
例如,如果我有以下构建变体(googleDebug googleRelease samsungDebug samsungRelease)并调用 passportGen 任务(./gradlew pasportGenerateGoogleDebug
),它将使用错误的 dependenciesReportTask 属性(配置将是 samsungReleaseRuntimeClasspath 配置)
class AppPlugin implements Plugin<Project> {
void apply(Project project) {
project.afterEvaluate {
// Create tasks for each Build Variant
project.android.applicationVariants.all { ApplicationVariant variant ->
def variantName = variant.name.capitalize()
def variantOutput = variant.outputs.first()
//Generating configuration name for dependency report
def configurationName = ""
if (variant.productFlavors.size() > 0) {
configurationName += variant.productFlavors.get(0).name
configurationName += variant.getBuildType().name.capitalize()
} else {
configurationName += variant.getBuildType().name
}
configurationName += "RuntimeClasspath"
def configurations = project.configurations.collect()
configurations.removeAll {
!it.name.equals(configurationName)
}
//prepare file for output of "dependencies" tasks
def depReportFileName = "dependeciesReport${variantName}.txt"
def dependenciesReportOutputFile = new File(depReportFileName)
//Get "dependencies" task from all project tasks
def dependenciesReportTask = project.tasks["dependencies"]
dependenciesReportTask.setProperty("configurations", configurations)
dependenciesReportTask.setProperty("outputFile", dependenciesReportOutputFile)
//create cutom task for every buildVariant which depends on "dependencies" task
PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)
passportGen.variant = variant
passportGen.configuration = configurations.collect().get(0)
//add dependency on "dependencies"
passportGen.dependsOn dependenciesReportTask
}
}
}
}
我可以实现我想要的唯一方法是调用:
def dependenciesReportTask = project.tasks["dependencies"]
dependenciesReportTask.setProperty("configurations", configurations)
dependenciesReportTask.setProperty("outputFile", dependenciesReport)
dependenciesReportTask.execute()
在我的自定义 PassportGenerateTask 任务主要操作方法 (@TaskAction) 中,但在其他任务中调用执行是不推荐使用的功能,将在 gradle 5.0
中删除
它不仅被弃用,而且它是纯粹的内部实现细节,很可能不会做你期望它做的事情,而且几乎总是产生比它试图解决的问题多得多的问题实际上失败了。
您很可能也不应该强奸 dependencies
任务。如果您需要多个具有不同配置的此类任务,只需创建 DependencyReportTask
类型的新任务并根据需要配置它们。
我创建了自定义任务,它应该处理 gradle dependencies
任务的输出(正好是 ./gradlew dependencies --configuration myFlavorDebugRuntimeClasspath
)。我想为每个 buildVariant (PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)
) 创建自定义任务。
但我无法为每个 passportGen 自定义 dependenciesReportTask 属性。当我为特定的 buildVariant 调用 passportGen 时,它使用所有 (project.android.applicationVariants.all).
中最后一个构建变体的 dependenciesReportTask.setProperty("configurations", ...)例如,如果我有以下构建变体(googleDebug googleRelease samsungDebug samsungRelease)并调用 passportGen 任务(./gradlew pasportGenerateGoogleDebug
),它将使用错误的 dependenciesReportTask 属性(配置将是 samsungReleaseRuntimeClasspath 配置)
class AppPlugin implements Plugin<Project> {
void apply(Project project) {
project.afterEvaluate {
// Create tasks for each Build Variant
project.android.applicationVariants.all { ApplicationVariant variant ->
def variantName = variant.name.capitalize()
def variantOutput = variant.outputs.first()
//Generating configuration name for dependency report
def configurationName = ""
if (variant.productFlavors.size() > 0) {
configurationName += variant.productFlavors.get(0).name
configurationName += variant.getBuildType().name.capitalize()
} else {
configurationName += variant.getBuildType().name
}
configurationName += "RuntimeClasspath"
def configurations = project.configurations.collect()
configurations.removeAll {
!it.name.equals(configurationName)
}
//prepare file for output of "dependencies" tasks
def depReportFileName = "dependeciesReport${variantName}.txt"
def dependenciesReportOutputFile = new File(depReportFileName)
//Get "dependencies" task from all project tasks
def dependenciesReportTask = project.tasks["dependencies"]
dependenciesReportTask.setProperty("configurations", configurations)
dependenciesReportTask.setProperty("outputFile", dependenciesReportOutputFile)
//create cutom task for every buildVariant which depends on "dependencies" task
PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)
passportGen.variant = variant
passportGen.configuration = configurations.collect().get(0)
//add dependency on "dependencies"
passportGen.dependsOn dependenciesReportTask
}
}
}
}
我可以实现我想要的唯一方法是调用:
def dependenciesReportTask = project.tasks["dependencies"]
dependenciesReportTask.setProperty("configurations", configurations)
dependenciesReportTask.setProperty("outputFile", dependenciesReport)
dependenciesReportTask.execute()
在我的自定义 PassportGenerateTask 任务主要操作方法 (@TaskAction) 中,但在其他任务中调用执行是不推荐使用的功能,将在 gradle 5.0
中删除它不仅被弃用,而且它是纯粹的内部实现细节,很可能不会做你期望它做的事情,而且几乎总是产生比它试图解决的问题多得多的问题实际上失败了。
您很可能也不应该强奸 dependencies
任务。如果您需要多个具有不同配置的此类任务,只需创建 DependencyReportTask
类型的新任务并根据需要配置它们。