2

我很难弄清楚如何从 Gradle 构建中解决对 Artifactory 中远程工件的依赖关系。

该工件可在以下位置获得:

http://192.168.2.130:8081/artifactory/simple/libs-snapshot-local/com/company/test/1.0-SNAPSHOT/TestArtifact-1.0-20130607.104006-2.apklib

我的 build.gradle 是:

buildscript {
    repositories {
        maven {
            url "http://192.168.2.130:8081/artifactory/gradle"

            credentials {
                username = "$artifactory_user"
                password = "$artifactory_password"
            }
        }

        dependencies {
            classpath 'com.android.tools.build:gradle:0.4.2'
            classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.12', changing: true)
        }
    }
}

allprojects {
    apply plugin: 'idea'
    apply plugin: 'android'
    apply plugin: 'artifactory'
}

repositories {
    maven {

        url "http://192.168.2.130:8081/artifactory"

        credentials {
            username = "$artifactory_user"
            password = "$artifactory_password"
        }
    }
}

artifactory {
    contextUrl = 'http://192.168.2.130:8081/artifactory/simple'

    resolve {
        repository {
            repoKey = 'libs-snapshot'
            maven = true
        }
    }
}

在 Artifactory 上,存储库libs-snapshot使用 maven 独特的快照行为并绑定到maven-2-default具有以下配置的布局:

工件路径模式:[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]

文件夹集成修订正则表达式:SNAPSHOT

文件集成修订正则表达式:SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))

因此,根据我的理解,Gradle 应该通过查看以下内容来解决依赖关系:

http://192.168.2.130:8081/artifactory/simple/libs-snapshot/com/company/test/TestArtifact/1.0-SNAPSHOT/TestArtifact-1.0-xxxxxxxx.xxxxxx-x.apklib

但它实际上是在看:

http://192.168.2.130:8081/artifactory/com/company/test/TestArtifact/1.0/TestArtifact-1.0.apklib

所以显然它不能解决依赖关系。我还尝试使用 Artifactory 生成的 gradle 编译行,但它也没有成功:

compile(group: 'com.company.test', name: 'TestArtifact', version: '1.0-20130607.104006-2', ext: 'apklib')

虽然我花了一些时间阅读帖子和 Gradle/Artifactory 文档,但我现在更加困惑,因为我刚开始......所以,我有几个问题:

1) Gradle 似乎没有使用工件 {} 部分。事实上,它只是使用我在 repositories {} 部分中声明的 url。但是当我删除 repositories {} 部分时,它只会在本地查找依赖项。这是为什么?声明 Artifactory 存储库的正确方法是什么?

2)Gradle 会知道底层libs-snapshot布局吗?如果没有,Artifactory 插件是否提供了一种自定义工件搜索模式的方法(在直接 Maven 中,而不是在 Ivy 中)?因为我只使用免费版本的 Artifactory,所以我无法编辑存储库布局。

3) 为什么 Artifactory 生成的 gradle 编译行似乎与工件容器存储库使用的布局不匹配?

提前致谢!

4

2 回答 2

3

我意识到这是一个温和的答案,但我们使用 gradle 解决 Artifactory 中的工件,我们指定的内容如下:

repositories {
    mavenLocal()
    maven {
        url "http://repo1:8081/artifactory/repo"
    }
}

考虑到它具有基本相同的细节,这是一个完全不同的配置结构。可能值得一试。

于 2013-06-18T14:44:45.900 回答
2

您对 Artifactory URL 声明有些混乱 :)

首先,当您使用 Artifactory 插件时,您可以跳过repositories{}声明(您已经在块中声明了它artifactory{})在该块中,contextUrl 应该指向 Artifactory 根,在您的情况下http://192.168.2.130:8081/artifactory(没有simple)。这在Artifactory 文档中有详细记录。

如果您更喜欢使用repositories{}声明,则必须在此处声明一个真实的存储库,而不是根,在您的情况下,http://192.168.2.130:8081/artifactory/libs-snapshot 这在Gralde 文档中有很好的记录。

我强烈推荐你使用 Artifactory 插件方法。使用 DSL 可以让您更轻松地配置和更强大的集成。

于 2013-06-20T03:44:19.327 回答