我很难从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]
文件夹集成修订版RegExp:SNAPSHOT
文件集成修订版RegExp: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似乎没有使用artifactory {}部分。实际上,它只使用我在存储库{}部分声明的url。但是当我删除存储库{}部分时,它只在本地查找依赖项。这是为什么?声明Artifactory存储库的正确方法是什么?
2)Gradle会意识到基础libs-snapshot
布局吗?如果没有,Artifactory插件是否提供了一种自定义工件搜索模式的方法(直接Maven,而不是Ivy)?因为我只使用Artifactory的免费版本,所以我将无法编辑存储库布局。
3)为什么Artifactory生成的gradle编译行似乎与工件容器存储库使用的布局不匹配?
提前致谢!
答案 0 :(得分:3)
这是我认识到的一个软答案,但我们使用gradle解决了Artifactory中的工件,我们指定的内容如下:
repositories {
mavenLocal()
maven {
url "http://repo1:8081/artifactory/repo"
}
}
这是一个完全不同的配置结构,考虑到它具有基本相同的细节。可能值得一试。
答案 1 :(得分:2)
您对Artifactory URL声明有些不满:)
首先,当您使用Artifactory插件时,可以跳过repositories{}
声明(您已在artifactory{}
块中声明它)
在该块中,contextUrl应指向Artifactory root,在您的情况下为http://192.168.2.130:8081/artifactory
(不包含simple
)。
这在Artifactory documentation中有详细记载。
如果您更喜欢使用repositories{}
声明,则必须在您的案例http://192.168.2.130:8081/artifactory/libs-snapshot
中声明真实存储库,而不是根目录
这在Gralde documentation中有详细记载。
我强烈推荐您使用Artifactory插件方法。使用DSL可以让您更轻松地进行配置和更强大的集成。