使用持续集成来实现多模块依赖性

时间:2014-07-03 18:11:15

标签: jenkins android-studio continuous-integration android-gradle

刚开始使用Android Studio / Gradle / CI,我有一个Android Studio项目设置,其结构类似于:

┌ Project
│
├── Module "lib-core" (produces .aar)
│  
├── Module "lib-v1" (produces .aar, depends on "core-lib")
│  
├── Module "lib-v2" (produces .aar, depends on "core-lib")
│  
├── ... (potentially mode libs)
│  
└── Module "test-app" (produces .apk, depends on "lib-v1" and "lib-v2")

“lib-core”只能直接在这个项目中使用,而“lib-v1”和“lib-v2”也可以用于其他项目(“test-app”是一个示例项目来显示用法“lib-s”)并且需要在我们的Maven回购中作为aar-s。

这个项目也是用Jenkins构建的,工件去了当地的Maven仓库(Sonatype Nexus)。这是通过“assembleRelease uploadArchives”任务实现的。作为CI的一部分,项目需要相应地进行版本化。理想情况下,所有lib模块(实际上都是它们的工件)应保持相同的版本。

现在解决这个问题:假设我已将版本提升到1.4.2。现在,当Jenkins尝试评估构建脚本时,它抱怨版本1.4.2的“lib-core”尚不存在,这是事实。这是“lib-v1”通过'compile“org.example依赖于”lib-core“的情况:lib-core:1.4.2@aar”'

另一方面,如果“lib-v1”通过'compile project(“:lib-core”)'声明对“lib-core”的依赖,则在Nexus-repo上生成pom.xml(用于“lib-v1”)不包含对“lib-core”的正确引用...不幸的是我目前无法访问样本,但如果我没记错,groupId就是“未解决”的行, “未指明”或类似的。因此,在这种情况下,“lib-v1”不能在管道中进一步使用(使用{transitive = true}来解析“lib-core”)

有没有办法设置构建脚本,以便构建“lib-core”并在评估其他模块之前上传,但不将其拆分为多个项目?或者其他一些设置方法可以在开发人员计算机和CI服务器上构建这个项目吗?

在某种程度上,我似乎过于复杂化了,这可以通过其他(简单)方式实现,我目前还没有看到它。

修改

当我使用'compile project(“:lib-core”)声明依赖项时,我在pom.xml中为Nexus repo上的“lib-v1”获得以下内容:

<dependency>
<groupId>Library</groupId>
<artifactId>lib-core</artifactId>
<version>unspecified</version>
<scope>compile</scope>
</dependency>

artifactId是正确的,但groupId是模块名称,而版本是“未指定” - 因此使用“lib-v1”的项目无法解析“lib-core”依赖项。

1 个答案:

答案 0 :(得分:1)

我不认为在评估其他模块之前可以做“构建及其工件上传”,因为gradle必须在“执行”短语之前完成“配置”短语在“配置”短语期间,gradle将尝试评估所有模块中的所有依赖项。

但是,“通过'编译项目(”:lib-core“)”声明依赖于“lib-core”应该适用于你,我们有类似的设置,你的工作正常。也许你的build.gradle中的模块gradle / version有些不对劲。如果您可以提供更多详细信息,例如pom.xml和build.gradle,会更清楚。

您可以尝试在项目级别的build.gradle中进行跟踪。

allprojects {
    group = 'Library'
    version = '1.4.2.'
}