分别管理传递依赖

时间:2016-08-16 20:29:42

标签: gradle

我的公司给了我一个有趣的问题需要解决。我们有一个内部Artifactory服务器。出于原因,该服务器根本不在互联网上,但是,当配置完所有内容后,它将为公司中的每个产品提供所有依赖关系管理。如果库不在我们的神器服务器中,则炸毁构建和maven中心,并且在我们的防火墙中为典型用户阻止所有镜像。好?确定。

因此问题就变成了批准的库及其瞬态从maven central到我们的神器服务器。由于我们的服务器不是,也永远不会在互联网上,因此必须由管理员工作站完成。

由于原因,我必须在主库和它们的依赖项之间进行隔离。所以在神器中,我们有两个存储库,它看起来像这样:

third-party <- approved libraries
transients <- transient dependencies of approved libraries

因此,我希望能够在Gradle中实现这一目标,而不是尝试从头开始使用python。这就是我想要它做的事。

任务1.当批准库时,管理器会转到专门的gradle构建文件。他们输入库的典型信息作为依赖,与任何其他java应用程序没有什么不同(他们可以输入多个,但我会继续像他们刚刚输入一样)。他们执行任务。该任务将在构建下创建2个文件夹。 Build/thirdpartybuild/transient。它将他们直接输入的文件下载到thirdparty文件夹中。这将是一个完整的下载,lib,源,jar,pom一切。基本上是maven repo的克隆。然后,对于任何瞬态依赖项,在transient文件夹中执行相同的操作。

任务2:一旦用户返回私人网络(最有可能涉及走过街道),他们就会发出第二个任务。该任务将采用build / thirdparty中的所有内容并将它们安装到artifactory.com/thridparty存储库中。然后从transient文件夹中取出所有内容并将它们安装到artifactory.com/transient存储库中。

关键是下载文件。有没有办法在gradle中我可以说直接依赖在这个文件夹和该文件夹中的瞬态?​​

- 修改

我正在阅读gradle 3.0源代码,我认为我运气不好,除非我破解报告插件并将其转换为我正在寻找的内容,否则我会感觉到这种感觉。

一个简单的怎么样。让gradle将libs放在一个文件夹中是件小事。如何让gradle将maven中央pom文件放在文件夹中?如果我可以创建一个允许我执行gradle prime-cache的任务并让它拉下依赖jar,pom,src和javadocs并将它们放入我选择的文件夹中,我可以用python完成其余的工作。 / p>

1 个答案:

答案 0 :(得分:1)

这不优雅,但可能有所帮助。假设我们有一个使用Spring Core,Spring Context和Spring JDBC的简单类:

package net.codetojoy.service;

import org.springframework.context.*;
import org.springframework.jdbc.core.JdbcTemplate;

public class UserService implements ApplicationContextAware {
    private JdbcTemplate jdbcTemplate;

    public void setApplicationContext(ApplicationContext applicationContext) {
    }
}

然后,如果我们追踪&#34;直接依赖&#34; jars,我们可以使用configurations.compile迭代所有的jar并对其进行排序。请参阅下面的myTask

apply plugin: 'java'

repositories {
    mavenCentral()
}

def buildMap(g, n, v) {
    return [group: g, name: n, version: v]
}

def SPRING_CORE = buildMap 'org.springframework','spring-core','4.3.2.RELEASE'
def SPRING_CONTEXT = buildMap 'org.springframework','spring-context','4.3.2.RELE
ASE' 
def SPRING_JDBC = buildMap 'org.springframework','spring-jdbc','4.3.2.RELEASE' 

def directDependencies = []
directDependencies << SPRING_CORE
directDependencies << SPRING_CONTEXT
directDependencies << SPRING_JDBC

dependencies {
    compile SPRING_CORE
    compile SPRING_CONTEXT
    compile SPRING_JDBC

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

def isInDirectDependencies = { jar ->
    def result = false

    directDependencies.each { d ->
        def regex = ".*${d.group}.*${d.name}.*${d.version}.*"
        if (jar.absolutePath ==~ regex) {
            result = true
        }
    }

    return result
}

task myTask << {
    configurations.compile.each { jar ->
        def isTransitive = ! isInDirectDependencies(jar)
        println "${jar.name} , isTransitive: ${isTransitive}"
    }
}

另一种方法是解析gradle dependences的输出,但上面给出的方法的优点是可以访问jar的完整路径。