【问题标题】:How to configure gradle to work "offline" (using cached dependencies)如何配置 gradle 以“离线”工作(使用缓存的依赖项)
【发布时间】:2015-11-17 05:46:20
【问题描述】:

我有一个命令行 apk 生成器,它使用相同的源代码编译大量 APK,因此这些应用具有相同的依赖项。

在 gradle 文档中我可以看到:

Gradle 项目需要网络连接才能下载依赖项。

我知道可以将 gradle 配置为离线工作,而不是下载它为其他 apk 下载的相同依赖项。如何激活这种离线模式?

【问题讨论】:

    标签: android android-studio gradle android-gradle-plugin android-build


    【解决方案1】:

    https://stackoverflow.com/a/61108329/870135 为基础,值得注意的是,如果您有一个 AAR 和一个 .pom 文件,并且像我一样从谷歌获得了一些没有任何文档,那么上面链接答案中的过程需要更多步骤:

    1. 在 ~/.android/manual-offline-m2 下创建一个目录,用作您的本地存储库,例如my_local_deps
    2. 在本地 repo 文件夹下创建一个或多个目录,以将工件组名称表示为手动嵌套文件夹(例如 com/my/thing 而不是一个名为 com.my.thing 的文件夹)
    3. 创建一个名称与工件的模块名称或工件 ID 匹配的文件夹,例如我的库
    4. 在上一步的模块文件夹下创建一个文件夹作为版本说明符,例如一个名为 1.2.3 的文件夹
    5. 将您的 AAR 和 pom 文件放在上一步的版本文件夹下

    最终结果应该类似于 ~/.android/manual-offline-m2/com/my/thing/mylib/1.2.3/mylib-1.2.3.aar 和 mylib-1.2.3.pom在 Gradle 用语中称为“实现 'com.my.thing:mylib:1.2.3'”的工件

    现在,当您重新运行 Gradle 并从链接的答案运行 offline.gradle 脚本时,它应该会选择您的离线工件。容易,对吧?嘘

    【讨论】:

      【解决方案2】:

      我尝试过这种方法在离线模式下构建。

      1. 我已将 gradle 分发 ZIP 复制并保存在本地。
      2. 编辑了“distributionUrl”的 gradle-wrapper.properties 以指向本地文件
      3. 当我尝试在 linux "./gradlew --offline build" 中执行构建命令时,它会抛出错误:
      A problem occurred configuring project ':MyApp'.
      > Could not resolve all artifacts for configuration ':MyApp:classpath'.
         > Could not resolve com.android.tools.build:gradle:4.1.1
           Required by:
               project :MyApp
            > No cached version of com.android.tools.build:gradle:4.1.1 available for offline mode
      

      【讨论】:

        【解决方案3】:

        Gradle 在避免重新下载工件方面做得很好,但您可以将 --offline 传递给 Gradle 以防止在构建期间访问网络。

        例如

        gradle --offline build
        

        如果它需要网络中没有的东西,而不是尝试获取它,你的构建将会失败。

        【讨论】:

        • 哦,所以它不会下载我已经下载的任何依赖项?例如 google play services 7.5.0 等..?你 100% 确定吗?
        • 无法让它工作。使用--offline,它只会抱怨“没有缓存版本列表......可用于离线模式”。即使早些时候我已经成功地在线运行了相同的构建。我怎样才能让 Gradle 真正缓存这些东西?
        • 但是如何告诉它准备下线呢?
        【解决方案4】:

        Android Studio(3.6.1 版及更高版本)

        您可以通过激活此选项让 gradle 完全离线构建您的应用程序:

        这是来自 Android Studio Gradle 工具栏的屏幕截图 ?

        【讨论】:

        • 哦,天哪,我刚刚退休,发现这个选项就像过去一样。谢谢!有效!在此处编辑屏幕截图视图。
        • 感谢编辑,现在好多了。我很高兴听到它有帮助。
        【解决方案5】:

        Gradle 离线构建(从缓存或本地 repo 快速构建)(Android Studio v3.0+)

        配置离线构建依赖(gradle + maven)

        重要提示:离线仓库中不存在的库或android gradle插件版本,它将从远程下载。

        如果您想在没有网络连接的情况下构建项目,请按照 以下步骤将 IDE 配置为使用 Android Gradle 的离线版本 插件和 Google Maven 依赖项。

        如果您还没有这样做,download the offline components 来自 下载页面。

        离线组件下载解压

        下载离线组件后,将其内容解压到 以下目录,如果它不存在,您可能需要创建它:

        1. 在 Windows 上:%USER_HOME%/.android/manual-offline-m2/
        2. 在 macOS 和 Linux 上:~/.android/manual-offline-m2/

        要更新离线组件,请执行以下操作:

        1. 删除manual-offline-m2/目录内的内容。
        2. 重新下载offline components
        3. 将您下载的 ZIP 文件的内容解压缩到 <code>manual-offline-m2/ 目录。

        在您的 Gradle 项目中包含离线组件

        告诉 Android 构建系统使用您下载的离线组件 并解压后,您需要创建一个脚本,如下所述。记住,你 只需创建并保存一次此脚本,即使在更新您的离线版本后也是如此 组件。

        1. 使用以下路径和文件名创建一个空文本文件:

          在 Windows 上:%USER_HOME%/.gradle/init.d/offline.gradle

          在 macOS 和 Linux 上:~/.gradle/init.d/offline.gradle

        2. 打开文本文件并包含以下脚本:

          def reposDir = new File(System.properties['user.home'], ".android/manual-offline-m2")
          def repos = new ArrayList()
          reposDir.eachDir {repos.add(it) }
          repos.sort()
          allprojects {
            buildscript {
              repositories {
                    for (repo in repos) {
                          maven {
                          name = "injected_offline_${repo.name}"
                          url = repo.toURI().toURL()
                                }
                }
              }
            }
            repositories {
              for (repo in repos) {
                maven {
                  name = "injected_offline_${repo.name}"
                  url = repo.toURI().toURL()
                }
              }
            }
          }
          
        3. 保存文本文件。

        4. (可选)如果您想验证离线组件是否正常工作 打算从项目的build.gradle 中删除在线存储库 文件,如下图。在您确认您的项目构建正确之后 如果没有这些存储库,您可以将它们放回您的 build.gradle 文件。

          buildscript {
              repositories {
          // Hide these repositories to test your build against
          // the offline components. You can include them again after
          // you've confirmed that your project builds ‘offline’.
          // google()
          // jcenter()
              }
              ...
          }
          allprojects {
              repositories {
                  // google()
                  // jcenter()
              }
              ...
          }
          

        注意:此脚本适用于您在工作站上打开的所有 Gradle 项目。

        来源:https://developer.android.com/studio/intro/studio-config#offline

        • 从上述文档下载 Gradle 插件和 Maven 和设置
        • 如果出现任何问题,请按照以下 stackoverflow 链接中的解决方案进行操作

        Android Studio: Configure offline build dependencies


        【讨论】:

          【解决方案6】:

          Android 工作室

          在 Android Studio 中,您可以通过激活此选项让 gradle 完全离线构建您的应用:

          Settings -> Build, Execution, Deployment -> Build tools -> Gradle


          Gradle CLI

          在 Gradle 命令行界面中,您可以使用 --offline 标志完成此操作。

          指定构建应该在不访问网络资源的情况下运行。

          【讨论】:

          • “Gradle home”路径必须设置在哪里?
          • 设置菜单在文件菜单下——对于像我这样的新手来说就是如此!
          猜你喜欢
          • 2016-10-10
          • 2019-07-18
          • 2015-11-14
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多