如何从多项目目录的顶层禁用 Android Gradle 插件中

How to disable lint abortOnError in Android Gradle Plugin from top level of multi project directory(如何从多项目目录的顶层禁用 Android Gradle 插件中的 lint abortOnError)

本文介绍了如何从多项目目录的顶层禁用 Android Gradle 插件中的 lint abortOnError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个顶级 Android Gradle 项目.在此项目下方嵌套了多个子项目(有时它们是 2 级深),即:

I have a top level Android Gradle project. There are multiple subprojects nested below this projects (sometimes they are 2 level deep) i.e:

top level project
   |
project1

vendor libraries
      |
     lib1

     lib2

lint 正在中止我在某些库项目中的构建.我可以编辑每个单独的库项目的 build.gradle 来解决问题

lint is aborting my build in some of the libraries projects. I can edit each individual library project's build.gradle to fix the problem with

android {
   lintOptions {
      abortOnError false
   }
}

但是,我更喜欢顶级 build.gradle 脚本中的以下代码:

However, I would prefer the following code in the top level build.gradle script:

subprojects {

    afterEvaluate {
        if (getPlugins().hasPlugin('android') ||
            getPlugins().hasPlugin('android-library')) {

            println name // for debugging

            android {
                lintOptions {
                    abortOnError false
                }
            }
        }

    }
}

条件语句确保只挂钩到带有 android 插件的项目.我只能使用 afterEvaluate 让它工作.但是,我的构建仍然因 lint 错误而失败.

The conditional statement makes sure to hook only into projects with an android plugin. I could only get this to work using afterEvaluate. However, my build is still failing on lint errors.

有没有人有一个干净的解决方案来从顶层注入这些设置?

Does anyone have have a clean solution to inject these settings from the top level?

更新:

重新排列子项目和 afterEvaluate 或使用 allprojects 仍然会出现以下相同类型的错误:

Rearranging the subprojects and afterEvaluate or using allprojects still gives the same following kind of error:

7: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':3rdparty:OrmLiteQueryBuilder:lint'.
> [Ljava/util/HashMap$Entry;

* Try:    
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
==============================================================================

BUILD FAILED

Total time: 40.528 secs

堆栈跟踪:

7: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':3rdparty:OrmLiteQueryBuilder:lint'.
> [Ljava/util/HashMap$Entry;

* Try:    
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':3rdparty:OrmLiteQueryBuilder:lint'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:286)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
        at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
Caused by: java.lang.NoClassDefFoundError: [Ljava/util/HashMap$Entry;
        at com.android.build.gradle.internal.dsl.LintOptionsImpl$1.$getStaticMetaClass(LintOptionsImpl.groovy)
        at com.android.build.gradle.internal.dsl.LintOptionsImpl$1.<init>(LintOptionsImpl.groovy)
        at com.android.build.gradle.internal.dsl.LintOptionsImpl.syncTo(LintOptionsImpl.groovy:450)
        at com.android.build.gradle.internal.dsl.LintOptionsImpl$syncTo.call(Unknown Source)
        at com.android.build.gradle.tasks.Lint.lintAllVariants(Lint.groovy:105)
        at com.android.build.gradle.tasks.Lint$lintAllVariants.callCurrent(Unknown Source)
        at com.android.build.gradle.tasks.Lint.lint(Lint.groovy:63)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:219)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:212)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:201)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:530)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:513)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
        ... 13 more
Caused by: java.lang.ClassNotFoundException: java.util.HashMap$Entry
        ... 28 more

==============================================================================

BUILD FAILED

Total time: 2 mins 20.757 secs

我可以使用 -x lint 选项成功运行 gradle build,但想在不使用命令行选项的情况下进行构建.

I can run gradle build successfully with the -x lint option but want to build without using the commandline options.

推荐答案

我也遇到过类似的情况,但是我没有直接修改DSL,而是调用了configure:

I too faced a similar situation, but instead of just modifying the DSL directly, I called configure on it instead:

configure(android.lintOptions) {
    abortOnError false
}

因此,我能够为我想要的子项目禁用 abortOnError.最重要的是,您的 subproject 块应如下所示:

As a result, I was able to disable abortOnError for my desired subprojects. Bottom line, your subproject block should look like this:

subprojects {

    afterEvaluate {
        if (getPlugins().hasPlugin('android') ||
            getPlugins().hasPlugin('android-library')) {

            println name // for debugging

            configure(android.lintOptions) {
                abortOnError false
            }
        }

    }
}

这篇关于如何从多项目目录的顶层禁用 Android Gradle 插件中的 lint abortOnError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:如何从多项目目录的顶层禁用 Android Gradle 插件中

基础教程推荐