Build: Fail if any libs depend on non-core libs (#29336)
Fails the build if any subprojects of `:libs` have dependencies in `:libs` except for `:libs:elasticsearch-core`. Since we now have three places where we resolve project substitutions I've added `dependencyToProject` to `project.ext` in all projects. It resolves both `project` style dependencies and "external" style (like "org.elasticsearch:elasticsearch-core:${version}") dependencies to `Project`s using the `projectSubstitutions`. I use this new function all three places where resovle project substitutions. Finally this pulls `apply plugin: 'elasticsearch.build'` out of `libs/*/build.gradle` and into a subprojects clause in `libs/build.gradle`. I do this entirely so that I can call `tasks.precommit.dependsOn checkDependencies` without waiting for the subprojects to be evaluated or worrying about whether or not they have `precommit` set up in a normal way.
This commit is contained in:
parent
62e33eeef3
commit
69aabb7e40
37
build.gradle
37
build.gradle
|
@ -231,6 +231,23 @@ subprojects {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gradle only resolve project substitutions during dependency resolution but
|
||||||
|
* we sometimes want to do the resolution at other times. This creates a
|
||||||
|
* convenient method we can call to do it.
|
||||||
|
*/
|
||||||
|
ext.dependencyToProject = { Dependency dep ->
|
||||||
|
if (dep instanceof ProjectDependency) {
|
||||||
|
return dep.dependencyProject
|
||||||
|
} else {
|
||||||
|
String substitution = projectSubstitutions.get("${dep.group}:${dep.name}:${dep.version}")
|
||||||
|
if (substitution != null) {
|
||||||
|
return findProject(substitution)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
project.afterEvaluate {
|
project.afterEvaluate {
|
||||||
configurations.all {
|
configurations.all {
|
||||||
resolutionStrategy.dependencySubstitution { DependencySubstitutions subs ->
|
resolutionStrategy.dependencySubstitution { DependencySubstitutions subs ->
|
||||||
|
@ -249,11 +266,11 @@ subprojects {
|
||||||
Closure sortClosure = { a, b -> b.group <=> a.group }
|
Closure sortClosure = { a, b -> b.group <=> a.group }
|
||||||
Closure depJavadocClosure = { dep ->
|
Closure depJavadocClosure = { dep ->
|
||||||
if (dep.group != null && dep.group.startsWith('org.elasticsearch')) {
|
if (dep.group != null && dep.group.startsWith('org.elasticsearch')) {
|
||||||
String substitution = project.ext.projectSubstitutions.get("${dep.group}:${dep.name}:${dep.version}")
|
Project upstreamProject = dependencyToProject(dep)
|
||||||
if (substitution != null) {
|
if (upstreamProject != null) {
|
||||||
project.javadoc.dependsOn substitution + ':javadoc'
|
project.javadoc.dependsOn "${upstreamProject.path}:javadoc"
|
||||||
String artifactPath = dep.group.replaceAll('\\.', '/') + '/' + dep.name.replaceAll('\\.', '/') + '/' + dep.version
|
String artifactPath = dep.group.replaceAll('\\.', '/') + '/' + dep.name.replaceAll('\\.', '/') + '/' + dep.version
|
||||||
project.javadoc.options.linksOffline artifactsHost + "/javadoc/" + artifactPath, "${project.project(substitution).buildDir}/docs/javadoc/"
|
project.javadoc.options.linksOffline artifactsHost + "/javadoc/" + artifactPath, "${upstreamProject.buildDir}/docs/javadoc/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -275,17 +292,7 @@ gradle.projectsEvaluated {
|
||||||
}
|
}
|
||||||
configurations.all {
|
configurations.all {
|
||||||
dependencies.all { Dependency dep ->
|
dependencies.all { Dependency dep ->
|
||||||
Project upstreamProject = null
|
Project upstreamProject = dependencyToProject(dep)
|
||||||
if (dep instanceof ProjectDependency) {
|
|
||||||
upstreamProject = dep.dependencyProject
|
|
||||||
} else {
|
|
||||||
// gradle doesn't apply substitutions until resolve time, so they won't
|
|
||||||
// show up as a ProjectDependency above
|
|
||||||
String substitution = projectSubstitutions.get("${dep.group}:${dep.name}:${dep.version}")
|
|
||||||
if (substitution != null) {
|
|
||||||
upstreamProject = findProject(substitution)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (upstreamProject != null) {
|
if (upstreamProject != null) {
|
||||||
if (project.path == upstreamProject.path) {
|
if (project.path == upstreamProject.path) {
|
||||||
// TODO: distribution integ tests depend on themselves (!), fix that
|
// TODO: distribution integ tests depend on themselves (!), fix that
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
subprojects {
|
||||||
|
/*
|
||||||
|
* All subprojects are java projects using Elasticsearch's standard build
|
||||||
|
* tools.
|
||||||
|
*/
|
||||||
|
apply plugin: 'elasticsearch.build'
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Subprojects may depend on the "core" lib but may not depend on any
|
||||||
|
* other libs. This keeps are dependencies simpler.
|
||||||
|
*/
|
||||||
|
project.afterEvaluate {
|
||||||
|
configurations.all { Configuration conf ->
|
||||||
|
dependencies.all { Dependency dep ->
|
||||||
|
Project depProject = dependencyToProject(dep)
|
||||||
|
if (depProject != null
|
||||||
|
&& false == depProject.path.equals(':libs:elasticsearch-core')
|
||||||
|
&& depProject.path.startsWith(':libs')) {
|
||||||
|
throw new InvalidUserDataException("projects in :libs "
|
||||||
|
+ "may not depend on other projects libs except "
|
||||||
|
+ ":libs:elasticsearch-core but "
|
||||||
|
+ "${project.path} depends on ${depProject.path}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,7 +19,6 @@ import org.elasticsearch.gradle.precommit.PrecommitTasks
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
apply plugin: 'elasticsearch.build'
|
|
||||||
apply plugin: 'nebula.optional-base'
|
apply plugin: 'nebula.optional-base'
|
||||||
apply plugin: 'nebula.maven-base-publish'
|
apply plugin: 'nebula.maven-base-publish'
|
||||||
apply plugin: 'nebula.maven-scm'
|
apply plugin: 'nebula.maven-scm'
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
import org.elasticsearch.gradle.precommit.PrecommitTasks
|
import org.elasticsearch.gradle.precommit.PrecommitTasks
|
||||||
|
|
||||||
apply plugin: 'elasticsearch.build'
|
|
||||||
apply plugin: 'nebula.maven-base-publish'
|
apply plugin: 'nebula.maven-base-publish'
|
||||||
apply plugin: 'nebula.maven-scm'
|
apply plugin: 'nebula.maven-scm'
|
||||||
|
|
||||||
|
@ -39,7 +38,7 @@ dependencies {
|
||||||
testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"
|
testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"
|
||||||
testCompile "junit:junit:${versions.junit}"
|
testCompile "junit:junit:${versions.junit}"
|
||||||
testCompile "org.hamcrest:hamcrest-all:${versions.hamcrest}"
|
testCompile "org.hamcrest:hamcrest-all:${versions.hamcrest}"
|
||||||
|
|
||||||
if (isEclipse == false || project.path == ":libs:elasticsearch-nio-tests") {
|
if (isEclipse == false || project.path == ":libs:elasticsearch-nio-tests") {
|
||||||
testCompile("org.elasticsearch.test:framework:${version}") {
|
testCompile("org.elasticsearch.test:framework:${version}") {
|
||||||
exclude group: 'org.elasticsearch', module: 'elasticsearch-nio'
|
exclude group: 'org.elasticsearch', module: 'elasticsearch-nio'
|
||||||
|
|
|
@ -19,8 +19,6 @@ import org.elasticsearch.gradle.precommit.PrecommitTasks
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
apply plugin: 'elasticsearch.build'
|
|
||||||
|
|
||||||
archivesBaseName = 'elasticsearch-grok'
|
archivesBaseName = 'elasticsearch-grok'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
apply plugin: 'elasticsearch.build'
|
|
||||||
|
|
||||||
test.enabled = false
|
test.enabled = false
|
||||||
|
|
||||||
// test depend on ES core...
|
// test depend on ES core...
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
import org.elasticsearch.gradle.precommit.PrecommitTasks
|
import org.elasticsearch.gradle.precommit.PrecommitTasks
|
||||||
|
|
||||||
apply plugin: 'elasticsearch.build'
|
|
||||||
apply plugin: 'nebula.maven-base-publish'
|
apply plugin: 'nebula.maven-base-publish'
|
||||||
apply plugin: 'nebula.maven-scm'
|
apply plugin: 'nebula.maven-scm'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue