Как вы используете артефакты для сегментации артефактов сборки в пользовательские конфигурации для распространения

#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-задачей, поскольку это нетривиально для подключения.

Вы также можете перебирать все подпроекты, для которых определен некоторый пользовательский параметр для имени задачи, которую нужно выбрать, чтобы сделать ее более автономной в подпроектах.

Не забудьте также включить некоторые зависимости, чтобы ваша задача работала, даже если она вызывается после полной очистки или при новой проверке.