diff --git a/.gitignore b/.gitignore index 69fcbe7..6f8a769 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -./build/ +build/ +!autoplay/src/test/resources/sample-app/app/build/ -autoplay/build/ captures/ out/ userHome/ diff --git a/autoplay/build.gradle.kts b/autoplay/build.gradle.kts index cc5be08..ab08d4a 100644 --- a/autoplay/build.gradle.kts +++ b/autoplay/build.gradle.kts @@ -12,10 +12,10 @@ repositories { } dependencies { - compileOnly("com.android.tools.build:gradle:3.0.1") + compileOnly("com.android.tools.build:gradle:3.2.0") - implementation(kotlin("stdlib", "1.2.61")) - implementation("com.google.apis:google-api-services-androidpublisher:v3-rev12-1.23.0") + implementation(kotlin("stdlib", "1.2.71")) + implementation("com.google.apis:google-api-services-androidpublisher:v3-rev30-1.25.0") testImplementation("junit:junit:4.12") testImplementation("com.google.truth:truth:0.40") @@ -33,7 +33,7 @@ gradlePlugin { } group = "de.halfbit" -version = "0.3.3" +version = "1.0.0" publishing { diff --git a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherExtension.kt b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherExtension.kt index b77f21e..8ecbebb 100644 --- a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherExtension.kt +++ b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherExtension.kt @@ -1,5 +1,22 @@ +/* + * Copyright (C) 2018 Sergej Shafarenka, www.halfbit.de + * + * 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 de.halfbit.tools.autoplay +import de.halfbit.tools.autoplay.publisher.ArtifactType import de.halfbit.tools.autoplay.publisher.ReleaseStatus internal const val RELEASE_NOTES_PATH = "src/main/autoplay/release-notes" @@ -11,4 +28,5 @@ internal open class AutoplayPublisherExtension { var secretJsonBase64: String? = null var secretJsonPath: String? = null var releaseNotesPath: String? = RELEASE_NOTES_PATH + var artifactType = ArtifactType.Apk.name } diff --git a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherPlugin.kt b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherPlugin.kt index 862e072..7fc2d82 100644 --- a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherPlugin.kt +++ b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/AutoplayPublisherPlugin.kt @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2018 Sergej Shafarenka, www.halfbit.de + * + * 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 de.halfbit.tools.autoplay import com.android.build.gradle.AppExtension @@ -29,30 +45,59 @@ internal class PlayPublisherPlugin : Plugin { val applicationVariant = this@whenObjectAdded val variantName = name.capitalize() - project.createTask("publishApk$variantName", PublishApkTask::class) { - description = "Publish $variantName apk, mapping and release-notes to Google Play." - group = TASK_GROUP - - applicationId = applicationVariant.applicationId - artifactFiles = getArtifactFiles() - obfuscationMappingFile = getObfuscationMappingFile() - releaseTrack = extension.getReleaseTrack() - releaseStatus = extension.getReleaseStatus() - releaseNotes = extension.getReleaseNotes(project.projectDir) - credentials = extension.getCredentials() + when (extension.artifactType) { + ArtifactType.Apk.name -> { + project.createTask("publishApk$variantName", PublishTask::class) { + description = "Publish $variantName apk, mapping and release-notes to Google Play." + group = TASK_GROUP + + applicationId = applicationVariant.applicationId + artifactType = ArtifactType.Apk + artifacts = collectArtifacts(ArtifactType.Apk, project) + obfuscationMappingFile = getObfuscationMappingFile() + releaseTrack = extension.getReleaseTrack() + releaseStatus = extension.getReleaseStatus() + releaseNotes = extension.getReleaseNotes(project.projectDir) + credentials = extension.getCredentials() + } + } + + ArtifactType.Bundle.name -> { + project.createTask("publishBundle$variantName", PublishTask::class) { + description = "Publish $variantName bundle and release-notes to Google Play." + group = TASK_GROUP + + applicationId = applicationVariant.applicationId + artifactType = ArtifactType.Bundle + artifacts = collectArtifacts(ArtifactType.Bundle, project) + releaseTrack = extension.getReleaseTrack() + releaseStatus = extension.getReleaseStatus() + releaseNotes = extension.getReleaseNotes(project.projectDir) + credentials = extension.getCredentials() + } + } } } - } companion object { private const val MINIMAL_ANDROID_PLUGIN_VERSION = "3.0.1" - private fun ApplicationVariant.getArtifactFiles(): List { - return this.outputs - .filterIsInstance() - .map { it.outputFile } + private fun ApplicationVariant.collectArtifacts( + artifactType: ArtifactType, project: Project + ): List { + + return when (artifactType) { + ArtifactType.Apk -> this.outputs + .filterIsInstance() + .map { it.outputFile } + + ArtifactType.Bundle -> { + val archivesBaseName = project.properties["archivesBaseName"] as String + listOf(File(project.buildDir, "outputs/bundle/$name/$archivesBaseName.aab")) + } + } } private fun ApplicationVariant.getObfuscationMappingFile(): File? { diff --git a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/PublishApkTask.kt b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/PublishApkTask.kt deleted file mode 100644 index 7737ad8..0000000 --- a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/PublishApkTask.kt +++ /dev/null @@ -1,65 +0,0 @@ -package de.halfbit.tools.autoplay - -import de.halfbit.tools.autoplay.publisher.* -import de.halfbit.tools.autoplay.publisher.v3.V3GooglePlayPublisher -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.* -import org.gradle.api.tasks.incremental.IncrementalTaskInputs -import java.io.File - -internal open class PublishApkTask : DefaultTask() { - - @get:InputFiles - @get:PathSensitive(PathSensitivity.ABSOLUTE) - lateinit var artifactFiles: List - - @get:Optional - @get:InputFile - var obfuscationMappingFile: File? = null - - @get:Input - lateinit var releaseNotes: List - - @get:Input - lateinit var applicationId: String - - @get:Input - lateinit var credentials: Credentials - - @get:Input - lateinit var releaseTrack: ReleaseTrack - - @get:Input - var releaseStatus: ReleaseStatus = ReleaseStatus.Completed - - @TaskAction - @Suppress("UNUSED_PARAMETER", "unused") - fun execute(inputs: IncrementalTaskInputs) { - credentials.validate() - - V3GooglePlayPublisher - .getGooglePlayPublisher(credentials, applicationId) - .publish( - ReleaseData( - applicationId, - artifactFiles, - obfuscationMappingFile, - releaseNotes, - releaseStatus, - releaseTrack - ) - ) - } - - companion object { - - fun Credentials.validate() { - if (!secretJson.isNullOrEmpty() && !secretJsonPath.isNullOrEmpty()) { - error("Either $EXTENSION_NAME { secretJsonBase64 } or" + - " $EXTENSION_NAME { secretJsonPath } must be specified, never both.") - } - } - - } - -} \ No newline at end of file diff --git a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/PublishTask.kt b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/PublishTask.kt new file mode 100644 index 0000000..60ca006 --- /dev/null +++ b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/PublishTask.kt @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2018 Sergej Shafarenka, www.halfbit.de + * + * 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 de.halfbit.tools.autoplay + +import de.halfbit.tools.autoplay.publisher.* +import de.halfbit.tools.autoplay.publisher.v3.V3GooglePlayPublisher +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.* +import org.gradle.api.tasks.incremental.IncrementalTaskInputs +import java.io.File + +internal open class PublishTask : DefaultTask() { + + @get:Input + lateinit var artifactType: ArtifactType + + @get:InputFiles + @get:PathSensitive(PathSensitivity.ABSOLUTE) + lateinit var artifacts: List + + @get:Optional + @get:InputFile + var obfuscationMappingFile: File? = null + + @get:Input + lateinit var releaseNotes: List + + @get:Input + lateinit var applicationId: String + + @get:Input + lateinit var credentials: Credentials + + @get:Input + lateinit var releaseTrack: ReleaseTrack + + @get:Input + var releaseStatus: ReleaseStatus = ReleaseStatus.Completed + + @TaskAction + @Suppress("UNUSED_PARAMETER", "unused") + fun execute(inputs: IncrementalTaskInputs) { + credentials.validate() + + V3GooglePlayPublisher + .getGooglePlayPublisher(credentials, applicationId) + .publish( + ReleaseData( + applicationId, + artifacts.map { it.toReleaseArtifact(artifactType) }, + obfuscationMappingFile, + releaseNotes, + releaseStatus, + releaseTrack + ) + ) + } + +} + +private fun File.toReleaseArtifact(artifactType: ArtifactType): ReleaseArtifact = when (artifactType) { + ArtifactType.Apk -> ReleaseArtifact.Apk(this) + ArtifactType.Bundle -> ReleaseArtifact.Bundle(this) +} + +private fun Credentials.validate() { + if (!secretJson.isNullOrEmpty() && !secretJsonPath.isNullOrEmpty()) { + error("Either $EXTENSION_NAME { secretJsonBase64 } or" + + " $EXTENSION_NAME { secretJsonPath } must be specified, never both.") + } +} + diff --git a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/GooglePlayPublisher.kt b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/GooglePlayPublisher.kt index e0311b3..221f767 100644 --- a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/GooglePlayPublisher.kt +++ b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/GooglePlayPublisher.kt @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2018 Sergej Shafarenka, www.halfbit.de + * + * 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 de.halfbit.tools.autoplay.publisher import java.io.File @@ -11,7 +27,7 @@ internal interface GooglePlayPublisher { internal class ReleaseData( val applicationId: String, - val artifacts: List, + val artifacts: List, val obfuscationMappingFile: File?, val releaseNotes: List, val releaseStatus: ReleaseStatus, @@ -31,6 +47,16 @@ internal sealed class ReleaseTrack(val name: String) : Serializable { object Production : ReleaseTrack("production") } +internal sealed class ReleaseArtifact(val file: File) { + class Apk(file: File) : ReleaseArtifact(file) + class Bundle(file: File) : ReleaseArtifact(file) +} + +internal sealed class ArtifactType(val name: String) : Serializable { + object Apk : ArtifactType("apk") + object Bundle : ArtifactType("bundle") +} + internal sealed class ReleaseStatus(val name: String) : Serializable { object Completed : ReleaseStatus("completed") object Draft : ReleaseStatus("draft") diff --git a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/v3/V3GooglePlayPublisher.kt b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/v3/V3GooglePlayPublisher.kt index 83f7c28..21eadbc 100644 --- a/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/v3/V3GooglePlayPublisher.kt +++ b/autoplay/src/main/kotlin/de/halfbit/tools/autoplay/publisher/v3/V3GooglePlayPublisher.kt @@ -22,14 +22,12 @@ import com.google.api.client.http.FileContent import com.google.api.client.json.jackson2.JacksonFactory import com.google.api.services.androidpublisher.AndroidPublisher import com.google.api.services.androidpublisher.AndroidPublisherScopes +import com.google.api.services.androidpublisher.model.AppEdit import com.google.api.services.androidpublisher.model.LocalizedText import com.google.api.services.androidpublisher.model.Track import com.google.api.services.androidpublisher.model.TrackRelease import de.halfbit.tools.autoplay.EXTENSION_NAME -import de.halfbit.tools.autoplay.publisher.Credentials -import de.halfbit.tools.autoplay.publisher.GooglePlayPublisher -import de.halfbit.tools.autoplay.publisher.ReleaseData -import de.halfbit.tools.autoplay.publisher.ReleaseTrack +import de.halfbit.tools.autoplay.publisher.* import de.halfbit.tools.autoplay.publisher.common.readTextLines import java.io.File @@ -48,30 +46,12 @@ internal class V3GooglePlayPublisher( val edits = androidPublisher.edits() val appEdit = edits.insert(data.applicationId, null).execute() - val apkVersionCodes = data.artifacts.map { - - val apkVersionCode = edits.apks() - .upload( - data.applicationId, - appEdit.id, - FileContent(MIME_TYPE_APK, it) - ) - .execute() - .versionCode - - data.obfuscationMappingFile?.let { obfuscationMappingFile -> - edits.deobfuscationfiles() - .upload( - data.applicationId, - appEdit.id, - apkVersionCode, - TYPE_PROGUARD, - FileContent(MIME_TYPE_STREAM, obfuscationMappingFile) - ) - .execute() + val artifactVersionCodes = data.artifacts.map { + val artifactVersionCode = when (it) { + is ReleaseArtifact.Apk -> it.uploadApk(edits, data, appEdit) + is ReleaseArtifact.Bundle -> it.uploadBundle(edits, data, appEdit) } - - apkVersionCode.toLong() + artifactVersionCode.toLong() } edits.tracks() @@ -79,7 +59,7 @@ internal class V3GooglePlayPublisher( data.applicationId, appEdit.id, data.releaseTrack.name, - data.createTrackUpdate(apkVersionCodes) + data.createTrackUpdate(artifactVersionCodes) ) .execute() @@ -129,8 +109,8 @@ internal class V3GooglePlayPublisher( error("No artifacts found for publishing.") } artifacts.forEach { - if (!it.exists()) error("Artifact does not exist: $it") - if (it.length() == 0L) error("Artifact must not be empty: $it") + if (!it.file.exists()) error("Artifact does not exist: ${it.file}") + if (it.file.length() == 0L) error("Artifact must not be empty: ${it.file}") } } @@ -166,3 +146,44 @@ internal class V3GooglePlayPublisher( } } + +private fun ReleaseArtifact.Apk.uploadApk( + edits: AndroidPublisher.Edits, data: ReleaseData, appEdit: AppEdit +): Int { + + val apkVersionCode = edits.apks() + .upload( + data.applicationId, + appEdit.id, + FileContent(MIME_TYPE_APK, file) + ) + .execute() + .versionCode + + data.obfuscationMappingFile?.let { obfuscationMappingFile -> + edits.deobfuscationfiles() + .upload( + data.applicationId, + appEdit.id, + apkVersionCode, + TYPE_PROGUARD, + FileContent(MIME_TYPE_STREAM, obfuscationMappingFile) + ) + .execute() + } + + return apkVersionCode +} + +private fun ReleaseArtifact.Bundle.uploadBundle( + edits: AndroidPublisher.Edits, data: ReleaseData, appEdit: AppEdit +): Int { + return edits.bundles() + .upload( + data.applicationId, + appEdit.id, + FileContent(MIME_TYPE_STREAM, file) + ) + .execute() + .versionCode +} diff --git a/autoplay/src/test/kotlin/de/halfbit/tools/autoplay/PlayPublisherPluginTest.kt b/autoplay/src/test/kotlin/de/halfbit/tools/autoplay/PlayPublisherPluginTest.kt index 0444d23..02d1d1e 100644 --- a/autoplay/src/test/kotlin/de/halfbit/tools/autoplay/PlayPublisherPluginTest.kt +++ b/autoplay/src/test/kotlin/de/halfbit/tools/autoplay/PlayPublisherPluginTest.kt @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2018 Sergej Shafarenka, www.halfbit.de + * + * 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 de.halfbit.tools.autoplay import com.google.common.truth.Truth.assertThat @@ -29,8 +45,8 @@ internal class PlayPublisherPluginTest { @Before fun before() { project = ProjectBuilder.builder() - .withName("sample-application") - .withProjectDir(File("src/test/resources/sample-application/app")) + .withName("sample-app") + .withProjectDir(File("src/test/resources/sample-app/app")) .build() project.pluginManager.apply("com.android.application") @@ -38,7 +54,7 @@ internal class PlayPublisherPluginTest { } @Test - fun `PlayPublisherPlugin, valid configuration`() { + fun `PlayPublisherPlugin, valid Apk configuration`() { project.withGroovyBuilder { @@ -61,14 +77,67 @@ internal class PlayPublisherPluginTest { val task = tasks.first() assertThat(task).isNotNull() - assertThat(task).isInstanceOf(PublishApkTask::class.java) + assertThat(task).isInstanceOf(PublishTask::class.java) + + val publishApkRelease = task as PublishTask + assertThat(publishApkRelease.artifacts).hasSize(1) + + val artifact = publishApkRelease.artifacts.first() + assertThat(artifact).isNotNull() + assertThat(artifact.path).endsWith("sample-app-release-unsigned.apk") + assertThat(File(artifact.path).exists()).isTrue() + + assertThat(publishApkRelease.releaseNotes).hasSize(1) + + val releaseNotes = publishApkRelease.releaseNotes.first() + assertThat(releaseNotes).isNotNull() + assertThat(releaseNotes.locale).isEqualTo("en-US") + assertThat(releaseNotes.file.path).endsWith("release-notes/internal/en-US.txt") + + assertThat(publishApkRelease.credentials).isNotNull() + assertThat(publishApkRelease.credentials.secretJson).isEqualTo("secret") + assertThat(publishApkRelease.credentials.secretJsonPath).isNull() + + assertThat(publishApkRelease.obfuscationMappingFile).isNull() + assertThat(publishApkRelease.applicationId).isEqualTo("de.halfbit.tools.autoplay.sample") + assertThat(publishApkRelease.releaseTrack).isEqualTo(ReleaseTrack.Internal) + assertThat(publishApkRelease.releaseStatus).isEqualTo(ReleaseStatus.InProgress) + + } + + @Test + fun `PlayPublisherPlugin, valid Bundle configuration`() { + + project.withGroovyBuilder { + + "android" { + "compileSdkVersion"(27) + } + + "$EXPECTED_EXTENSION_NAME" { + "track"("internal") + "status"("inProgress") + "userFraction"(0.5) + "artifactType"("bundle") + "secretJsonBase64"("c2VjcmV0") + } + + "evaluate"() + } + + val tasks = project.getTasksByName("publishBundleRelease", false) + assertThat(tasks).hasSize(1) + + val task = tasks.first() + assertThat(task).isNotNull() + assertThat(task).isInstanceOf(PublishTask::class.java) - val publishApkRelease = task as PublishApkTask - assertThat(publishApkRelease.artifactFiles).hasSize(1) + val publishApkRelease = task as PublishTask + assertThat(publishApkRelease.artifacts).hasSize(1) - val artifact = publishApkRelease.artifactFiles.first() + val artifact = publishApkRelease.artifacts.first() assertThat(artifact).isNotNull() - assertThat(artifact.path).endsWith("sample-application-release-unsigned.apk") + assertThat(artifact.path).endsWith("sample-app.aab") assertThat(File(artifact.path).exists()).isTrue() assertThat(publishApkRelease.releaseNotes).hasSize(1) @@ -90,7 +159,7 @@ internal class PlayPublisherPluginTest { } @Test - fun `PublishApkTask, missing 'track'`() { + fun `PublishTask, missing 'track'`() { thrown.expect(ProjectConfigurationException::class.java) thrown.expectCause(hasMessage(equalTo("$EXPECTED_EXTENSION_NAME { track } property is required."))) diff --git a/autoplay/src/test/resources/sample-application/app/build/outputs/apk/release/sample-application-release-unsigned.apk b/autoplay/src/test/resources/sample-app/app/build/outputs/apk/release/sample-app-release-unsigned.apk similarity index 100% rename from autoplay/src/test/resources/sample-application/app/build/outputs/apk/release/sample-application-release-unsigned.apk rename to autoplay/src/test/resources/sample-app/app/build/outputs/apk/release/sample-app-release-unsigned.apk diff --git a/autoplay/src/test/resources/sample-app/app/build/outputs/bundle/release/sample-app.aab b/autoplay/src/test/resources/sample-app/app/build/outputs/bundle/release/sample-app.aab new file mode 100644 index 0000000..d5dba08 --- /dev/null +++ b/autoplay/src/test/resources/sample-app/app/build/outputs/bundle/release/sample-app.aab @@ -0,0 +1 @@ +sample apk \ No newline at end of file diff --git a/autoplay/src/test/resources/sample-application/app/src/main/AndroidManifest.xml b/autoplay/src/test/resources/sample-app/app/src/main/AndroidManifest.xml similarity index 100% rename from autoplay/src/test/resources/sample-application/app/src/main/AndroidManifest.xml rename to autoplay/src/test/resources/sample-app/app/src/main/AndroidManifest.xml diff --git a/autoplay/src/test/resources/sample-application/app/src/main/autoplay/release-notes/internal/en-US.txt b/autoplay/src/test/resources/sample-app/app/src/main/autoplay/release-notes/internal/en-US.txt similarity index 100% rename from autoplay/src/test/resources/sample-application/app/src/main/autoplay/release-notes/internal/en-US.txt rename to autoplay/src/test/resources/sample-app/app/src/main/autoplay/release-notes/internal/en-US.txt diff --git a/build.gradle.kts b/build.gradle.kts index cfd5e21..25f6476 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,15 +17,15 @@ allprojects { all { resolutionStrategy { force("com.google.guava:guava:22.0") - force("org.jetbrains.kotlin:kotlin-reflect:1.2.61") + force("org.jetbrains.kotlin:kotlin-reflect:1.2.71") dependencySubstitution { substitute(module("org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.0")) - .with(module("org.jetbrains.kotlin:kotlin-stdlib:1.2.61")) + .with(module("org.jetbrains.kotlin:kotlin-stdlib:1.2.71")) substitute(module("org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.0")) - .with(module("org.jetbrains.kotlin:kotlin-stdlib:1.2.61")) + .with(module("org.jetbrains.kotlin:kotlin-stdlib:1.2.71")) } } }