gpt4 book ai didi

gradle - 定义在另一个项目中用作依赖项的 Artifact

转载 作者:行者123 更新时间:2023-12-04 21:02:22 26 4
gpt4 key购买 nike

TL; 博士

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

项目testAsettings.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 :
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")
}

描述

您可能注意到该示例有一个选项使用 Maven 存储库。我想强调的是,最终有可能做到这一点。
但是,使用 Maven 存储库不是这个问题的重点,除了解决方案不应该干扰它。
(换句话说,您可以假设 System.getenv('LOCAL_COMPILATION') == 'true' 。)

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

首选解决方案应该类似于 Java 插件所做的,因为我在我的项目中使用了 jar 依赖项,并且它们都通过 includeBuild 工作。并通过存储库。

最佳答案

以下设置应该可以工作(使用 Gradle 5.5.1 测试)。除了 XXX 指示的更改外,它主要对应于您的原始设置。 .

项目testAsettings.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 的解释。项目中的配置和添加的 Artifact testA .

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

似乎没有在任何地方明确提及它,但您似乎已经发现自己, PublishedArtifact项目的 s(用 project.artifacts 声明)对于 Gradle 找出复合构建中的依赖关系很重要。因此,我们确保声明这样一个 PublishedArtifacttestA使用 this API . Artifact (例如,其扩展名)是基于 someZip 的属性配置的任务。这个名字似乎不是取自 someZip您的示例中的任务,因为您手动设置了 archiveName ;因此我们需要明确声明它。如果您使用 archiveBaseName = 'xxx'someZip相反,那么在添加 Artifact 时就不需要闭包了。

关于gradle - 定义在另一个项目中用作依赖项的 Artifact ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57110795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com