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

时间:2017-02-07 10:51:30

标签: gradle groovy

我正在使用Gradle SSH Plugin将一些但不是所有子项目部署到两个不同的远程计算机上。我想在主构建脚本中配置这些遥控器以避免重复,但不能按照以下方式应用插件:

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失败。

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

1 个答案:

答案 0 :(得分:1)

在这里猜测,因为我还没有复制你的问题,但是buildcript块很特别,因为它在构建文件的正常groovy解析之前被预先解析了,我怀疑它像你一样在项目块里面不行。

您是否尝试将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文件,因此可能适合也可能不适合,但应该展示这个想法。