【问题标题】:gradle could not find other gradle scriptgradle 找不到其他 gradle 脚本
【发布时间】:2018-04-04 00:23:27
【问题描述】:
/--common
/--common/build.gradle
/--common/deploy.gradle
/--project1
/--project1/build.gradle

我有一个多项目结构,并从我的build.gradle 文件中提取重复代码并将其放入另一个文件deploy.gradle

我已将deploy.gradle 文件放入common 项目中,与build.gradle 文件处于同一文件夹级别。文件夹结构如上图所示。

common 项目的build.gradle 文件中,我可以使用语句引用该文件,

apply from: 'deploy.gradle'

这就像做梦一样,common 项目构建完美地从deploy.gradle 文件中调用任务。

当我尝试从其他项目之一引用deploy.gradle 文件时,问题就出现了。当我将apply... 语句添加到project1build.gradle 时,出现编译错误,

错误:(23, 0) 无法读取脚本 'C:\path-to-project1-script-file\deploy.gradle' 因为它不存在。

所以Gradle 只在project1 中寻找deploy.gradle 文件,即使我在project1 build.gradle 文件中设置了对common 项目的依赖项。

问题是我怎样才能使common项目中的deploy.gradleproject1可见。

【问题讨论】:

    标签: gradle build.gradle


    【解决方案1】:

    我们成功使用了以下项目布局

    ├── a
    │   └── build.gradle
    ├── b
    │   └── build.gradle
    ├── build.gradle
    ├── gradle-scripts
    │   └── deploy.gradle
    └── settings.gradle
    

    根项目的build.gradle 定义

    ext.gradleScript = { scriptName ->
        file("${rootProject.projectDir}/gradle-scripts/${scriptName}.gradle")
    }
    

    子项目以这种方式使用gradle-scripts 中的脚本

    apply from: gradleScript('deploy')
    

    项目的全部内容:

    $> find . -type f | while read file; do echo "--- $file ---" && cat $file; done
    --- ./a/build.gradle ---
    apply from: gradleScript('deploy')
    --- ./b/build.gradle ---
    apply from: gradleScript('deploy')
    --- ./build.gradle ---
    // Where common build logic is found
    ext.gradleScript = { scriptName ->
        file("${rootProject.projectDir}/gradle-scripts/${scriptName}.gradle")
    }
    --- ./gradle-scripts/deploy.gradle ---
    task myDeployTask {
        doLast { println 'common deploy logic goes here' }
    }
    --- ./settings.gradle ---
    include 'a', 'b'
    
    $> gradle -q b:myDeployTask
    common deploy logic goes here
    $>
    

    【讨论】:

    • 谢谢你,弗兰克。我正在尝试这种方法,但从 #a/build.gradle 收到一条错误消息,提示它找不到 gradleScript - 我是否必须在 settings.gradle 文件或我的 Intellij 项目配置中包含某些内容?我注意到您指定“${rootProject.projectDir}/”是否需要在 settings.gradle 文件中将其设置为属性/值对,如果需要,我将如何将其指定为相对路径?如果可以的话,一个例子会很有帮助
    • 我添加了演示项目的完整内容和一个示例 gradle 调用。您是否将您的项目包含在 settings.gradle 中?
    【解决方案2】:

    这是一个引用 common/deploy.gradle 的示例 project1/build.gradle

    // import myDeploy task
    apply from: "${rootDir}/common/deploy.gradle"
    
    task myProject1Task(dependsOn: 'myDeploy') {
        doLast {
            println 'TRACER myProject1Task'
        }
    }
    

    在多项目构建中区分projectDirrootDir 通常很重要。 projectDir是具体的子项目; rootDirsettings.gradle 所在的地方。

    【讨论】:

    • 嗨,迈克尔,谢谢您的回答。我正在尝试这种方法,但在设置 rootDir 时遇到问题。我的项目似乎只识别它所在的目录,即当我在 common rootDir = common 中工作或当我在 project1 中时 rootDir = project1 - 我似乎无法将项目配置为识别高于我的项目的级别我在里面,所以我无法访问其他项目中的公共目录。
    • 您有settings.gradle 文件吗?我在这里发布了我的示例 - github.com/codetojoy/easter_eggs_for_gradle/tree/master/…
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2017-12-27
    • 2021-01-28
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多