当前位置: 首页 > 知识库问答 >
问题:

多项目构建多设置分级文件

燕智
2023-03-14

我有以下项目结构

-->Starnderd Location
        -->Project1 
           -->settings.gradle 
           -->build.gradle
           -->Subproject11
              -->build.gradle
           -->Subproject12
              -->build.gradle
        -->Project2 
           -->settings.gradle 
           -->build.gradle
           -->Subproject21
              -->build.gradle
           -->Subproject22
              -->build.gradle
        -->build.gradle
        -->settings.gradle

上述项目结构的思想是:多个项目包含多个子项目,每个项目都可以依赖于其他项目。此外,项目中的子项目可能与同一项目中的其他子项目有依赖关系。项目将在根中的settings.gradle中指定。同时,每个项目中的gradle会说出该特定项目的子项目是什么。

我的设置.根部的Gradle看起来像

include 'Project1',
         'Project2'

和Project1设置。Gradle将看起来像

include 'SubProject11'
         'SubProject12'

其他依赖关系顺序是在相应的build.gradle文件中定义的,如果我在根位置(标准位置)内进行gradle clean build install,它似乎不会使用项目级别settings.gradle文件中的配置。

我在这里做错了什么?

共有1个答案

漆雕亮
2023-03-14

我能够用一种比较干净的方法解决这个问题。改进当然是受欢迎的!

虽然Gradle不支持多个settings.Gradle脚本,但可以创建单独的子项目,每个子项目都具有自己的settings.Gradle文件。假设你有多个项目A,它依赖于多个项目B,每个项目都有自己的子项目。您的目录结构可能如下所示:

A
- settings.gradle
- foo
- faz
\ B
  - settings.gradle
  - bar
  - bap

Gradle希望A/settings.Gradle的外观如下所示:

include ':foo', ':faz', 'B:bar', 'B:bap'
apply from: 'B/settings.gradle'
include ':foo', ':faz'

如果尝试此操作,您将发现Gradle失败,因为它为:bar:bap生成了错误的projectdir。它错误地假设B的includes是相对于settingsdir的,当从该项目根目录调用Gradle时,a/恰好是a/。要解决此问题,可以添加另一个脚本,如b/settings-parent.gradle(确切名称不重要):

apply from: 'settings.gradle'

def updateProjectPaths(Set<ProjectDescriptor> projects) {
    projects.each { ProjectDescriptor project ->
        String relativeProjectPath = project.projectDir.path.replace(settingsDir.path, "")
        project.projectDir = new File("B/$relativeProjectPath")
        // Recursively update paths for all children
        updateProjectPaths(project.children)
    }
}

updateProjectPaths(rootProject.children)

这会将settingsdir.path剥离,并将路径前缀为b/。这可以扩展到settings[-parent].gradle文件的多层,方法是让每一层都将自己添加到路径上。现在将此脚本应用于A/settings.gradle:

apply from: 'B/settings-parent.gradle'
include ':foo', ':faz'

使用此方案,新的B项目不会不必要地破坏A/settings.gradle,并且可以使用所有项目,而无需显式引用B子项目。例如,如果':foo'希望使用'b:bap',它可以简单地声明:

compile project(':bap')
 类似资料:
  • 多项目 通常在一个工程中构建多个项目间会有关联,尤其是它们都依赖一个项目时可以很容易的更新项目 在一个工程中每个子项目都会有自己的源代码目录、生成各自的jar包当执行 package 时. 一个项目通过申明一个 Project 类型的懒值来定义,例如: lazy val util = project lazy val core = project 这个变量值名称将被用来当做 Project Id

  • 简介 每一个活跃的项目会随着时间慢慢增长的,一开始可能只是个很小的项目到后面可能包含很多包和类。为了提高可维护性和解藕的目的,你可能想把项目根据逻辑和功能来划分成一个个模块。模块通常按照等级来组织,相互之间可以定义依赖。 Gradle给项目模块化提供了强大的支持,在Gradle中每个模块都是一个项目,我们称之为多项目构建,这一章介绍Gradle的多项目构建。

  • 我有一个多项目分级建筑在当地工作。有一个父级文件build.gradle设置。gradle文件将项目分配给它们各自的分级生成文件: 错误仍然相同,build.gradle文件(父文件)无法识别依赖项任务查看调试语句,找到并识别子生成分级文件:使用生成文件'/var/../LoadRemote/RemoteLoad_build.gradle'计算项目':LoadRemote'。对加载构建文件显示相同

  • 我正在改变我们的项目,以使用gradle作为构建工具,但正在与2个问题斗争;

  • 主要内容:多项目构建的结构,指定常规构建配置,项目指定配置和依赖关系,Gradle多项目构建的示例,子项目配置,参考可以轻松处理各种大小规模的项目。小项目由一个单一的构建文件和一个源代码树构成。 大项目可以将其拆分成更小的,相互依赖的模块,以便更容易理解。Gradle完美支持这种多项目构建的场景。 多项目构建的结构 这种构建有各种形状和大小,但它们都有一些共同的特点 - 在项目的根目录或主目录中都有一个文件。 根目录或主目录都有一个文件。 具有自己的构建文件的子目录(某些多项目构建可能会省略子项