定义工件以用作另一个项目中的依赖项

时间:2019-07-19 10:45:20

标签: gradle artifact gradle-dependencies

TL; DR

我正在尝试以一种项目使用由另一种构建的文件的方式配置两个Gradle项目。 Serial将第一个项目添加到第二个项目中,并且在第二个项目中将文件定义为依赖项。

项目includeBuild

testA

settings.gradle

rootProject.name = 'testA'

build.gradle

项目group = 'org.test' version = '0.0.0.1_test' task someZip (type: Zip) { from './settings.gradle' archiveName = 'xxx.zip' destinationDir = file("${buildDir}/test") } artifacts { //TODO add something here? }

testB

settings.gradle

rootProject.name = 'testB' if (System.getenv('LOCAL_COMPILATION') == 'true') { includeBuild '../testA' }

build.gradle

说明

您可能会注意到该示例具有使用maven存储库的选项。我想强调的是,最终将有可能做到这一点。 使用Maven存储库不是这个问题的重点,除了解决方案之外,不要干涉它。 (换句话说,您可以假设if (System.getenv('LOCAL_COMPILATION') != 'true') { repositories { maven { url '192.168.1.100' } } } configurations { magic } dependencies { magic 'org.test:xxx:0.0.0.+@zip' } task ultimateZip (type: Zip) { from configurations.magic archiveName = 'ultimate.zip' destinationDir = file("${buildDir}/ultimate-test") } 。)

问题是如何以其他项目能够识别的方式定义工件。

首选解决方案应该类似于Java插件,因为我在项目中使用jar依赖项,并且它们都通过System.getenv('LOCAL_COMPILATION') == 'true'和存储库工作。

1 个答案:

答案 0 :(得分:2)

以下设置应该可以使用(已通过Gradle 5.5.1测试)。除XXX所指示的更改外,它基本上与您的原始设置相对应。

项目testA

settings.gradle

rootProject.name = 'testA'

build.gradle

group = 'org.test'
version = '0.0.0.1_test'

task someZip (type: Zip) {
    from './settings.gradle'
    archiveName = 'xxx.zip'
    destinationDir = file("${buildDir}/test")
}

// XXX (replaced your empty "artifacts" block)
configurations.create('default')
def myArtifact = artifacts.add('default', someZip) {
    name = 'xxx'
}

// XXX (only added to show that publishing works)
apply plugin: 'maven-publish'
publishing {
    repositories {
        maven { url = 'file:///tmp/my-repo' }
    }
    publications {
        myPub(MavenPublication) {
            artifactId myArtifact.name
            artifact myArtifact
        }
    }
}

项目testB

settings.gradle

rootProject.name = 'testB'

if (System.getenv('LOCAL_COMPILATION') == 'true') {
    // XXX (added a dependency substitution to let Gradle know that
    //      "org.test:xxx" corresponds to the testA project)
    includeBuild('../testA') {
        dependencySubstitution {
            substitute module('org.test:xxx') with project(':')
        }
    }
}

build.gradle

if (System.getenv('LOCAL_COMPILATION') != 'true') {
    repositories {
        // XXX (only changed to show that resolution still works after
        //      publishing)
        maven { url = 'file:///tmp/my-repo' }
    }
}

configurations {
    magic
}

dependencies {
    magic 'org.test:xxx:0.0.0.+@zip'
}

task ultimateZip (type: Zip) {
    from configurations.magic
    archiveName = 'ultimate.zip'
    destinationDir = file("${buildDir}/ultimate-test")
}

根据评论中的要求,以下是有关创建的default配置和项目testA中添加的工件的更多说明。

Gradle中的综合构建当前具有替换项目依赖项“will always point to the default configuration of the target project”的局限性。在您的示例中,这意味着testA需要以default配置发布。因此,我们首先创建default配置。请注意,某些插件(例如java)已经创建了此配置;使用此类插件时,您无需自己创建它。

似乎没有在任何地方明确提及它,但是您似乎已经发现自己了,项目的PublishedArtifact(用project.artifacts声明)对于Gradle弄清楚它很重要排除复合构建中的依赖关系布线。因此,我们确保使用this APIPublishedArtifact中声明这样的testA。工件(例如,其扩展名)是根据someZip任务的属性进行配置的。在您的示例中,该名称似乎不是来自someZip任务,因为您手动设置了archiveName;因此,我们需要明确声明它。如果您在archiveBaseName = 'xxx'中使用someZip,那么在添加工件时就不需要关闭。