我正在尝试以一种项目使用由另一种构建的文件的方式配置两个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'
和存储库工作。
答案 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 API在PublishedArtifact
中声明这样的testA
。工件(例如,其扩展名)是根据someZip
任务的属性进行配置的。在您的示例中,该名称似乎不是来自someZip
任务,因为您手动设置了archiveName
;因此,我们需要明确声明它。如果您在archiveBaseName = 'xxx'
中使用someZip
,那么在添加工件时就不需要关闭。