shell 无法识别 gradle wrapper

shell does not recognize graddle wrapper

我有 shell 脚本如下 -

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

但是 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.gradletest-runner 文件夹中查找,即使它与 test-runner 处于同一级别?

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


Since gradlew is on project root, it is invoked as ../gradlew clean which is one level above the backend_test.sh file -

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

If I move backend_test.sh also on root level and update shell file to invoke gradlew as ./gradlew clean then there is no error.

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

Running shell locally i.e. ./backend_test.sh gets me following error

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