Assemble 所有 gradle 构建工件到一个目录中
Assemble all gradle build artifacts into a single directory
我们正在从 Maven 迁移到 Gradle 并且正在努力解决一件事。
我们有一个基于 Maven 的 POM 的多项目 Gradle-project。
大部分工作正常,但我们无法找到一种方法来收集 WAR 文件和 ZIP 文件,这些文件是构建子项目的结果。每个子项目代表一个微服务。
我们已经找到(也在 Whosebug 上)将所有 jar 和第三方库收集到一个目录中的方法。但是,我们正在寻找一种方法来收集每个微服务的资源和库。
在 Maven 中,我们做了这样的事情:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>Publish/</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>....</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>zip</type>
</artifactItem>
<artifactItem>
<groupId>....</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>war</type>
</artifactItem>
我想以一个可以找到的目录结束:
project1.war
project2.war
project3.zip
etc.
在每个生成工件(例如 zip)的项目中,您将工件添加到配置中。参见 artifact management
例如:
configurations {
archives
}
task myZip(type: Zip) { ... }
artifacts {
archives myZip
}
然后,在 uber 项目中,您将使用另一个配置来引用工件和一个 zip 任务来捆绑它们
configurations {
uber
}
dependencies {
uber project(path: ':project1', configuration: 'archives')
uber project(path: ':project2', configuration: 'archives')
uber project(path: ':project3', configuration: 'archives')
}
task uberZip(type: Zip) {
from configurations.uber
archiveName 'uber.zip'
destinationDir "$buildDir/uber"
}
以下解决方案是手工制作的,但很简单,如果您需要调整任何东西,它提供了灵活性。
下面是根目录下的build.gradle
。对于每个子项目,它将:
- 定义一个
copyArtifacts
任务,从子项目的 build/libs
文件夹中复制 war
和 zip
文件(使用适当的 baseName
、version
, 等) 到 root/dist
.
- 如果找到
war
任务,则对其进行配置,使其在 copyArtifacts
之后运行。
这可以很容易地更改为查找其他任务名称、匹配不同的文件名等。(人们可能想在复制之前删除给定工件的旧版本,等等。)
subprojects { Project subProject ->
task copyArtifacts {
doLast {
def baseName = subProject.archivesBaseName
def version = subProject.version
def group = subProject.group
def DIST_DIR = "${rootDir}/dist"
def SRC_DIR = "${buildDir}/libs"
ant.mkdir(dir: DIST_DIR)
ant.copy(todir: DIST_DIR) {
fileset(dir: SRC_DIR,
includes: "${baseName}*${version}*.war,${baseName}*${version}*.zip")
}
}
}
afterEvaluate {
def warTask = subProject.tasks.find { it.name == 'war' }
if (warTask) {
warTask.finalizedBy(copyArtifacts)
}
}
}
我们正在从 Maven 迁移到 Gradle 并且正在努力解决一件事。 我们有一个基于 Maven 的 POM 的多项目 Gradle-project。 大部分工作正常,但我们无法找到一种方法来收集 WAR 文件和 ZIP 文件,这些文件是构建子项目的结果。每个子项目代表一个微服务。 我们已经找到(也在 Whosebug 上)将所有 jar 和第三方库收集到一个目录中的方法。但是,我们正在寻找一种方法来收集每个微服务的资源和库。 在 Maven 中,我们做了这样的事情:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>Publish/</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>....</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>zip</type>
</artifactItem>
<artifactItem>
<groupId>....</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>war</type>
</artifactItem>
我想以一个可以找到的目录结束:
project1.war
project2.war
project3.zip
etc.
在每个生成工件(例如 zip)的项目中,您将工件添加到配置中。参见 artifact management
例如:
configurations {
archives
}
task myZip(type: Zip) { ... }
artifacts {
archives myZip
}
然后,在 uber 项目中,您将使用另一个配置来引用工件和一个 zip 任务来捆绑它们
configurations {
uber
}
dependencies {
uber project(path: ':project1', configuration: 'archives')
uber project(path: ':project2', configuration: 'archives')
uber project(path: ':project3', configuration: 'archives')
}
task uberZip(type: Zip) {
from configurations.uber
archiveName 'uber.zip'
destinationDir "$buildDir/uber"
}
以下解决方案是手工制作的,但很简单,如果您需要调整任何东西,它提供了灵活性。
下面是根目录下的build.gradle
。对于每个子项目,它将:
- 定义一个
copyArtifacts
任务,从子项目的build/libs
文件夹中复制war
和zip
文件(使用适当的baseName
、version
, 等) 到root/dist
. - 如果找到
war
任务,则对其进行配置,使其在copyArtifacts
之后运行。
这可以很容易地更改为查找其他任务名称、匹配不同的文件名等。(人们可能想在复制之前删除给定工件的旧版本,等等。)
subprojects { Project subProject ->
task copyArtifacts {
doLast {
def baseName = subProject.archivesBaseName
def version = subProject.version
def group = subProject.group
def DIST_DIR = "${rootDir}/dist"
def SRC_DIR = "${buildDir}/libs"
ant.mkdir(dir: DIST_DIR)
ant.copy(todir: DIST_DIR) {
fileset(dir: SRC_DIR,
includes: "${baseName}*${version}*.war,${baseName}*${version}*.zip")
}
}
}
afterEvaluate {
def warTask = subProject.tasks.find { it.name == 'war' }
if (warTask) {
warTask.finalizedBy(copyArtifacts)
}
}
}