Загрузка зависимостей Gradle с файлами «.modules»

#maven #gradle #groovy

#maven #gradle #groovy

Вопрос:

В настоящее время у меня есть автономная среда, в которой у меня есть все мои зависимости (файлы jar, aar и pom). Дело в том, что я хочу использовать Coil (библиотеку изображений) в качестве зависимости в моем проекте Android. Эта библиотека также должна kotlinx-coroutines-core быть загружена в моей среде. Я смог загрузить все необходимые файлы, кроме .module file (метаданные модуля Gradle), что необходимо, поскольку существует несколько вариантов kotlinx-coroutines-core (версии для JVM, JS и Native).

Другими словами, мой код загружается kotlinx-coroutines-core-jvm-1.3.9.jar (с его POM), и kotlinx-coroutines-core-1.3.9.pom это здорово, но kotlinx-coroutines-core-1.3.9.module файл по-прежнему отсутствует, и я не уверен, как я могу его загрузить.

Вот мой код, основанный на этой сути:

 task copyDependencies() {
    def name = "default"
    def configuration = configurations.getByName(name)
    copyJars(configuration)
    copyPoms(configuration)
}

private void copyJars(Configuration configuration) {
    File repoDir = new File(project.buildDir, 'repository')

    configuration.resolvedConfiguration.resolvedArtifacts.each { artifact ->
        def moduleVersionId = artifact.moduleVersion.id
        File moduleDir = new File(repoDir, "${moduleVersionId.group.replace('.', '/')}/${moduleVersionId.name}/${moduleVersionId.version}")
        GFileUtils.mkdirs(moduleDir)
        GFileUtils.copyFile(artifact.file, new File(moduleDir, artifact.file.name))
    }
}

private void copyPoms(Configuration configuration) {

    def componentIds = configuration.incoming.resolutionResult.allDependencies.collect { it.selected.id }

    def result = project.dependencies.createArtifactResolutionQuery()
            .forComponents(componentIds)
            .withArtifacts(MavenModule, MavenPomArtifact)
            .execute()

    for (component in result.resolvedComponents) {
        def componentId = component.id

        if (componentId instanceof ModuleComponentIdentifier) {
            File repoDir = new File(project.buildDir, 'repository')
            File moduleDir = new File(repoDir, "${componentId.group.replace('.', '/')}/${componentId.module}/${componentId.version}")
            GFileUtils.mkdirs(moduleDir)
            File pomFile = component.getArtifacts(MavenPomArtifact)[0].file

            GFileUtils.copyFile(pomFile, new File(moduleDir, pomFile.name))
        }
    }
}
  

Итак, мой вопрос: как я могу загружать .module файлы при загрузке моих зависимостей? Примером может быть загрузка этого файла.

Ответ №1:

Чтобы скопировать файлы конфигурации в каталог, вы можете сделать это:

 task copyLibs(type: Copy) {
    from configurations.runtimeClasspath
    into file("$buildDir/repository")
}
  

Это скопирует все, включая транзитивные зависимости.

Не нужно писать весь этот код самостоятельно. Зачем вам нужны POM и все такое в пути к классам вашего приложения? Просто позвольте Gradle разобраться с этим за вас.

Комментарии:

1. Не уверен, что я объяснил себя. Моя цель здесь — создать автономный репозиторий gradle, в котором несколько проектов могут указывать и получать свои зависимости. Я работаю в автономной среде без доступа в Интернет (политика безопасности компании), поэтому я пытаюсь создать свою собственную версию репозитория maven с несколькими зависимостями. Без файлов POM gradle жалуется на их отсутствие и не может разрешить зависимости. В настоящее время эта настройка работает нормально, за исключением случаев, когда зависимости зависят от файлов метаданных модуля Gradle (в данном случае это транзитивная зависимость).

2. Что вам нужно сделать, так это в основном разрешить зависимости, когда у вас есть доступ к Интернету, а затем скопировать кеш зависимостей Gradle в любую среду, в которой он вам нужен. Gradle может работать в автономном режиме, и в этом случае он должен использовать только кэшированные зависимости… то, что вы пытаетесь сделать, сложно и ненадежно. Если автономные сборки не работают, возможно, проверьте этот плагин , который может сделать это за вас.