为什么./gradlew clean build和./gradlew clean:build之间有区别?

时间:2018-11-20 13:57:16

标签: gradle gradlew

我有以下情况:

我有一个包含多个子项目的项目。今天,我尝试通过命令行使用gradle构建项目。

当我执行./gradlew clean :build时构建成功,但是没有执行./gradlew clean build。根据激活的子项目,它会导致不同的错误。 那是为什么?应该不一样吗?

这两个命令是直接在彼此之后直接执行的,无需更改代码,并且从同一目录(settings.gradle所在的基本目录。

Intellij的gradle-refresh工作正常,构建成功(但如果相关,则在构建服务器上失败)。

根据文档https://docs.gradle.org/current/userguide/command_line_interface.html#executing_tasks_in_multi_project_builds,我假设它会执行相同的操作,因为未指定任何子项目,并且对所有子模块都执行了构建任务。根项目中没有名为build的文件夹,因此不会引起混淆。我解释错了吗?

我在线搜索,但是找不到结果,因为大多数搜索引擎无法识别:,并且colon导致不相关的结果,例如What is the colon operator in Gradle?。 / p>

gradle版本为4.10.2

如果您需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

./gradlew clean :build./gradlew clean build之间存在差异,这就是为什么您有不同的行为的原因:在第一种情况下,您使用合格的任务名称,在另一种情况下,您使用简单的任务名称。这些文档herehere解释了以下两种执行任务的方法:

  • 使用简单任务名称(./gradlew test):
  

第一种方法类似于单项目用例,但是在多项目构建的情况下,Gradle的工作方式略有不同。 gradle test命令将在相对于当前工作目录具有该任务的任何子项目中执行测试任务。因此,如果您从根项目目录运行命令,则将在api,shared,services:shared和services:webservice中运行测试。如果您从services项目目录中运行命令,则只会在services:shared和services:webservice中执行任务。

=>因此,在根项目目录中执行./gradlew build将触发对根项目和所有子项目执行build任务

  • 使用合格的任务名称(./gradlew :build
  

要对执行的内容进行更多控制,请使用限定名称(提到的第二种方法)。这些路径与目录路径一样,但是使用“:”代替“ /”或“ \”。如果路径以“:”开头,则相对于根项目解析路径。换句话说,开头的“:”代表根项目本身。所有其他冒号都是路径分隔符。

=>执行./gradlew :build,您将“仅”执行build的{​​{1}}任务

正如我在评论中所说,您的迁移在一个或多个子项目中存在一些问题,但是,如果仅执行Root项目构建(rootProject),则不会看到这些错误