Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为离线开发构建Gradle存储库_Gradle_Offline - Fatal编程技术网

为离线开发构建Gradle存储库

为离线开发构建Gradle存储库,gradle,offline,Gradle,Offline,我正在为一个软件实现一个Gradle构建系统,该软件的部分是在没有互联网连接或无法安装Maven/Ivy服务器(如Nexus)的地区开发的。为了支持这些环境中的开发,我准备了一个Gradle插件,它允许生成“离线工作区” 我最初通过触发项目中每个配置的解析(触发所有依赖项的下载)来实现此功能,然后遍历每个配置的整个依赖项树,并将依赖项的本地缓存副本复制到脱机工作区。(为每个复制操作生成一个复制任务。)然后使用flatDir存储库引用这些JAR 此实现使用afterEvaluate块执行其工作。虽

我正在为一个软件实现一个Gradle构建系统,该软件的部分是在没有互联网连接或无法安装Maven/Ivy服务器(如Nexus)的地区开发的。为了支持这些环境中的开发,我准备了一个Gradle插件,它允许生成“离线工作区”

我最初通过触发项目中每个配置的解析(触发所有依赖项的下载)来实现此功能,然后遍历每个配置的整个依赖项树,并将依赖项的本地缓存副本复制到脱机工作区。(为每个复制操作生成一个复制任务。)然后使用flatDir存储库引用这些JAR

此实现使用afterEvaluate块执行其工作。虽然这在Gradle 2.0中运行良好,但在Gradle 2.2.1中会触发一个弃用警告,因为触发解析在某种程度上被视为在已解析配置后修改配置(
尝试更改配置:core:runtime”已包含在依赖项解析中。此行为已被弃用,并计划在Gradle 3.0中删除).总之,这种方法感觉相当粗糙,因为它还要求我修改build.gradle文件以显式列出所有可传递的依赖项,因为没有POM文件可用于正确指定依赖项

一种更优雅的方法似乎是构建一个包含所有依赖项(包括POM文件、源JAR、javadoc JAR等)的本地Maven存储库,然后只使用mavenLocal()存储库类型。不幸的是,我不知道如何正确地做到这一点,因为我不需要触发工件解析来执行此操作


有没有更好的方法可以让我以一种易于打包的方式下载完整的工件,而不仅仅是压缩我的整个$USER\u HOME/.gradle目录?

要进行脱机构建,您需要以某种方式提供所有必需的依赖项。这里的一个选项就是将这些JAR提交到版本控制中。困难的部分是收集ct所有这些依赖项。为此,可以有一个build.gradle文件,该文件可以在两种模式(在线和离线)下运行:

buildscript{
存储库{
if('allow'==System.properties['build.network\u access'])){
mavenCentral()
}否则{
马文{
url“依赖项”
}
}
}
依赖关系{
classpath'com.android.tools.build:gradle:1.2.0-beta2'
}
}
要在脱机模式下运行,请键入:

gradle --offline
要在联机模式下运行,请执行以下操作:

gradle -Dbuild.network_access=allow
要收集所有依赖项,请使用此脚本以联机模式运行gradle,获取依赖项以缓存在
${project\u dir}/.gradle\u home
中,并将工件复制到
依赖项
文件夹中的本地maven存储库

!/usr/bin/python
导入系统
导入操作系统
导入子流程
导入glob
进口舒蒂尔
#将此文件放入build.gradle:
#存储库{
#if('allow'==System.properties['build.network\u access'])){
#mavenCentral()
#}其他{
#maven{url'依赖项'}
#     }
# }
def总管(argv):
project_dir=os.path.dirname(os.path.realpath(_文件__))
repo\u dir=os.path.join(项目目录,“依赖项”)
temp\u home=os.path.join(项目目录,“.gradle\u home”)
如果不是操作系统路径isdir(临时主页):
操作系统makedirs(临时主页)
子进程调用([“gradle”、“-g”、temp\u home、“-Dbuild.network\u access=allow”])
cache\u files=os.path.join(temp\u home,“cache/modules-*/files-*”)
对于glob.glob(缓存文件)中的缓存目录:
对于os.listdir(cache\u dir)中的cache\u group\u id:
cache\u group\u dir=os.path.join(cache\u dir,cache\u group\u id)
repo_group_dir=os.path.join(repo_dir,cache_group_id.replace('.','/'))
对于os.listdir(cache\u group\u dir)中的cache\u工件\u id:
cache\u artifact\u dir=os.path.join(cache\u group\u dir,cache\u artifact\u id)
repo\u artifact\u dir=os.path.join(repo\u group\u dir,cache\u artifact\u id)
对于os.listdir(缓存工件目录)中的缓存版本id:
cache\u version\u dir=os.path.join(cache\u artifact\u dir,cache\u version\u id)
repo\u version\u dir=os.path.join(repo\u artifact\u dir,cache\u version\u id)
如果不是os.path.isdir(repo\u version\u dir):
os.makedirs(回购版本目录)
cache\u items=os.path.join(cache\u version\u dir,“*/*”)
对于glob.glob中的缓存项(缓存项):
cache\u item\u name=os.path.basename(cache\u item)
repo\u item\u path=os.path.join(repo\u version\u dir,cache\u item\u name)
打印“%s:%s:%s(%s)”%(缓存\u组\u id、缓存\u工件\u id、缓存\u版本\u id、缓存\u项目\u名称)
copyfile(缓存项、恢复项路径)
shutil.rmtree(临时住宅)
返回0
如果名称=“\uuuuu main\uuuuuuuu”:
系统出口(主(系统argv))

因此,在每次依赖项更改之后,只需运行此脚本并在
dependencies
文件夹中提交更改。然后您可以使用
gradle--offline
离线构建,或者只使用
gradle
在过去,我使用了类似的解决方案,尽管“我的”复制脚本是在groovy而不是python中完成的

几周前我发现了另一种方法:有。现在你不必再使用任何“外部”脚本,插件可以将所有依赖项复制到本地目录中,这是一个常春藤repo


可以找到一个测试项目。如果有需求,我可以提供一个英文自述文件。

最直接的解决方案是快照整个依赖项缓存目录:
~/.gradle

但也存在一些挑战:

  • 这将需要大量的dis