如何解决shell 无法识别 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 提示符中。您的工作目录和当前处理的文件的目录之间没有链接。此行为说明了您的所有问题:
由于 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 失败了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。