Gradle 全局构建目录

Posted

技术标签:

【中文标题】Gradle 全局构建目录【英文标题】:Gradle global build directory 【发布时间】:2014-06-13 23:47:12 【问题描述】:

我想知道是否可以将 Gradle 配置为对所有项目使用一个全局 build 目录?我需要这个,因为我将所有项目都存储在 Google Drive 文件夹中(用于备份和从其他设备快速访问),并且当我构建项目时,Google Drive 正在加载 CPU,同时同步项目 build 目录。所以我想将build 目录移到 Google Drive 之外。

对于那些想要使用 RAM 磁盘作为 build 目录的存储来构建项目的人来说,此选项也很有用。

【问题讨论】:

没有.driveignore 文件吗 ;-) ? @PaulVerest 可能是。但现在我不将项目存储在任何云存储中,并且仅将全局构建目录用于构建过程提升和快速清理。 试试版本控制,比如 Git。 @TWiStErRob 不,我使用的是 SSD,没有进行任何测量。我的主要目标是将所有项目的构建目录移动到一个地方以轻松清理磁盘空间。现在我没有使用 RAM 驱动器,因为它不会显着提升性能,但我的主目录中仍然有全局构建目录。 @mixel 感谢您的详细回复。提示:考虑SSD aging,即使它同样快。 【参考方案1】:

感谢彼得·尼德维泽。由于更多细节,我决定发布自己的答案。

要设置全局构建目录,您需要将这些行添加到~/.gradle/init.gradle

gradle.projectsLoaded 
    rootProject.allprojects 
        buildDir = "/path/to/build/$rootProject.name/$project.name"
    

RAM 磁盘上拥有全局build 目录是不错的选择。

如果您是 macOS (OS X) 用户,您可以这样做:

diskutil erasevolume HFS+ 'RAMDiskName' `hdiutil attach -nomount ram://XXXXXX`

其中XXXXXX 是 512 字节块的计数(例如,对于 128MB RAM 磁盘,它是 262114)

buildDir 行将是:

buildDir = "/Volumes/RAMDiskName/$rootProject.name/$project.name"

您还可以扩展配置到:

    从环境变量中获取全局构建路径或回退到项目目录内的build 目录; 在路径中包含项目组,这使路径更加独特,特别是如果您有多个同名项目。

~/.gradle/init.gradle

def configProject(p, buildDir) 
    p.buildDir = "$buildDir/$p.name"  
    p.subprojects  s ->
        configProject(s, "$p.buildDir")
    


def buildDir = System.env.GRADLE_GLOBAL_BUILD_PATH
if (!buildDir?.trim()) 
    buildDir = "build"


gradle.projectsLoaded 
    if (ext.has("group")) 
        buildDir += "/$ext.group"
    
    configProject(rootProject, buildDir)

在项目settings.gradle中:

gradle.ext.group = 'com.example.yourproject'

您也可以在项目 build.gradle 中使用此设置来设置项目组,但这是可选的:

allprojects 
    ...
    group gradle.ext.group

【讨论】:

【参考方案2】:

build.gradle:

def baseDir = "/global/build/dir/$project.name"
buildDir = baseDir + "/root"
subprojects 
    buildDir = baseDir + project.path.replaceFirst(":", "/").replace(":", ".")

【讨论】:

不错。但是有没有像环境变量这样的设置?所以我可以调整全局 gradle 行为,而不是每个项目。 您的意思不是每个构建,而是所有构建?您可以将代码放入~/.gradle/init.gradle(需要稍作修改)。 感谢您的帮助!我赞成你的回答,但补充说我的问题完全可以接受。 谢谢。这在具有深度嵌套模块目录的项目中效果很好。【参考方案3】:

你也可以走相反的路。将build 文件夹替换为全局文件夹。

    删除项目的build 文件夹 mklink /d ...disk\path\to\project\build ...RAM\path\to\project(或 Unix 中的 ln) 快速构建

您可以在 clean 任务中自动执行此操作,因此 gradlew clean 会清理文件夹内容并重新创建链接。

通过一些快速测试,Google 云端硬盘似乎无法识别 Windows 连接链接中的目录。它会同步文件夹,但不会同步内容。奇怪的是,如果我将文件上传到 Drive 到这些文件夹中,它们会同步到本地副本中。但是,如果我从磁盘中删除同步文件,则删除不会同步回来。似乎链接导致云端硬盘成为一种方式。

【讨论】:

以上是关于Gradle 全局构建目录的主要内容,如果未能解决你的问题,请参考以下文章

设置全局 gradle build dir 相对路径

Android Gradle 插件Android Studio 工程 Gradle 构建流程 ② ( settings.gradle 构建脚本分析 | 根目录下 build.gradle 分析 )

Gradle不在gradle构建上维护目录层次结构

Android Gradle 插件Gradle 构建机制 ② ( Groovy 语言 DSL 特性 | settings.gradle 配置文件解析 | 配置子模块工程目录 | 顶层配置 )

《第一行代码》读书笔记

Gradle 可以处理不符合默认约定的构建目录结构吗?