引入源依赖项
引言
本文介绍了一个名为“源依赖项”的新的Gradle依赖管理功能。
通常,当你声明对某个库的依赖项时,Gradle会在二进制仓库(例如JCenter或Maven Central)中查找该库的二进制文件,并下载这些二进制文件以供构建使用。
源依赖项允许你让Gradle自动从Git检出库的源文件,并在你的机器上本地构建二进制文件,而不是下载它们。
我们很乐意收到您对此功能的反馈。请尝试使用它,并告诉我们哪些对您有用,以及您遇到的任何问题。您可以在Gradle论坛上留下反馈,或在Gradle native GitHub仓库中提出问题。
您应该注意,此功能目前处于孵化阶段,在Gradle未来的版本中可能会发生破坏性更改。在未来的版本中该功能升级到稳定版之前,请勿在生产环境中使用此功能。
如何尝试? #
您可以在native-samples仓库中找到许多使用源依赖项的示例。C++构建是使用源依赖项的自然场所,但这并非C++特有的功能。源依赖项适用于任何使用Gradle依赖管理功能的构建类型,例如Java、Kotlin或Android构建。您可以使用最新的Gradle 4.10或nightly版本来尝试此功能。
让我们看一个示例应用程序。此示例展示了一个使用位于单独Git仓库中的库的应用程序。
源依赖项在构建文件中看起来与二进制依赖项相同。你声明对某个模块(例如库)特定版本的依赖项。这里,我们的示例需要“utilities”库的1.0版本。
dependencies {
implementation 'org.gradle.cpp-samples:utilities:1.0'
}
你还需要告诉Gradle在哪里找到库的源文件。这类似于你如何通过在构建中定义一些二进制仓库来告诉Gradle在哪里找到二进制文件,但是语法是不同的。在settings.gradle
文件中,我们定义了一个源映射
sourceControl {
gitRepository("https://github.com/gradle/native-samples-cpp-library.git") {
producesModule("org.gradle.cpp-samples:utilities")
}
}
现在,当Gradle需要查找“utilities”库的某个版本时,它将在Git仓库中查找匹配的标签。Gradle将检出匹配的Git标签,构建二进制文件并使结果可用。这与包含的构建的工作方式相同。
这是在此示例上运行gradle assemble
的结果
> Task :native-samples-cpp-library:list:compileDebugCpp
> Task :native-samples-cpp-library:utilities:compileDebugCpp
> Task :native-samples-cpp-library:list:linkDebug
> Task :compileDebugCpp
> Task :native-samples-cpp-library:utilities:linkDebug
> Task :linkDebug
> Task :installDebug
> Task :assemble
BUILD SUCCESSFUL in 4s
3 actionable tasks: 3 executed
Gradle克隆了库的源代码,构建了库二进制文件,然后将应用程序与这些二进制文件链接。
你也可以使用稍微不同的语法声明对分支的依赖。这个示例应用程序演示了如何做到这一点。
dependencies {
implementation('org.gradle.cpp-samples:utilities') {
version {
branch = 'release'
}
}
}
源依赖项也适用于插件,但目前需要在settings.gradle
中进行一些额外的配置才能生效。此示例库演示了如何操作。
源依赖项有什么用? #
当您使用的模块的二进制文件在二进制仓库中不可用时,源依赖项会很有用。例如:
- 当您正在处理某个库的分支,并且该分支尚未发布二进制文件时。例如,您可能希望使用尚未合并或发布的分支中的一些错误修复。
- 当您使用仅发布源代码而没有二进制文件的库时。这在C++库和应用程序中很常见,这些库仅以源代码形式发布,您必须自己构建二进制文件。
- 当您使用的原生库没有为您的目标平台发布二进制文件时。C++库或应用程序通常只为某些常见的操作系统或工具链发布二进制文件。要在其他平台上使用该库,您必须自己构建二进制文件。
- 当您不想等待另一个系统(例如CI服务器)发布依赖项的二进制文件时。例如,您可能想尝试修改几个库。
源依赖项使这些用例的实现变得更简单。Gradle负责自动检出正确版本的依赖项,确保在需要时构建二进制文件。它在构建运行的任何地方都这样做。检出的项目甚至不需要现有的Gradle构建。此示例展示了一个Gradle构建如何通过插件注入Gradle构建来使用两个**没有**构建系统的源依赖项。注入的配置可以执行常规Gradle插件所能做的任何事情,例如包装现有的CMake或Maven构建。
源依赖项可以与Gradle的构建缓存结合使用,当团队中的每个人都从源代码构建相同的依赖项时,可以使这些用例高效。Gradle构建缓存确保一旦二进制文件构建完成,它们将在其他任何地方重复使用。
源依赖项可以与二进制依赖项一起使用,你可以混合搭配,以便一些依赖项从源代码构建,而另一些则作为二进制文件下载。源依赖项也与复合构建很好地配合使用。
这与复合构建有何不同? #
基本上,没有区别。源依赖项基于Gradle的复合构建功能,并增加了源代码的自动配置,以帮助解决一些特定用例。
源依赖项在*意图*上与包含的构建不同。包含的构建代表你当前正在处理的某个模块。依赖解析将始终使用包含的构建中的二进制文件,无论构建中请求的是哪个版本的模块,这样你就可以看到你的更改的效果。
另一方面,源依赖项代表你使用的某个模块,但它恰好以源代码形式而不是二进制形式提供。依赖解析将始终选择与构建中请求的任何内容匹配的源依赖项版本。对于包含的构建,你可以修改源代码并直接看到更改,但对于源依赖项,你需要提交并推送更改才能看到其效果。
缺失功能 #
源依赖支持仍处于实验阶段,并缺少一些重要功能
- 构建扫描尚不支持使用源依赖项的构建。
- IDE支持大多尚未可用。大多数IDE集成在使用源依赖项的构建时会报错。源依赖项目前仅由Gradle的Xcode集成支持C++。
- 依赖锁定不支持源依赖项。
- 源依赖项也具有与包含的构建相同的限制。
- 您不能依赖于包含包含构建的构建的源。但是,您可以依赖于使用源依赖项的构建的源。
- 目前尚不能对特定模块混合使用源依赖项和二进制依赖项。每个模块必须要么来自Git仓库,要么来自二进制仓库,不能两者兼有。
- 仅支持Git仓库。
路线图 #
我们希望收到您的反馈,并根据此实现上面列出的缺失功能。一旦我们满意DSL和API有用且表现良好,我们将把该功能提升为稳定版。请在Gradle论坛或Gradle native GitHub仓库上告诉我们您的想法。