要进行脱机构建,您需要以某种方式提供所有必需的依赖关系。这里的选项之一就是将这些jar提交到版本控制。困难的部分是收集所有这些依赖关系。对于它可能有一个可以在两种模式操作的build.gradle文件(在线和离线):
buildscript {
repositories {
if ('allow' == System.properties['build.network_access']) {
mavenCentral()
} else {
maven {
url 'dependencies'
}
}
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.0-beta2'
}
}
要在离线模式下运行类型:
gradle --offline
以及在在线模式下运行:
gradle -Dbuild.network_access=allow
,并收集所有的依赖使用该脚本将运行在联机模式下的gradle产出,下载依赖于内部${project_dir}/.gradle_home
缓存和文物复制到本地Maven回购位于dependencies
文件夹中。
#!/usr/bin/python
import sys
import os
import subprocess
import glob
import shutil
# Place this in build.gradle:
# repositories {
# if ('allow' == System.properties['build.network_access']) {
# mavenCentral()
# } else {
# maven { url 'dependencies' }
# }
# }
def main(argv):
project_dir = os.path.dirname(os.path.realpath(__file__))
repo_dir = os.path.join(project_dir, "dependencies")
temp_home = os.path.join(project_dir, ".gradle_home")
if not os.path.isdir(temp_home):
os.makedirs(temp_home)
subprocess.call(["gradle", "-g", temp_home, "-Dbuild.network_access=allow"])
cache_files = os.path.join(temp_home, "caches/modules-*/files-*")
for cache_dir in glob.glob(cache_files):
for cache_group_id in os.listdir(cache_dir):
cache_group_dir = os.path.join(cache_dir, cache_group_id)
repo_group_dir = os.path.join(repo_dir, cache_group_id.replace('.', '/'))
for cache_artifact_id in os.listdir(cache_group_dir):
cache_artifact_dir = os.path.join(cache_group_dir, cache_artifact_id)
repo_artifact_dir = os.path.join(repo_group_dir, cache_artifact_id)
for cache_version_id in os.listdir(cache_artifact_dir):
cache_version_dir = os.path.join(cache_artifact_dir, cache_version_id)
repo_version_dir = os.path.join(repo_artifact_dir, cache_version_id)
if not os.path.isdir(repo_version_dir):
os.makedirs(repo_version_dir)
cache_items = os.path.join(cache_version_dir, "*/*")
for cache_item in glob.glob(cache_items):
cache_item_name = os.path.basename(cache_item)
repo_item_path = os.path.join(repo_version_dir, cache_item_name)
print "%s:%s:%s (%s)" % (cache_group_id, cache_artifact_id, cache_version_id, cache_item_name)
shutil.copyfile(cache_item, repo_item_path)
shutil.rmtree(temp_home)
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))
所以,每个相关变化后仅运行此脚本,并在dependencies
文件夹提交更改。然后,您可以使用gradle --offline
或gradle
离线构建。
英文自述会好的 – Cesar 2017-11-03 21:47:10
这个ivypot插件很酷。但它不能解决我的问题。我只需要缓存来自私有存储库的一组有限的依赖项。我不需要缓存所有内容。 因此,我需要搜索另一个类似的插件,或者在此插件代码中实现该功能。 – kinORnirvana 2017-11-09 10:46:49