shell 无法识别 Gradle 包装器

问题描述

我有如下的 shell 脚本 -

enter image description here

由于 gradlew 位于项目根目录,因此它作为 ../gradlew clean 调用,比 backend_test.sh 文件高一级 -

enter image description here

但是 Gitlab ci 作业失败并出现以下错误 -

./test-runners/backend_test.sh: line 21: ../gradlew: No such file or directory

如果我也在根级别移动 backend_test.sh 并更新 shell 文件以将 gradlew 调用./gradlew clean,则没有错误。当 backend_test.sh 不在根级别时,我做错了什么?

更新:

在本地运行 shell,即 ./backend_test.sh 出现以下错误 -

Configure project : 
Evaluating root project 'test-runners' using build file 
'/Users/tarunkumar/dev/git/system-test/test-runners/build.gradle'.
All  projects evaluated.

FAILURE: Build Failed with an exception.

* What went wrong:
Task 'clean' not found in root project 'test-runners'.

为什么在 build.gradle 文件夹中查找 test-runner,即使它与 test-runner 处于同一级别?

解决方法

所有相对路径都相对于当前工作目录进行评估。如果您使用的是 shell,工作目录通常会显示在您的 shell 提示符中。您的工作目录和当前处理的文件的目录之间没有链接。此行为说明了您的所有问题:


由于 gradlew 位于项目根目录下,因此它作为 ../gradlew clean 调用,比 backend_test.sh 文件高一级 -

在 CI 服务器上,通常使用根目录作为工作目录来调用所有进程(我不确定 GitLab CI,但我猜它的行为也是如此)。现在 ../gradlew 将相对于您的根目录进行评估,这将不起作用,因为它在 GitLab CI 用作临时文件夹的任何父目录中搜索 gradlew。您可以通过在本地将 shell 导航到您的项目目录然后调用 test-runners/backend_test.sh 来检查此行为,它应该会导致相同的错误。

如果我也在根级别移动 backend_test.sh 并更新 shell 文件以将 gradlew 调用为 ./gradlew clean,则没有错误。

当然,只要脚本将从您的项目目录中调用,这是 CI 服务器上的默认值,正如我们已经注意到的那样。在本地,您只需导航到您的项目目录并调用 backend_test.sh

在本地运行 shell,即 ./backend_test.sh 出现以下错误

好吧,现在我们又遇到了同样的问题。您的脚本可以找到 ../gradlew 并调用 Gradle,但遗憾的是,Gradle 将评估工作目录以查找相关的 build.gradle 文件。但是现在工作目录位于您的 test-runners 文件夹中,Gradle 将在此文件夹中搜索 build.gradle 文件。如果该文件夹中没有 build.gradle 文件,Gradle 根本不在乎,而是假设有一个空的 build.gradle 文件。现在 Gradle 使用这个(空)项目来运行构建,但是由于(空)项目中没有任务 clean,Gradle 失败了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...