构建Flutter Android项目如何避免访问dl.google.com、maven公网仓库?
问题原因
你虽然修改了项目根目录的build.gradle,但还有其他层级的配置会自动注入公网仓库,导致构建时仍然请求dl.google.com等公网地址。
解决步骤
检查android/settings.gradle配置
新版本Flutter Android项目会将仓库优先级配置放在settings.gradle的pluginManagement和dependencyManagement块中,你需要将这两个块内的google()、mavenCentral()、jcenter()配置全部删除,替换为你的私有Nexus仓库配置,和根build.gradle的仓库配置保持一致即可。强制过滤所有公网仓库
在根build.gradle的allprojects和buildscript的repositories块末尾添加以下逻辑,自动移除所有自动注入的公网仓库:repositories.each { repo -> if (repo instanceof MavenArtifactRepository) { def repoUrl = repo.url.toString() // 匹配所有公网仓库地址并移除 if (repoUrl.contains('dl.google.com') || repoUrl.contains('maven.apache.org') || repoUrl.contains('jcenter.bintray.com')) { repositories.remove(repo) } } }修改Flutter SDK内置的Gradle配置
Flutter工具会在构建时自动向项目注入公网仓库配置,你需要找到本地Flutter安装路径下的packages/flutter_tools/gradle/flutter.gradle文件,将文件内所有google()、mavenCentral()、jcenter()配置替换为你的私有Nexus仓库地址。检查app模块的build.gradle配置
确认android/app/build.gradle文件内的所有repositories块都没有配置公网仓库,如果有则替换为私有Nexus地址。(可选)配置全局Gradle初始化脚本强制走私有仓库
如果你需要所有Gradle项目都默认走私有仓库,可以在当前用户目录下的.gradle文件夹中新建init.gradle文件,添加以下配置:allprojects { buildscript { repositories { maven { credentials { username = "${NEXUS_CREDENTIALS_USR}" password = "${NEXUS_CREDENTIALS_PSW}" } url "https://somenexusrepo.com/repository/maven-group" } } } repositories { maven { credentials { username = "${NEXUS_CREDENTIALS_USR}" password = "${NEXUS_CREDENTIALS_PSW}" } url "https://somenexusrepo.com/repository/maven-group" } } // 移除所有非私有仓库 [buildscript.repositories, repositories].each { repoList -> repoList.each { repo -> if (repo instanceof MavenArtifactRepository && repo.url.toString() != "https://somenexusrepo.com/repository/maven-group") { repoList.remove(repo) } } } }
注意事项
请提前确认你的私有Nexus仓库已经同步了com.android.tools.build:gradle:4.1.0以及项目依赖的其他所有组件,否则修改仓库地址后仍然会出现依赖找不到的报错。
内容的提问来源于stack exchange,提问作者Roger Dávila

