作为一家软件公司,我们被要求提供软件及其所有依赖项。依赖关系应该被发布到另一个artifactory。换句话说,我们希望从我们的工具中获取所有项目的依赖关系,并将它们发布到另一个工具中,以使客户端能够构建软件。Gradle - 将所有项目的依赖关系发布到其他Artifactory
有没有办法在Gradle中做到这一点?
作为一家软件公司,我们被要求提供软件及其所有依赖项。依赖关系应该被发布到另一个artifactory。换句话说,我们希望从我们的工具中获取所有项目的依赖关系,并将它们发布到另一个工具中,以使客户端能够构建软件。Gradle - 将所有项目的依赖关系发布到其他Artifactory
有没有办法在Gradle中做到这一点?
public class MavenArtifactCopyTask extends DefaultTask {
@Input
List<Configuration> configurations;
@OutputDirectory
File repoDir
@TaskAction
void build() {
for (Configuration configuration : configurations) {
copyJars(configuration)
copyPoms(configuration)
}
}
private void copyJars(Configuration configuration) {
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 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))
}
}
}
}
使用
task copyMavenArtifacts(type: MavenArtifactCopyTask) {
configurations = [project.configurations.all, project.buildScript.configurations.classpath]
repoDir = file("$buildDir/mavenArtifacts")
}
一旦所有的罐子&劲歌是在Maven的目录结构,你可以在本地文件夹改编
我几乎得到了我想要的地方,使用你的建议。谢谢! 然而,问题在于我不知道如何获得POM的母体POM。有任何想法吗? – Cleankod
嗯...可以从'configuration.incoming.resolutionResult.allComponents'获取id而不是'configuration.incoming.resolutionResult.allDependencies'(参见[getAllComponents()](https://docs.gradle.org/3.4/ javadoc/org/gradle/api/artifacts/result/ResolutionResult.html#getAllComponents%28%29)) –
让我知道它是否有效。我可能会为此发布一个插件 –
的问题是,我不能复制所有的库,但只的那些项目的依赖。 – Cleankod