我正在使用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/