如何在构建外部配置Gradle插件且不纳入Git版本控制?
如何在不修改项目提交文件的前提下修复Git工作树的gradle-git-properties构建问题
问题背景
我有一个使用gradle-git-properties插件的Gradle项目,该插件用于根据Git信息生成git.properties文件,项目的基础插件配置如下:
plugins { id 'java' id 'com.gorylenko.gradle-git-properties' } // 其他build.gradle内容
我使用Git工作树在本地多个路径检出同一个项目,但在gradle-git-properties插件2.5.3版本之前,从链接工作树运行构建时会失败,报错信息如下:
$ ./gradlew generateGitProperties > Task :subproject:generateGitProperties FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':subproject:generateGitProperties'. > Error while evaluating property 'generatedProperties' of task ':subproject:generateGitProperties' > gradlegitproperties.org.eclipse.jgit.errors.RepositoryNotFoundException: repository not found: /Users/Me/my-project/.git/worktrees/my-project
我已经有临时修复配置,但不想提交到共享仓库:
gitProperties { Path dotGitPath = rootProject.layout.projectDirectory.asFile.toPath().resolve(".git") if (Files.isRegularFile(dotGitPath)) { Files.lines(dotGitPath).withCloseable { ditGitFileLines -> dotGitDirectory = ditGitFileLines .filter { it.startsWith("gitdir: ") } .map { it.substring('gitdir: '.length(), it.lastIndexOf('/.git/')) } .map { project.objects.directoryProperty().convention(project.layout.projectDirectory.dir(it)) } .findFirst() .orElse(project.objects.directoryProperty().convention(project.layout.projectDirectory.dir(".git"))) } } }
请问有没有办法在不修改项目提交文件的前提下,自动应用这个插件配置?
可行方案
1. Gradle初始化脚本(推荐)
Gradle支持通过初始化脚本在构建前注入配置,完全不需要修改项目仓库内的文件。
- 创建初始化脚本:新建一个
git-worktree-fix.gradle文件,内容如下:
import java.nio.file.Files import java.nio.file.Path allprojects { // 仅当项目应用了目标插件时才生效 plugins.withId('com.gorylenko.gradle-git-properties') { gitProperties { Path dotGitPath = rootProject.layout.projectDirectory.asFile.toPath().resolve(".git") if (Files.isRegularFile(dotGitPath)) { Files.lines(dotGitPath).withCloseable { ditGitFileLines -> dotGitDirectory = ditGitFileLines .filter { it.startsWith("gitdir: ") } .map { it.substring('gitdir: '.length(), it.lastIndexOf('/.git/')) } .map { project.objects.directoryProperty().convention(project.layout.projectDirectory.dir(it)) } .findFirst() .orElse(project.objects.directoryProperty().convention(project.layout.projectDirectory.dir(".git"))) } } } } }
- 加载脚本的方式:
- 全局生效:将脚本放到
~/.gradle/init.d/目录下,所有本地Gradle项目都会自动加载该配置 - 单个项目生效:运行构建时指定脚本路径:
./gradlew --init-script /path/to/git-worktree-fix.gradle generateGitProperties - 永久绑定单个项目:在项目根目录创建
gradle.properties(如果没有的话),添加如下内容(路径需写绝对路径):
然后把这个org.gradle.init.scripts=/path/to/git-worktree-fix.gradlegradle.properties加入.gitignore,避免提交到仓库。
- 全局生效:将脚本放到
2. 本地项目级Gradle配置文件
如果项目的.gitignore已经包含了gradle-local.properties或类似本地配置文件,可以在其中结合Gradle的extra属性,但这种方式需要项目构建文件预留读取逻辑,不如初始化脚本直接。
内容的提问来源于stack exchange,提问作者M. Justin
相关产品推荐
相关产品推荐

