#gradle
#gradle
Вопрос:
У меня есть простой многомодульный проект, и я хотел бы создать из него дистрибутив. Я бы примерно хотел, чтобы дистрибутив выглядел так
foo/
bar/
baz/
Для каждого модуля я хотел бы объявить, что их артефакты (и зависимости) переходят в один из foo
каталогов , bar
, или baz
в дистрибутиве.
Очевидная вещь, похоже, не работает, и в документах Gradle неясно, как именно artifacts
configurations
работает , поэтому я не уверен, что я сделал не так.
У меня в корне build.gradle
configurations {
foo
bar
baz
}
Затем moduleA
я помещаю его артефакты:
artifacts {
foo jar
}
И так далее, для каждого модуля его артефакты устанавливаются в желаемую конфигурацию.
Эти конфигурации перечислены, если я распечатываю их ala configurations.each {c -> println(c.name) }
, поэтому они созданы правильно, но если я попытаюсь выполнить итерацию по files
или allArtifacts
моих пользовательских конфигураций, они пусты.
Ранее я делал что-то подобное, создавая вспомогательные модули, зависимости которых будут перечислены следующим образом:
dependencies {
foo "com.mypackage.group:module:1.0"
}
А затем еще один модуль для bar
, и еще один для baz
и так далее. Казалось, это сработало, но поддерживать его было сложно. Использование пользовательских конфигураций вместе с артефактами казалось более удобным решением для этого.
Ответ №1:
Я думаю, вас интересует getArtifacts()
Вот пример
// generated with gradle init --type java-library
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
compile 'org.slf4j:slf4j-api:1.7.21'
testCompile 'junit:junit:4.12'
}
configurations {
foo {
extendsFrom compile
}
}
artifacts {
foo jar
}
task showMe << {
println "Files:"
configurations.foo.files.each { println " $it" }
println "Artifacts: "
configurations.foo.artifacts.each { println " $it" }
}
Вывод:
:showMe
Files:
/home/alpar/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.21/139535a69a4239db087de9bab0bee568bf8e0b70/slf4j-api-1.7.21.jar
Artifacts:
ArchivePublishArtifact_Decorated alpar:jar:jar:
Потенциально вы могли бы упростить это еще больше, обратившись непосредственно к задачам проектов (учитывая, что foo bar и т. Д. Являются проектами)
task distribution(type: Zip) {
from project(':foo').jar { into "foo" }
}
или
task distribution(type: Zip) {
('foo', 'bar').each { p ->
from project(":$p").jar { into p }
}
}
для краткости.
Похоже, что publish PublishArtifact не был улучшен для использования с Zip-задачей, поскольку это нетривиально для подключения.
Вы также можете перебирать все подпроекты, для которых определен некоторый пользовательский параметр для имени задачи, которую нужно выбрать, чтобы сделать ее более автономной в подпроектах.
Не забудьте также включить некоторые зависимости, чтобы ваша задача работала, даже если она вызывается после полной очистки или при новой проверке.