From a44b938de62a54e0c787c13e40958982ae450be9 Mon Sep 17 00:00:00 2001 From: Paul Merlin Date: Mon, 13 Aug 2018 16:03:33 +0200 Subject: [PATCH 1/2] Introduce composite-build-logic sample With two included builds for build logic: - gradle/shared - gradle/plugins And a variety of dependencies including both the outer build and the plugins included build using the shared included build Signed-off-by: Paul Merlin --- samples/composite-build-logic/README.md | 14 ++ .../composite-build-logic/build.gradle.kts | 15 ++ .../gradle/plugins/build.gradle.kts | 23 +++ .../gradle/plugins/settings.gradle.kts | 0 .../src/main/kotlin/plugins/SampleTask.kt | 17 ++ .../kotlin/plugins/sample-plugin.gradle.kts | 19 ++ .../gradle/shared/build.gradle.kts | 10 ++ .../gradle/shared/settings.gradle.kts | 0 .../main/kotlin/shared/DependencyVersions.kt | 16 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52804 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + samples/composite-build-logic/gradlew | 169 ++++++++++++++++++ samples/composite-build-logic/gradlew.bat | 84 +++++++++ .../composite-build-logic/settings.gradle.kts | 20 +++ .../samples/CompositeBuildLogicSampleTest.kt | 34 ++++ 15 files changed, 426 insertions(+) create mode 100644 samples/composite-build-logic/README.md create mode 100644 samples/composite-build-logic/build.gradle.kts create mode 100644 samples/composite-build-logic/gradle/plugins/build.gradle.kts create mode 100644 samples/composite-build-logic/gradle/plugins/settings.gradle.kts create mode 100644 samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/SampleTask.kt create mode 100644 samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/sample-plugin.gradle.kts create mode 100644 samples/composite-build-logic/gradle/shared/build.gradle.kts create mode 100644 samples/composite-build-logic/gradle/shared/settings.gradle.kts create mode 100644 samples/composite-build-logic/gradle/shared/src/main/kotlin/shared/DependencyVersions.kt create mode 100644 samples/composite-build-logic/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/composite-build-logic/gradle/wrapper/gradle-wrapper.properties create mode 100755 samples/composite-build-logic/gradlew create mode 100644 samples/composite-build-logic/gradlew.bat create mode 100644 samples/composite-build-logic/settings.gradle.kts create mode 100644 subprojects/samples-tests/src/test/kotlin/org/gradle/kotlin/dsl/samples/CompositeBuildLogicSampleTest.kt diff --git a/samples/composite-build-logic/README.md b/samples/composite-build-logic/README.md new file mode 100644 index 000000000..b605d28f3 --- /dev/null +++ b/samples/composite-build-logic/README.md @@ -0,0 +1,14 @@ +composite-build-logic +===================== + +Demonstrates how to use [Composite Builds](https://docs.gradle.org/current/userguide/composite_builds.html) +for build logic. + +The build in the [`build-logic`](./build-logic) directory publishes a Gradle Plugin. +The build in this directory includes the `build-logic` build and uses the Gradle Plugin for its build logic. + +Run with: + + ./gradlew sample + +See [settings.gradle.kts](./settings.gradle.kts) to see how to include builds and do dependency substitution. diff --git a/samples/composite-build-logic/build.gradle.kts b/samples/composite-build-logic/build.gradle.kts new file mode 100644 index 000000000..ea52ef875 --- /dev/null +++ b/samples/composite-build-logic/build.gradle.kts @@ -0,0 +1,15 @@ +import shared.* + +plugins { + id("plugins.sample-plugin") +} + +tasks { + sample { + message.set("Hello included build logic!") + } +} + +dependencies { + implementation(DependencyVersions.javax.measure.ri.notation) +} diff --git a/samples/composite-build-logic/gradle/plugins/build.gradle.kts b/samples/composite-build-logic/gradle/plugins/build.gradle.kts new file mode 100644 index 000000000..528b4f74f --- /dev/null +++ b/samples/composite-build-logic/gradle/plugins/build.gradle.kts @@ -0,0 +1,23 @@ +import shared.* + +plugins { + `kotlin-dsl` +} + +buildscript { + dependencies { + classpath("composite-build-logic:shared:latest-integration") + } +} + +group = "org.gradle.kotlin.dsl.samples.composite-build-logic" +version = "1.0" + +repositories { + jcenter() +} + +dependencies { + implementation(DependencyVersions.javax.measure.ri.notation) + implementation("composite-build-logic:shared:latest-integration") +} diff --git a/samples/composite-build-logic/gradle/plugins/settings.gradle.kts b/samples/composite-build-logic/gradle/plugins/settings.gradle.kts new file mode 100644 index 000000000..e69de29bb diff --git a/samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/SampleTask.kt b/samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/SampleTask.kt new file mode 100644 index 000000000..4703ed2ed --- /dev/null +++ b/samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/SampleTask.kt @@ -0,0 +1,17 @@ +package plugins + +import org.gradle.api.* +import org.gradle.api.tasks.* +import org.gradle.kotlin.dsl.* + + +open class SampleTask : DefaultTask() { + + @Input + val message = project.objects.property() + + @TaskAction + fun sample() { + logger.lifecycle(message.get()) + } +} diff --git a/samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/sample-plugin.gradle.kts b/samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/sample-plugin.gradle.kts new file mode 100644 index 000000000..850185d46 --- /dev/null +++ b/samples/composite-build-logic/gradle/plugins/src/main/kotlin/plugins/sample-plugin.gradle.kts @@ -0,0 +1,19 @@ +package plugins + +import shared.* + +plugins { + `java-library` +} + +dependencies { + "api"(DependencyVersions.javax.measure.api.notation) +} + +repositories { + jcenter() +} + +tasks.register("sample") { + message.set("SampleTask executed!") +} diff --git a/samples/composite-build-logic/gradle/shared/build.gradle.kts b/samples/composite-build-logic/gradle/shared/build.gradle.kts new file mode 100644 index 000000000..881309632 --- /dev/null +++ b/samples/composite-build-logic/gradle/shared/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + `kotlin-dsl` +} + +group = "org.gradle.kotlin.dsl.samples.composite-build-logic" +version = "1.0" + +repositories { + jcenter() +} diff --git a/samples/composite-build-logic/gradle/shared/settings.gradle.kts b/samples/composite-build-logic/gradle/shared/settings.gradle.kts new file mode 100644 index 000000000..e69de29bb diff --git a/samples/composite-build-logic/gradle/shared/src/main/kotlin/shared/DependencyVersions.kt b/samples/composite-build-logic/gradle/shared/src/main/kotlin/shared/DependencyVersions.kt new file mode 100644 index 000000000..249eaedc6 --- /dev/null +++ b/samples/composite-build-logic/gradle/shared/src/main/kotlin/shared/DependencyVersions.kt @@ -0,0 +1,16 @@ +package shared + +object DependencyVersions { + + object javax { + object measure { + val api = DependencyVersion("javax.measure", "unit-api", "1.0") + val ri = DependencyVersion("tec.units", "unit-ri", "1.0.3") + } + } +} + +data class DependencyVersion(val group: String, val name: String, val version: String) { + val notation: String + get() = "$group:$name:$version" +} diff --git a/samples/composite-build-logic/gradle/wrapper/gradle-wrapper.jar b/samples/composite-build-logic/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d4046a6637410b7fe15a04b5b0746c0ba4b7a365 GIT binary patch literal 52804 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 P6A%($1542Q?YI929T5o( literal 0 HcmV?d00001 diff --git a/samples/composite-build-logic/gradle/wrapper/gradle-wrapper.properties b/samples/composite-build-logic/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..24bb691c7 --- /dev/null +++ b/samples/composite-build-logic/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://repo.gradle.org/gradle/kotlin-dsl-snapshots-local/gradle-kotlin-dsl-5.0-20181019093416+0000-all.zip diff --git a/samples/composite-build-logic/gradlew b/samples/composite-build-logic/gradlew new file mode 100755 index 000000000..9aa616c27 --- /dev/null +++ b/samples/composite-build-logic/gradlew @@ -0,0 +1,169 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/composite-build-logic/gradlew.bat b/samples/composite-build-logic/gradlew.bat new file mode 100644 index 000000000..f9553162f --- /dev/null +++ b/samples/composite-build-logic/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/composite-build-logic/settings.gradle.kts b/samples/composite-build-logic/settings.gradle.kts new file mode 100644 index 000000000..ad2282993 --- /dev/null +++ b/samples/composite-build-logic/settings.gradle.kts @@ -0,0 +1,20 @@ +val buildLogicGroup = "composite-build-logic" + +listOf("shared", "plugins").forEach { included -> + includeBuild("gradle/$included") { + dependencySubstitution { + substitute(module("$buildLogicGroup:$included")).with(project(":")) + } + } +} + +// Work around for https://github.com/gradle/gradle-native/issues/522 +pluginManagement { + resolutionStrategy { + eachPlugin { + when (requested.id.id) { + "plugins.sample-plugin" -> useModule("$buildLogicGroup:plugins:latest-integration") + } + } + } +} diff --git a/subprojects/samples-tests/src/test/kotlin/org/gradle/kotlin/dsl/samples/CompositeBuildLogicSampleTest.kt b/subprojects/samples-tests/src/test/kotlin/org/gradle/kotlin/dsl/samples/CompositeBuildLogicSampleTest.kt new file mode 100644 index 000000000..6cde686aa --- /dev/null +++ b/subprojects/samples-tests/src/test/kotlin/org/gradle/kotlin/dsl/samples/CompositeBuildLogicSampleTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2018 the original author or authors. + * + * Licensed 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. + */ + +package org.gradle.kotlin.dsl.samples + +import org.hamcrest.CoreMatchers.containsString +import org.junit.Assert.assertThat +import org.junit.Test + + +class CompositeBuildLogicSampleTest : AbstractSampleTest("composite-build-logic") { + + @Test + fun `can apply and configure plugin from included build`() { + + assertThat( + build(":sample").output, + containsString("Hello included build logic!") + ) + } +} From c64a1187c73db81d038049b544509840880c23d5 Mon Sep 17 00:00:00 2001 From: Paul Merlin Date: Sat, 20 Oct 2018 16:27:12 +0200 Subject: [PATCH 2/2] Update sample README Signed-off-by: Paul Merlin --- samples/composite-build-logic/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/samples/composite-build-logic/README.md b/samples/composite-build-logic/README.md index b605d28f3..1d2a83d7b 100644 --- a/samples/composite-build-logic/README.md +++ b/samples/composite-build-logic/README.md @@ -4,8 +4,11 @@ composite-build-logic Demonstrates how to use [Composite Builds](https://docs.gradle.org/current/userguide/composite_builds.html) for build logic. -The build in the [`build-logic`](./build-logic) directory publishes a Gradle Plugin. -The build in this directory includes the `build-logic` build and uses the Gradle Plugin for its build logic. +The outer build includes two other builds: +- `gradle/shared` +- `gradle/plugins` + +Both the outer build and `gradle/plugins` depend on `gradle/shared` in several ways. Run with: