Gradle全局构建目录

时间:2014-04-28 12:18:28

标签: build gradle google-drive-api global

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

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

3 个答案:

答案 0 :(得分:46)

感谢Peter Niederwieser。由于其他细节,我决定发表自己的答案。

要设置全局构建目录,您需要将这些行添加到〜/ .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}"

您也可以将配置扩展到:

  1. 从环境变量获取全局构建路径或回退到项目目录中的build目录;
  2. 在路径中包含项目组,这使得路径更加独特,尤其是如果您有多个具有相同名称的项目。
  3. <强>〜/ .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
    }
    

答案 1 :(得分:2)

的build.gradle:

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

答案 2 :(得分:0)

你也可以采取相反的方式。将build文件夹替换为全局文件夹。

  1. 删除项目的build文件夹
  2. mklink /d ...disk\path\to\project\build ...RAM\path\to\project(或Unix中的ln
  3. 快速构建
  4. 您可以在clean任务中自动执行此操作,以便gradlew clean清除文件夹内容并重新创建链接。

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