我正在使用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
失败。
每个项目应用配置闭包的内容时,一切都很好。我怎样才能优雅地解决这个问题?
答案 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文件,因此可能适合也可能不适合,但应该展示这个想法。