Я создаю библиотеку, созданную с использованием com.google.android.gms:play-services-tasks версии 17.2.1, и ее pom.xml:
4.0.0
com.example.group
my-artifact
1.2.3
aar
com.google.android.gms
play-services-tasks
[17.2,17.3)
... other dependencies ...
Я намерен, чтобы любое приложение, использующее эту библиотеку, использовало версию play-services-tasks между 17.2 (включительно) и 17.3 (эксклюзивно). (На данный момент меня не интересуют крайние случаи, такие как 17.3-rc1.)
Однако, когда я создаю приложение, использующее эту библиотеку, оно использует play-services-tasks версия 18.1.0.
Вывод ./gradlew :app:dependent включает следующее:
+--- com.example.group:my-artifact:1.2.3
| \--- com.google.android.gms:play-services-tasks:[17.2,17.3) -> 18.1.0 (*)
поэтому зависимость play-services-tasks поднимается выше установленного мной диапазона. Никаких ошибок сборки не сообщается, а анализ APK показывает, что используется версия 18.1.0.
Что я делаю не так? Или я неправильно понял, как работают транзитивные зависимости, и библиотека не может таким образом ограничивать версии зависимостей?
ИЗМЕНИТЬ
Приложение Файл build.gradle.kts:
import com.google.firebase.perf.plugin.FirebasePerfExtension
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
//noinspection GradleDependency
plugins {
id("com.android.application")
id("kotlin-parcelize")
id("kotlin-allopen")
id("kotlin-kapt")
id("kotlinx-serialization")
id("com.google.firebase.crashlytics")
id("com.google.firebase.appdistribution")
id("androidx.navigation.safeargs")
}
private val isDevBuild = project.hasProperty("devBuild")
apply(plugin = "com.google.firebase.firebase-perf")
android {
@Suppress("UnstableApiUsage")
bundle {
density.enableSplit = true
abi.enableSplit = true
language.enableSplit = true
}
defaultConfig {
applicationId = "com.example.appid"
testApplicationId = "com.example.appid.test"
vectorDrawables.useSupportLibrary = true
manifestPlaceholders["crashlyticsCollectionEnabled"] = !isDevBuild
}
apply(from = "${project.property("signingConfigs.signing")}.gradle")
apply(from = rootProject.file("buildscripts/flavors.gradle"))
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro", "proguard-rules-remove-logs.pro")
testProguardFile("proguard-test-rules.pro")
buildConfigField(type = "Boolean", name = "DEV", value = "false")
firebaseAppDistribution {
releaseNotes = project.findProperty("firebaseChangelog").toString()
groups = project.findProperty("appDistributionGroup").toString()
serviceCredentialsFile = System.getenv("FIREBASE_APPDISTRIBUTION_CREDENTIALS")
}
}
getByName("debug") {
signingConfig = null
isMinifyEnabled = false
buildConfigField(type = "Boolean", name = "DEV", value = "true")
ext.set("enableCrashlytics", false)
configure {
setInstrumentationEnabled(false)
}
}
}
packaging {
jniLibs.excludes.add("META-INF/**/*")
}
configurations.configureEach {
resolutionStrategy {
force(libs.android.test.monitor.get())
}
}
buildFeatures {
viewBinding = true
dataBinding = true
compose = true
buildConfig = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
lint {
abortOnError = false
checkReleaseBuilds = false
}
namespace = "com.example.namespace"
testNamespace = "com.example.namespace.test"
@Suppress("UnstableApiUsage")
testOptions {
unitTests.all {
it.useJUnitPlatform()
}
}
}
tasks.withType(Test::class.java).configureEach {
testLogging {
exceptionFormat = TestExceptionFormat.FULL
events(TestLogEvent.STARTED, TestLogEvent.SKIPPED, TestLogEvent.PASSED, TestLogEvent.FAILED)
showStandardStreams = true
}
}
if (isDevBuild) {
androidComponents {
beforeVariants(selector().withBuildType("release")) { builder ->
builder.enable = false
}
}
} else {
apply(from = rootProject.file("buildscripts/google-play-publishing.gradle"))
}
dependencies {
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.performance)
// Google AndroidX
implementation(libs.google.material)
implementation(libs.cardview)
implementation(libs.webkit)
implementation(libs.gridlayout)
implementation(libs.constraintlayout)
implementation(libs.paging.ktx)
implementation(libs.google.flexbox)
implementation(libs.datastore.core)
implementation(libs.datastore.preferences)
// Google lifecycle
implementation(libs.lifecycle.runtime.ktx)
implementation(libs.lifecycle.runtime.compose)
implementation(libs.lifecycle.livedata.ktx)
implementation(libs.lifecycle.viewmodel.ktx)
implementation(libs.lifecycle.viewmodel.compose)
// Google play services
implementation(libs.gms.identity)
implementation(libs.gms.ads)
implementation(libs.gms.analytics)
implementation(libs.gms.basement)
implementation(libs.gms.maps)
implementation(libs.gms.location)
implementation(libs.gms.tasks)
// Firebase
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.messaging)
implementation(libs.firebase.analytics)
implementation(libs.firebase.config)
// Kotlin
implementation(libs.kotlin.serialization.json)
implementation(libs.retrofit.serialization) {
exclude(group = "com.squareup.retrofit2", module = "retrofit")
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}
implementation(libs.example.myartifact)
implementation(libs.google.play.appupdate)
implementation(libs.espresso.idling)
implementation(libs.okhttp.logging.interceptor)
// Navigation
implementation(libs.navigation.fragment.ktx)
implementation(libs.navigation.runtime.ktx)
implementation(libs.navigation.ui.ktx)
implementation(libs.activity.compose)
// Compose
implementation(libs.compose.foundation)
implementation(libs.compose.foundation.layout)
implementation(libs.compose.material)
implementation(libs.compose.runtime.livedata)
implementation(libs.compose.ui)
implementation(libs.compose.ui.util)
implementation(libs.accompanist.permissions)
debugImplementation(libs.compose.ui.tooling)
debugImplementation(libs.compose.runtime.tracing)
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.test.manifest)
testImplementation(libs.junit5.api)
testImplementation(libs.junit5.params)
testRuntimeOnly(libs.junit5.engine)
testImplementation(libs.test.hamcrest)
testImplementation(libs.test.truth)
testImplementation(libs.okhttp.mockserver)
testImplementation(libs.retrofit.serialization) {
exclude(group = "com.squareup.retrofit2", module = "retrofit")
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}
testImplementation(libs.test.core)
testImplementation(libs.mockito.core)
testImplementation(libs.mockito.kotlin)
testImplementation(libs.coroutines.test)
testImplementation(libs.mockk.core)
testImplementation(libs.test.turbine)
debugImplementation(libs.fragment.testing)
testImplementation(libs.android.test.runner)
testImplementation(libs.android.test.ext.junit)
testImplementation(libs.espresso.core)
testImplementation(libs.espresso.contrib) {
exclude(group = "org.checkerframework", module = "checker")
}
androidTestImplementation(libs.compose.material)
androidTestImplementation(libs.compose.material.get3())
}
// must be at the bottom
apply(plugin = "com.google.gms.google-services")
Примечание: я получу тот же результат, если удалю эту строку:
implementation(libs.gms.tasks)
РЕДАКТИРОВАНИЕ 2
Вот часть вывода ./gradlew :app:dependent, которая показывает `зависимость play-services-tasks в более высокой версии:
+--- com.google.firebase:firebase-crashlytics -> 18.6.4
| +--- com.google.firebase:firebase-common:20.4.2 -> 20.4.3
| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 (*)
| | +--- com.google.android.gms:play-services-basement:18.3.0 (*)
| | \--- com.google.android.gms:play-services-tasks:18.1.0 (*)
Подробнее здесь: https://stackoverflow.com/questions/784 ... g-enforced
Почему версия транзитивной зависимости Gradle не применяется? ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1715272824
Anonymous
Я создаю библиотеку, созданную с использованием com.google.android.gms:play-services-tasks версии 17.2.1, и ее pom.xml:
4.0.0
com.example.group
my-artifact
1.2.3
aar
com.google.android.gms
play-services-tasks
[17.2,17.3)
... other dependencies ...
Я намерен, чтобы любое приложение, использующее эту библиотеку, использовало версию play-services-tasks между 17.2 (включительно) и 17.3 (эксклюзивно). (На данный момент меня не интересуют крайние случаи, такие как 17.3-rc1.)
Однако, когда я создаю приложение, использующее эту библиотеку, оно использует play-services-tasks версия 18.1.0.
Вывод ./gradlew :app:dependent включает следующее:
+--- com.example.group:my-artifact:1.2.3
| \--- com.google.android.gms:play-services-tasks:[17.2,17.3) -> 18.1.0 (*)
поэтому зависимость play-services-tasks поднимается выше установленного мной диапазона. Никаких ошибок сборки не сообщается, а анализ APK показывает, что используется версия 18.1.0.
Что я делаю не так? Или я неправильно понял, как работают транзитивные зависимости, и библиотека не может таким образом ограничивать версии зависимостей?
ИЗМЕНИТЬ
Приложение Файл build.gradle.kts:
import com.google.firebase.perf.plugin.FirebasePerfExtension
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
//noinspection GradleDependency
plugins {
id("com.android.application")
id("kotlin-parcelize")
id("kotlin-allopen")
id("kotlin-kapt")
id("kotlinx-serialization")
id("com.google.firebase.crashlytics")
id("com.google.firebase.appdistribution")
id("androidx.navigation.safeargs")
}
private val isDevBuild = project.hasProperty("devBuild")
apply(plugin = "com.google.firebase.firebase-perf")
android {
@Suppress("UnstableApiUsage")
bundle {
density.enableSplit = true
abi.enableSplit = true
language.enableSplit = true
}
defaultConfig {
applicationId = "com.example.appid"
testApplicationId = "com.example.appid.test"
vectorDrawables.useSupportLibrary = true
manifestPlaceholders["crashlyticsCollectionEnabled"] = !isDevBuild
}
apply(from = "${project.property("signingConfigs.signing")}.gradle")
apply(from = rootProject.file("buildscripts/flavors.gradle"))
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro", "proguard-rules-remove-logs.pro")
testProguardFile("proguard-test-rules.pro")
buildConfigField(type = "Boolean", name = "DEV", value = "false")
firebaseAppDistribution {
releaseNotes = project.findProperty("firebaseChangelog").toString()
groups = project.findProperty("appDistributionGroup").toString()
serviceCredentialsFile = System.getenv("FIREBASE_APPDISTRIBUTION_CREDENTIALS")
}
}
getByName("debug") {
signingConfig = null
isMinifyEnabled = false
buildConfigField(type = "Boolean", name = "DEV", value = "true")
ext.set("enableCrashlytics", false)
configure {
setInstrumentationEnabled(false)
}
}
}
packaging {
jniLibs.excludes.add("META-INF/**/*")
}
configurations.configureEach {
resolutionStrategy {
force(libs.android.test.monitor.get())
}
}
buildFeatures {
viewBinding = true
dataBinding = true
compose = true
buildConfig = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
lint {
abortOnError = false
checkReleaseBuilds = false
}
namespace = "com.example.namespace"
testNamespace = "com.example.namespace.test"
@Suppress("UnstableApiUsage")
testOptions {
unitTests.all {
it.useJUnitPlatform()
}
}
}
tasks.withType(Test::class.java).configureEach {
testLogging {
exceptionFormat = TestExceptionFormat.FULL
events(TestLogEvent.STARTED, TestLogEvent.SKIPPED, TestLogEvent.PASSED, TestLogEvent.FAILED)
showStandardStreams = true
}
}
if (isDevBuild) {
androidComponents {
beforeVariants(selector().withBuildType("release")) { builder ->
builder.enable = false
}
}
} else {
apply(from = rootProject.file("buildscripts/google-play-publishing.gradle"))
}
dependencies {
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.performance)
// Google AndroidX
implementation(libs.google.material)
implementation(libs.cardview)
implementation(libs.webkit)
implementation(libs.gridlayout)
implementation(libs.constraintlayout)
implementation(libs.paging.ktx)
implementation(libs.google.flexbox)
implementation(libs.datastore.core)
implementation(libs.datastore.preferences)
// Google lifecycle
implementation(libs.lifecycle.runtime.ktx)
implementation(libs.lifecycle.runtime.compose)
implementation(libs.lifecycle.livedata.ktx)
implementation(libs.lifecycle.viewmodel.ktx)
implementation(libs.lifecycle.viewmodel.compose)
// Google play services
implementation(libs.gms.identity)
implementation(libs.gms.ads)
implementation(libs.gms.analytics)
implementation(libs.gms.basement)
implementation(libs.gms.maps)
implementation(libs.gms.location)
implementation(libs.gms.tasks)
// Firebase
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.messaging)
implementation(libs.firebase.analytics)
implementation(libs.firebase.config)
// Kotlin
implementation(libs.kotlin.serialization.json)
implementation(libs.retrofit.serialization) {
exclude(group = "com.squareup.retrofit2", module = "retrofit")
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}
implementation(libs.example.myartifact)
implementation(libs.google.play.appupdate)
implementation(libs.espresso.idling)
implementation(libs.okhttp.logging.interceptor)
// Navigation
implementation(libs.navigation.fragment.ktx)
implementation(libs.navigation.runtime.ktx)
implementation(libs.navigation.ui.ktx)
implementation(libs.activity.compose)
// Compose
implementation(libs.compose.foundation)
implementation(libs.compose.foundation.layout)
implementation(libs.compose.material)
implementation(libs.compose.runtime.livedata)
implementation(libs.compose.ui)
implementation(libs.compose.ui.util)
implementation(libs.accompanist.permissions)
debugImplementation(libs.compose.ui.tooling)
debugImplementation(libs.compose.runtime.tracing)
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.test.manifest)
testImplementation(libs.junit5.api)
testImplementation(libs.junit5.params)
testRuntimeOnly(libs.junit5.engine)
testImplementation(libs.test.hamcrest)
testImplementation(libs.test.truth)
testImplementation(libs.okhttp.mockserver)
testImplementation(libs.retrofit.serialization) {
exclude(group = "com.squareup.retrofit2", module = "retrofit")
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}
testImplementation(libs.test.core)
testImplementation(libs.mockito.core)
testImplementation(libs.mockito.kotlin)
testImplementation(libs.coroutines.test)
testImplementation(libs.mockk.core)
testImplementation(libs.test.turbine)
debugImplementation(libs.fragment.testing)
testImplementation(libs.android.test.runner)
testImplementation(libs.android.test.ext.junit)
testImplementation(libs.espresso.core)
testImplementation(libs.espresso.contrib) {
exclude(group = "org.checkerframework", module = "checker")
}
androidTestImplementation(libs.compose.material)
androidTestImplementation(libs.compose.material.get3())
}
// must be at the bottom
apply(plugin = "com.google.gms.google-services")
Примечание: я получу тот же результат, если удалю эту строку:
implementation(libs.gms.tasks)
РЕДАКТИРОВАНИЕ 2
Вот часть вывода ./gradlew :app:dependent, которая показывает `зависимость play-services-tasks в более высокой версии:
+--- com.google.firebase:firebase-crashlytics -> 18.6.4
| +--- com.google.firebase:firebase-common:20.4.2 -> 20.4.3
| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 (*)
| | +--- com.google.android.gms:play-services-basement:18.3.0 (*)
| | \--- com.google.android.gms:play-services-tasks:18.1.0 (*)
Подробнее здесь: [url]https://stackoverflow.com/questions/78447438/why-is-gradle-transitive-dependency-version-not-being-enforced[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия