【问题标题】:How can I configure a Gradle plugin externally to the build?如何在构建外部配置 Gradle 插件?
【发布时间】:2022-07-23 03:30:39
【问题描述】:

如何将插件配置应用到构建外部的 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 将我的项目检出到本地的多个位置。但是,根据gradle-git-properties#14,使用 gradle-git-properties 的项目在从链接的工作树运行时会失败。

$ ./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 工作树访问它的人。因此,我不想在构建本身中包含此解决方法。

有没有一种方法可以自动将此插件配置从外部应用到构建文件或将与项目一起提交的任何其他文件?

【问题讨论】:

    标签: git gradle gradle-plugin


    【解决方案1】:

    可以使用 Gradle initialization script,将插件配置放入外部文件。

    有几种方法可以使用初始化脚本:

    • 在命令行上指定一个文件。命令行选项是-I--init-script,后跟脚本的路径。 […]
    • 将一个名为 init.gradle(或 Kotlin 的 init.gradle.kts)的文件放在 _USER_HOME_/.gradle/ 目录中。
    • 将一个以 .gradle(或 Kotlin 的 .init.gradle.kts)结尾的文件放在 _USER_HOME_/.gradle/init.d/ 目录中。
    • 在 Gradle 发行版的 _GRADLE_HOME_/init.d/ 目录中放置一个以 .gradle(或 Kotlin 的 .init.gradle.kts)结尾的文件。 […]

    ~/.gradle/init.d/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-git-properties 插件的项目在使用 gitProperties 配置时会失败,因此它被包裹在 plugins.withId('com.gorylenko.gradle-git-properties') 检查中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多