【问题标题】:How to make Gradle repository point to local directory如何使 Gradle 存储库指向本地目录
【发布时间】:2014-11-15 22:28:23
【问题描述】:

由于某种原因,我的离岸团队无法从我的客户 Artifactory 下载工件(依赖项),这是我们的组织依赖项存储库。“刷新依赖项”不会触发任何内容并给出 TIME OUT EXCEPTION。我看到我的“Gradle 依赖项”已下载到位置“D:/C813507/Gradle/gradle-1.11/bin/caches/modules-2/files-2.1/”。我可以压缩这个文件夹并发送给他们吗?他们如何在 gradle 中实现指向他们本地目录的东西。我的构建 gradle 有以下行。如何将 URL 指向 Windows 操作系统中的本地目录

repositories {
         maven {
            url 'http://artifactory.myorg.com:8081/artifactory/plugins-release'
        }

}

【问题讨论】:

  • 为什么不让离岸团队访问您的组织工件?

标签: maven gradle build.gradle


【解决方案1】:

如果您无法授予离岸团队访问权限,您可以将所需的所有依赖项 jar 复制到单个目录,然后使用 flatDir 存储库。

repositories {
   flatDir {
       dirs 'D:/path/to/local/directory'
   }
}


dependencies {
   compile name: 'name-of-jar'
}

不使用flatDir 存储库的另一种方法是:

dependencies {
    compile files('/path/to/dir/something_local.jar')
}

【讨论】:

  • 请注意,使用 flatDir 存储库,没有传递依赖解析。最好调查并解决最初的问题。
  • 我对本地存储库的 gradle.build 中的构建依赖项有疑问(即使用本地目录)依赖项 { compile fileTree(include: ['*.jar'], dir: 'libs ') } 它是仅解决 libs 目录中的依赖关系,还是解决 lib 目录下所有子文件夹的依赖关系。如果不解析子文件夹/子目录的依赖关系,如何解决依赖关系?注意:我们的项目依赖于很多 jars 文件(而不是为每个 jars/libs 提供完整的文件名),所以想知道任何替代方式。
  • @mallikgm 我认为您应该在一个新问题中提出更清晰的上下文。我猜fileTree应该与子目录一起使用。但我没试过
【解决方案2】:

您可以声明一个本地maven 存储库,而不是配置flatDir 存储库,如下所示:

repositories {
   maven {
       url 'file://D:/path/to/local/directory'
   }
}

正如 @Peter Niederwieser 所述,flatDir 存储库不支持传递依赖解析。 maven 本地存储库。

【讨论】:

  • 这将无法在不同的环境(特别是在 CI 服务器上)运行,并且违反了“构建过程应该在任何地方都相同”的原则
  • 是的。但是,OP 明确表示他正在寻找 本地目录 解决方案,因此您的评论在这种情况下是无关紧要的。
  • 可以把gradle缓存转成本地maven仓库吗?
  • @SubraM 我相信值得单独提出一个问题,尽管此处提供的解决方法可能会满足您的需求:discuss.gradle.org/t/…
  • 你也可以通过 init.gradle 提供这个 repo,或者在你的构建中有一些条件逻辑,如果属性 'offshore' 为真,或者类似的东西,只使用本地 repo。
【解决方案3】:

像下面这样使用 flatDir 是一种选择:

repositories {
   flatDir {
       dirs 'D:/path/to/local/directory'
   }
}

这行得通。但是如果有 mavenCentral() 或其他包含相同 JAR 的 maven 存储库,则 maven 存储库将优先于 flatDir。

Gradle 文档节选:https://docs.gradle.org/current/userguide/repository_types.html

Gradle 会动态生成一个模块描述符(没有任何 依赖信息)基于工件的存在。然而, 因为 Gradle 更喜欢使用已创建描述符的模块 来自真实的元数据而不是生成的平面目录 存储库不能用于用真实元数据覆盖工件 从其他存储库。例如,如果 Gradle 只找到 jmxri-1.2.1.jar 在平面目录存储库中,但 jmxri-1.2.1.pom 在 另一个支持元数据的存储库,它将使用第二个 提供模块的存储库。

所以 flatDir 不好。我们应该使用第二个答案中提到的本地 Maven 存储库。但是第二个答案有几个问题

  1. 不便携
  2. 如果工件也存在于全局存储库中,则尚不清楚将从何处挑选它。

我们可以使用以下解决方案来解决这些问题:

  1. 在项目目录下创建一个名为 libs 的文件夹
  2. 将您的工件复制到此 libs 目录(如果您使用 git 或任何其他 scm,请确保分发此 libs 文件夹,以便其他人可以gradle build 没有任何问题)
  3. 在您的 libs 目录中声明一个 maven 存储库,并在列出任何其他存储库之前调用 mavenLocal()。这一步对于确保从本地目录而不是从其他全局存储库中选择 jar 非常重要
repositories {
   maven {
       url uri("${projectDir}/libs")
   }

   mavenLocal()
   <All your Repos here>
   mavenCentral()
}

通过这种方式,您可以确保即使 JAR 存在于其他 repo 中,它也只会从您的本地目录中选取,并且该解决方案也是可移植的。

【讨论】:

  • 我遵循了您的解决方案,这意味着我将 gradle cache [.gradle\caches\modules-2\files-2.1] 的所有文件夹复制到我的本地存储库中,然后我删除了缓存,但我得到了同步 gradle 期间出现错误 [无法解析配置 ':classpath' 的所有工件。 > 无法解析 com.android.tools.build:gradle:3.5.2.] 这是我的 gradle:repositories { maven { url uri("./repository") } mavenLocal() jcenter() google() mavenCentral() maven { url 'maven.fabric.io/public' }}
  • @Mojtaba 你还面临这个问题吗?
  • 是的,我还有这个问题
  • 我意识到这是一个老问题,但也许这无论如何都会对某人有所帮助。 gradle 缓存不直接作为存储库工作 - 路径需要首先转换为 maven 格式。例如,这个脚本就是这样做的:link
猜你喜欢
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2018-05-23
  • 2016-09-29
  • 2018-11-19
相关资源
最近更新 更多