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

Gradle 将外部插件应用于子项目的子集,gradle,groovy,Gradle,Groovy,我正在使用将一些(但不是所有)子项目部署到两台不同的远程机器上。我想在主构建脚本中配置这些远程设备以避免重复,但无法按照以下方式应用插件: configure([ project(':Subproject1'), project(':Subproject5'), project(':Subproject7') ]) { buildscript { dependencies { classpath 'org.hidetake:gradle-s

我正在使用将一些(但不是所有)子项目部署到两台不同的远程机器上。我想在主构建脚本中配置这些远程设备以避免重复,但无法按照以下方式应用插件:

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失败,未找到id为“org.hidetake.ssh”的插件


当配置闭包的内容应用于每个项目时,一切都很好。我怎样才能优雅地解决这个问题呢?

我在这里猜测,因为我没有重现您的问题,但是buildscript块是特殊的,因为它是在对构建文件进行常规groovy解析之前预解析的,我怀疑将它放在像您这样的项目块中是行不通的

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

编辑1:old gradle论坛发布讨论可以找到

编辑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文件,因此可能是完美的,也可能不是完美的,但应该说明这一点

是的,这是可行的,但是将
buildscript
块添加到根文件的顶部需要我也声明存储库-我通过
allprojects
这样做,然后被忽略。不管它值多少钱,这里有一个古老的线程,我在gradle论坛上或多或少地问了这个问题。阅读该线程可能会提供一些信息:不幸的是,在解析后,我陷入了
无法更改配置的依赖项:classpath。
第12行。事实上,是的,老格拉德尔2.14。啊,我不得不从rootProject和AllProject中删除
buildscript.DependencyConfigurator
。。。现在它起作用了