build.gradle:由于“没有这样的文件或目录”,命令行任务失败

Posted

技术标签:

【中文标题】build.gradle:由于“没有这样的文件或目录”,命令行任务失败【英文标题】:build.gradle: commandLine task failed due to "No such file or directory" 【发布时间】:2021-11-21 23:27:16 【问题描述】:

tl;dr 问题:在我使用 android Studio 的 Mac 上,在 gradle 中运行 bash 脚本任务失败,因为“没有这样的文件或目录”错误,即使文件在那里。

背景: 我正在我的 Mac 上使用 Android Studio 构建一个 Android 应用程序,该应用程序需要构建一个 C SDK,我为此使用 NDK 和 CMake。在我的 APP_FOLDER/app/build.gradle 中,我试图在为 NDK 构建 CMake 之前运行一个脚本。这是所需的构建顺序:

app:runBuildScript
app:configureCMakeDebug
app:externalNativeBuildDebug
app:compileDebugSources
...

在 CMake 之前运行脚本的原因是因为脚本会设置 CMake 将使用的值。

这是我的应用程序/build.gradle

plugins 
    id 'com.android.application'


android 
    compileSdk 31

    defaultConfig 
        applicationId "com.example.sdk"
        minSdk 28
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild 
            cmake 
                cppFlags ''
            
            ndk 
                abiFilters 'armeabi-v7a'
            
        
    

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        
    
    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    
    externalNativeBuild 
        cmake 
            path file('src/main/cpp/CMakeLists.txt')
            version '3.21.3'
        
    


dependencies 

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'


task runBuildScript(type: Exec) 
    // commandLine 'source ./src/main/cpp/build-tools/bin/set-env.sh'
    workingDir './src/main/cpp/build-tools/bin'
    commandLine 'source ./set-env.sh'



project.afterEvaluate 
    tasks.getByName("buildCMakeDebug").dependsOn runBuildScript

问题: 由于错误,该脚本无法运行。这是我从 Android Studio 构建时收到的错误:

> Task :app:runBuildScript FAILED
Execution failed for task ':app:runBuildScript'.
> A problem occurred starting process 'command 'source ./set-env.sh''

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:runBuildScript'.
...
Caused by: java.io.IOException: Cannot run program "source ./set-env.sh" (in directory "/Users/xxxxxx/AndroidStudioProjects/SDKDemo/app/src/main/cpp/build-tools/bin"): error=2, No such file or directory

但是,文件位于:

88665a32ce18:bin XXXXX$ pwd
/Users/XXXXX/AndroidStudioProjects/SDKDemo/app/src/main/cpp/build-tools/bin
88665a32ce18:bin XXXXX$ ls
build-tools.sh  set-env.sh

知道为什么会这样吗?不确定它是否相关,但我 Mac 上的默认 shell 是 zsh。坚持了几天,感谢您的帮助。

【问题讨论】:

【参考方案1】:

仍然不确定为什么会这样,但我想出了一个解决方法:

    创建一个新的 .sh 文件 (source-settings.sh),其唯一任务是执行 source ./set-env.sh。 将commandLine 'source ./set-env.sh' 更改为commandLine "bash", "-c", './source-settings.sh'

【讨论】:

以上是关于build.gradle:由于“没有这样的文件或目录”,命令行任务失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 build.gradle 中定义和调用自定义方法

intellij idea更新gradle项目报错:Could not run build action using Gradle distribution

安卓导入别人的项目

java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor

android studio怎么设置gradle版本

“需要 Gradle 版本 2.10。”错误