#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 может работать в автономном режиме, и в этом случае он должен использовать только кэшированные зависимости… то, что вы пытаетесь сделать, сложно и ненадежно. Если автономные сборки не работают, возможно, проверьте этот плагин , который может сделать это за вас.