2017-09-05 84 views
2

是否有可能只使用build.gradle文件下载gradle依赖关系?下载依赖只有build.gradle文件

我试图做到的是以下几点:

我有一组的单元测试,我想执行它们(作为CI过程的一部分)码头工人,容器内。最初,我使用Docker Hub的openjdk:8-jdk图像作为我的测试的基础映像。因此,搬运工撰写文件包含以下内容:

version: '3.2' 

services: 

    unit: 
    image: openjdk:8-jdk 
    volumes: 
     - ..:/usr/test 
    working_dir: /usr/test 
    command: sh -c "exec ./gradlew junitPlatformTest -Punit -p moduleA/" 

整个项目安装在容器内/usr/test目录。当容器启动时,它将对moduleA执行junitPlatformTest任务。 openjdk:8-jdk图像的问题在于,每次运行unit服务时都会下载gradle及其依赖项。

为了解决这个问题,我决定创建一个新的图像,这个图像会有gradle和我已经下载的项目依赖项。该Dockerfile如下:

FROM openjdk:8-jdk 
COPY . /usr/test 
WORKDIR /usr/test 
RUN apt-get -y install wget unzip 
RUN wget https://services.gradle.org/distributions/gradle-4.1-bin.zip 
RUN mkdir /opt/gradle 
RUN unzip -d /opt/gradle gradle-4.1-bin.zip 
RUN /opt/gradle/gradle-4.1/bin/gradle dependencies 

build.gradle文件位于同一文件夹中Dockerfile所以COPY . /usr/test拷贝它在工作目录的命令。

但是,执行gradle dependencies命令不会下载这些库。在建立图像后,运行一个容器并进入它(使用docker exec),似乎~/.gradle/caches/modules-2/files-2.1/目录仅包含pom文件,而不是jar。

如果gradle dependencies是正确的命令,我不会使用它。有什么建议么?

编辑 - 摇篮文件

apply plugin: 'java' 

sourceCompatibility = 1.8 

repositories { 
    jcenter() 
} 

ext.versions = new Properties() 
file("./versions.properties").withInputStream { 
    stream -> ext.versions.load(stream) 
} 

dependencies { 
    testCompile("org.junit.jupiter:junit-jupiter-api:$versions.junitJupiterVersion") 
    testCompile("org.junit.jupiter:junit-jupiter-engine:$versions.junitJupiterVersion") 
    testCompile("org.junit.jupiter:junit-jupiter-params:$versions.junitJupiterVersion") 
    testCompile("org.mockito:mockito-core:'$versions.mockitoCore") 
    testCompile("org.junit.platform:junit-platform-launcher:1.0.0-RC3") 

    compile("com.google.inject:guice:$versions.guice") 
    .... 
} 
+0

你能提供你的gradle文件吗? – yamenk

+0

请在你的问题中分享gradle文件 –

+0

@yamenk,Tarun Lalwani添加了gradle文件 – Schaliasos

回答

2

下方添加到您的gradle这个文件

task download (type: Exec) { 
    configurations.testCompile.files 
    commandLine 'echo', 'Downloaded all dependencies' 

    } 

而且改变

RUN /opt/gradle/gradle-4.1/bin/gradle dependencies 

RUN /opt/gradle/gradle-4.1/bin/gradle 

这将缓存所有依赖于~/.gradle当您运行gradle这个命令。它也会下载罐子,而不仅仅是poms。如果你想进一步缓存你甚至可以使用命名卷为gradle文件夹

version: '3.2' 

services: 

    unit: 
    image: openjdk:8-jdk 
    volumes: 
     - ..:/usr/test 
     - gradlecache:/root/.gradle/ 
    working_dir: /usr/test 
    command: sh -c "exec ./gradlew junitPlatformTest -Punit -p moduleA/" 
volumes: 
    gradlecache: {} 
+0

您的解决方案奏效。谢谢 :)。 – Schaliasos

0

你的想法是正确的,但这种方法是错误的。首先,不需要手动下载和安装Gradle,这正是Gradle Wrapper为您所做的。其次,不需要破解Gradle来强制下载依赖关系 - 它没有任何意义。只需从容器中检出/克隆测试项目,然后使用./gradlew clean test运行测试。没有必要使用当地的/usr/test目录,因为它使用相对位置,因此它只在您以精确的方式布置文件时才起作用。

编辑: 如果你不想下载摇篮或依赖于每个生成,可以通过卷映射$HOME/.m2目录到主机启动容器,以便下载一次依赖留在本地Maven缓存。为避免下载Gradle,您可以使用Gradle构建自己的Docker镜像。

+0

如果我理解他的话,他不想为每个新的容器安装下载所有东西(包装和依赖)。 –

+0

你不想复制到'$ HOME/.m2'中,因为这会掩盖坏版本库或本地缓存jar的问题。其他用户可能无法以这种方式重复构建。它也会相对较慢(它需要重新校验每个构建,并且会被使用maven缓存的其他项目更新)。 – jkinkead

+0

@jkinkead没有人对复制'$ HOME/.m2'表示任何事情,请再次阅读我的回复 –