gradle - 将外部插件应用于子项目的子集

标签 gradle groovy

我正在使用Gradle SSH Plugin将某些但不是全部子项目部署到两个不同的远程机器上。我想在主构建脚本中配置这些 Remote ,以避免重复,但是无法按照以下方法应用插件:

configure([
    project(':Subproject1'), project(':Subproject5'), project(':Subproject7')
])
{
    buildscript {
        dependencies {
            classpath 'org.hidetake:gradle-ssh-plugin:2.4.2'
        }
    }

    apply plugin: "org.hidetake.ssh"

    ssh.settings {
        user = getProperty('ssh.username')
        identity = file(getProperty('ssh.identity'))
        knownHosts = allowAnyHosts
    }

    remotes {
        tomcat {
            host = getProperty('ssh.hosts.tomcat')
        }
        jboss {
            host = getProperty('ssh.hosts.jboss')
        }
    }
}

Gradle失败,返回> Plugin with id 'org.hidetake.ssh' not found

当每个项目应用配置闭包的内容时,一切都很好。我该如何优雅地解决这个问题?

最佳答案

在这里进行猜测,因为我没有重现您的问题,但是buildscript块很特殊,因为它是在对构建文件进行常规常规分析之前预先解析的,并且我怀疑将其放入像您这样的项目块中不会起作用。

您是否尝试过将buildscript块移动到上面脚本中的根级别?

编辑1:老gradle论坛发布讨论,可以在here中找到

编辑2:根据评论添加一段代码。

要删除重复项并仅在一个地方定义说存储库引用,可以使用以下模式:

buildscript {
  ext.RepositoryConfigurator = {
    maven {
      credentials.username artifactoryReader
      credentials.password artifactoryReaderPwd
      url                  artifactoryReaderUrl
    }
    jcenter()
    mavenCentral()
  }

  ext.DependencyConfigurator = {
    classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:1.2"
  }

  ext.ResolutionConfigurator = {
    resolutionStrategy.cacheChangingModulesFor 60, 'minutes'
  }

  repositories             RepositoryConfigurator
  dependencies             DependencyConfigurator
  configurations.classpath ResolutionConfigurator
}

apply plugin: "some.plugin.requiring.above.classpath"

gradle.rootProject {
  buildscript { 
    repositories             RepositoryConfigurator
    dependencies             DependencyConfigurator
    configurations.classpath ResolutionConfigurator
  }
}

gradle.allprojects {  
  buildscript { 
    repositories             RepositoryConfigurator
    dependencies             DependencyConfigurator
    configurations.classpath ResolutionConfigurator
  }
}

换句话说:由于buildscript块是特殊的且已预先解析,因此您不能使用buildscript块中其他地方定义的内容。不过也可以朝另一个方向进行,即您可以在buildscript块中定义东西,然后在其他地方看到。我们可以使用它在buildscript块中一次定义存储库引用,然后在构建文件中的其他位置使用该引用。

上面的内容来自settings.gradle文件,因此它可能是也可能不是一个完美的选择,但应演示该想法。

关于gradle - 将外部插件应用于子项目的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42087903/

相关文章:

android - 无法解析 Twitter SDK

android - Gradle同步的Android Studio构建配置问题

android - AssertionError:根包必须初始化

java - 无法解析 ':app@debug/compileClasspath'的依赖项:gradle同步时无法解决com.google.android.things:androidthings:1.0错误

groovy - groovy 脚本中的测试步骤结果列表

ajax - 处理 Action 后如何查看和过滤Grails中的响应?

grails - Grails Spock测试特定异常

gradle - Gradle-如何为Exec类型的任务设置依赖项任务?

pdf - 如何将PDF转换为可浏览网络的图像?

Android Gradle 从 strings.xml 读取应用程序名称