如何在构建外部配置Gradle插件?

rvpgvaaj  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(183)

如何将插件配置应用于构建外部的Gradle项目,以使其不包含在Git源代码控制中?

详细信息

我有一个Gradle项目,它使用gradle-git-properties插件基于项目的Git详细信息生成git.properties文件。

plugins {
    id 'java'
    id 'com.gorylenko.gradle-git-properties'
}

// Rest of build.gradle goes here

另外,我正在使用git working trees将我的项目 checkout 到本地的多个位置。然而,使用gradle-git-properties的项目在从链接的工作树运行时会失败,这是gradle-git-properties#14的错误。

$ ./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")))
    }
  }
}

这个解决方案的问题是它需要修改构建文件。这是一个共享仓库,我是唯一一个使用多个git工作树来访问它的人。因此,我不想在构建过程中包含这个解决方案。
是否有一种方法可以自动将此插件配置应用到构建文件或任何其他将与项目一起提交的文件中?

vcudknz3

vcudknz31#

可以使用Gradle initialization script,将插件配置放入外部文件中。
使用init脚本有几种方法:

  • 在命令行上指定文件。命令行选项为-I--init-script,后跟脚本的路径。[...]
  • 将名为init.gradle(对于Kotlin,则为init.gradle.kts)的文件放入*USER_HOME*/.gradle/目录。
  • 将以.gradle结尾(对于Kotlin,则为.init.gradle.kts)的文件放入*USER_HOME*/.gradle/init.d/目录。
  • 将以.gradle(对于Kotlin,则为.init.gradle.kts)结尾的文件放在Gradle发行版的*GRADLE_HOME*/init.d/目录中。
    一米十一分一秒
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")))
        }
      }
    }
  }
}

gitProperties配置包含在plugins.withId('com.gorylenko.gradle-git-properties')检查中,因为如果不使用gradle-git-properties插件,项目在使用此脚本时会失败。

相关问题