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.gradle
在 test-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 失败。
我有 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.gradle
在 test-runner
文件夹中查找,即使它与 test-runner
处于同一级别?
所有相对路径都是相对于当前工作目录进行评估的。如果您使用 shell,工作目录通常会显示在 shell 提示符中。你的工作目录和当前处理文件的目录之间没有link。此行为解释了您的所有问题:
Since
gradlew
is on project root, it is invoked as../gradlew clean
which is one level above thebackend_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 invokegradlew
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 失败。