gradle中的哪些路径可以在没有Internet的情况下重新生成?

gradle中的哪些路径可以在没有Internet的情况下重新生成?,gradle,Gradle,我是Gradle(以及整个Java生态系统)的新手,所以请原谅任何误解 根本问题 我在使用Gradle等工具时遇到的一个问题是,它们会自动从互联网上获取内容,并根据安装数据将下载的副本视为短暂的副本,前提是这些内容始终可以再次下载。这与我非常小心遵守的一条旧规则背道而驰(归功于奥尔多·利奥波德): 保持每一个齿轮和轮子是智能修补的首要预防措施 我希望能够,比如说,在20年后,当所有这些依赖性都从互联网上消失的时候,启动一个新的虚拟机,安装操作系统、IDE和构建工具,看到项目现在的工作方式,甚至使

我是Gradle(以及整个Java生态系统)的新手,所以请原谅任何误解

根本问题 我在使用Gradle等工具时遇到的一个问题是,它们会自动从互联网上获取内容,并根据安装数据将下载的副本视为短暂的副本,前提是这些内容始终可以再次下载。这与我非常小心遵守的一条旧规则背道而驰(归功于奥尔多·利奥波德):

保持每一个齿轮和轮子是智能修补的首要预防措施

我希望能够,比如说,在20年后,当所有这些依赖性都从互联网上消失的时候,启动一个新的虚拟机,安装操作系统、IDE和构建工具,看到项目现在的工作方式,甚至使用相同的依赖性创建一个新项目。我总是对操作系统和软件安装程序进行归档(通常会特意避开“在线”安装程序),因此其中的一个障碍就是Gradle自动下载东西的习惯

混乱的解决方案 在经历了一些挫折之后,我想出了一个方案,这个方案相当粗糙,但确实有效。我将我的
GRADLE\u USER\u HOME
设置到本地网络文件系统上的一个目录中,该文件系统得到了很好的维护,并通过多次硬盘故障、新服务器安装等保持了多年的连续性

为了测试这是否真的有效,我将两台机器设置为使用相同的
GRADLE\u USER\u HOME
目录,一台可以访问互联网,另一台不能。我在互联网允许的系统中启动了一个项目,并构建了它,获得了所有依赖项。然后我切换到Internet拒绝系统,并能够启动具有相同依赖关系的新项目。你必须告诉Gradle离线工作,但一旦你这么做了,它就可以构建项目了

因为依赖关系被保存到Gradle称为“缓存”的东西中——这意味着某种暂时性的东西——为了增加安全性,我还决定将整个目录树放入版本控制存储库中。(我意识到这不是版本控制的原型用法,但它确实有效。)这样,如果Gradle决定删除某些内容,我知道我总是可以返回到工作状态,只要我在拉取新依赖项后构建任何项目时提交此存储库。话虽如此,我不知道Gradle是否真的会删除缓存的依赖项,并且怀疑它不会删除—我只是出于防御,因为Gradle的总体设计基础是“这些文件将始终在那里下载。”

提出问题 使用此方案几天后,我注意到该方案的一个问题是,Gradle不断地将新内容放入
Gradle\u USER\u HOME
目录中,我确信这对于安全存档依赖项的目标并不重要。特别是,我高度怀疑它保存了正在构建的本地项目的各种构建输出的所有独特状态。我有他们的源代码,所以我完全不需要保存它们。这将导致配置文件存储库无限增长

因此,我的主要问题是,我可以从配置文件存储库中排除哪些路径和文件名模式,以防止它存储无限的垃圾,即使没有互联网,Gradle也会默默地重建这些垃圾,如果它们丢失了呢?我并不担心这里或那里的一些一次性对象,而是担心在构建过程中不断生成或变异的对象

一个共同的问题是,是否有一种完全不同的方法可以实现相同的目标,比这个公认的混乱计划更好

(理想情况下,任何自动从Internet下载资产的程序都应该提供将资产存储到用户定义的位置,并在其中检查资产。不过,我通常看不到此类选项。在Gradle中,我只看到了使用本地目录解决依赖关系的选项,而不是存储到该目录中的选项。)

我意识到另一种可能是设置类似本地Maven服务器的东西。我对Maven基本一无所知,所以我担心它可能会增加不必要的复杂性。另一个问题是,我读到的一些东西表明Maven缓存外部依赖项——还有“缓存”这个词,表明它并没有试图归档它们。我怀疑我只是将问题从dev机器转移到Maven机器

我也尝试过手动下载依赖项,但由于依赖项是可传递的,所以即使对于一个微不足道的项目,也很难做到这一点,而且我从来没有成功过。联网的
GRADLE\u USER\u HOME
更容易工作,但效率也相当低