Proto DataStore не может создать файлы из-за конфликта AndroidSourceSet в Gradle

Вопрос или проблема

Я пытаюсь реализовать Proto DataStore в своем проекте Android, но библиотека не может сгенерировать файлы из .proto файла и выбрасывает следующее исключение:

Произошла ошибка при конфигурации проекта ':core:datastoreproto'.> org.gradle.api.InvalidUserDataException: Невозможно добавить AndroidSourceSet с именем 'debug', так как AndroidSourceSet с таким именем уже существует.

Вы можете увидеть ниже, как я это реализовал

версии

dataStore = "1.1.1"
protobuf = "4.26.1"
protobufPlugin = "0.9.4"

Ниже находится мой файл build.gradle.kts для модуля :core:datastoreproto:

plugins {
    alias(libs.plugins.medicineai.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
    alias(libs.plugins.protobuf)
}

android {
    namespace = "com.medicineai.core.datastoreproto"
}

// Настройка конфигурации protobuf, генерация lite Java и Kotlin классов
protobuf {
    protoc {
        artifact = libs.protobuf.protoc.get().toString()
    }
    generateProtoTasks {
        all().forEach { task ->
            task.builtins {
                register("java") {
                    option("lite")
                }
                register("kotlin") {
                    option("lite")
                }
            }
        }
    }
}

androidComponents.beforeVariants {
    android.sourceSets.register(it.name) {
        val buildDir = layout.buildDirectory.get().asFile
        java.srcDir(buildDir.resolve("generated/source/proto/${it.name}/java"))
        kotlin.srcDir(buildDir.resolve("generated/source/proto/${it.name}/kotlin"))
    }
}

dependencies {
    api(libs.protobuf.kotlin.lite)
}

Вот мой .proto файл (auth_info.proto):

syntax = "proto3";

option java_package = "com.medicineai.core.datastoreproto";

message AuthInfo {
  string accessToken = 1;
  string refreshToken = 2;
  string userId = 3;
}

Я не уверен, что вызывает конфликт AndroidSourceSet. Кто-нибудь сталкивался с этой проблемой или нашел решение?

Это также может помочь

core module

Ответ или решение

Ошибка, с которой вы столкнулись при использовании Proto DataStore в вашем Android проекте, вызвана конфликтом имен при попытке зарегистрировать новый AndroidSourceSet. Давайте подробно разберёмся с этой проблемой и возможными решениями.

Суть проблемы

Ошибка, которую вы видите:

A problem occurred configuring project ':core:datastoreproto'.> org.gradle.api.InvalidUserDataException: Cannot add an AndroidSourceSet with name 'debug' as an AndroidSourceSet with that name already exists.

указывает на то, что sourceSet с именем debug уже существует, и вы пытаетесь добавить еще один с тем же именем. Это, вероятно, связано с тем, как Gradle обрабатывает конфигурацию AndroidSourceSet в вашем файле build.gradle.kts.

Причины конфликта

Конфликт может возникать по следующим причинам:

  1. Дублирование определения SourceSet: Если у вас уже существует реализация для debug SourceSet в другом месте вашего проекта (например, в модуле :core), то попытка зарегистрировать его снова приведет к указанной ошибке.
  2. Конфликт библиотек: Используемая вами библиотека (или другой плагин) может также пытаться добавлять debug SourceSet.

Решение проблемы

Чтобы устранить эту проблему, вы можете попробовать следующие шаги:

  1. Проверка на дублирование: Убедитесь, что в других модулях вашего проекта (в частности, в :core или других связанных модулях) нет определения SourceSet с именем debug. Если есть, вы можете убрать лишнее определение или изменить его имя.

  2. Использование проверки на существование SourceSet: Вы можете изменить код, который регистрирует SourceSet, чтобы он проверял, существует ли debug SourceSet, прежде чем добавлять его. Вот как это можно сделать:

androidComponents.beforeVariants {
    if (android.sourceSets.findByName(it.name) == null) {
        android.sourceSets.register(it.name) {
            val buildDir = layout.buildDirectory.get().asFile
            java.srcDir(buildDir.resolve("generated/source/proto/${it.name}/java"))
            kotlin.srcDir(buildDir.resolve("generated/source/proto/${it.name}/kotlin"))
        }
    }
}
  1. Изолирование конфигурации: Если вы используете другие плагины, например, связанные с protobuf, попробуйте отключить их одно за другим, чтобы определить, какой из них вызывает конфликт.

  2. Обновление зависимостей: Обновите ваши плагины и библиотеки до последних версий. Иногда проблемы совместимости могут быть решены внедрением последних обновлений.

  3. Создание нового проекта: Если ничего не помогает, создайте новый проект и импортируйте только те зависимости, которые вам действительно нужны. Это поможет вам удостовериться, что код в вашем проекте не конфликтует с чем-то еще.

Заключение

Конфликт имен в AndroidSourceSet — это распространенная проблема, особенно при использовании множества плагинов и библиотек. Убедитесь, что вы тщательно проверяете конфигурацию вашего проекта на наличие дублирования. Используйте проверку на существование SourceSet, как было предложено, и не забывайте про регулярные обновления в вашем проекте. Удачи в решении проблемы с Proto DataStore!

Оцените материал
Добавить комментарий

Капча загружается...