我们的依赖项有不同的存储库,具体取决于我们正在处理的分支。我们希望能够添加每个存储库并让Gradle解析并停在它找到的第一个存储库中。我们目前使用+作为版本号。 Gradle目前所做的事情(或者看起来如此)是它找到所有存储库中的所有版本并找到最新版本(至少在我们使用+时)。
以下是Gradle脚本的示例。 policy-invoker存在于几个存储库中;但是,我们基于分支知道我们想要哪个存储库用于该依赖项。在这种情况下,即使repo2中可能有更高版本,我们也需要第一个存储库repo1。有没有办法让Gradle在动态版本(+)上首先使用该版本,还是我们必须使用自定义解决策略来实现这样的目标?
apply plugin: 'war'
configurations {
all*.exclude group: 'springframework', module: 'spring-binding'
all*.exclude group: 'springframework', module: 'spring-dao'
all*.exclude group: 'hsqldb', module: 'hsqldb'
}
dependencies {
compile "company:policy-invoker:+"
}
configurations {
compile.transitive = true
}
war {
jar.enabled = false
from 'web'
}
以下是我们的主要Gradle文件中有序repos定义的子集。
repositories {
ivy {
name "repo1"
url "//network/repo"
layout "pattern", {
ivy "[organisation]/[module]/repo1-branch/[revision]/[module]-[revision].xml"
artifact "[organisation]/[module]/repo1-branch/[revision]/[artifact]-[revision](-[classifier]).[ext]"
}
}
ivy {
name "repo2"
url "//network/repo"
layout "pattern", {
ivy "[organisation]/[module]/repo2-branch/[revision]/[module]-[revision].xml"
artifact "[organisation]/[module]/repo2-branch/[revision]/[artifact]-[revision](-[classifier]).[ext]"
}
}
}
答案 0 :(得分:0)
我们通过创建Gradle插件并将分支映射到Nexus存储库来解决这个问题。例如,可以通过插件中的代码将开发分支映射到Snapshots Nexus存储库。
aether库用于查询Nexus。此代码段找到最高版本号。
// Create the repository
RemoteRepository.Builder builder = new RemoteRepository.Builder("Snapshots", "default", "http://some.url.to.maven");
RepositoryPolicy policy = new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_FAIL );
builder.setPolicy(policy);
Repository repository = builder.build();
// artifactName can be a range, like "foo:bar[10.0.+,)"
DefaultArtifact artifact = new DefaultArtifact(artifactName);
VersionRangeRequest request = new VersionRangeRequest();
request.addRepository(repository);
request.setArtifact(artifact);
VersionRangeResult result = MavenResourceHolder.SYSTEM.resolveVersionRange(MavenResourceHolder.SESSION, request);
String versionNumber = null;
if (!result.getVersions().isEmpty()) {
versionNumber result.getHighestVersion().toString();
}
jgit库用于检索Git分支名称。
FileRepositoryBuilder builder = new FileRepositoryBuilder()
// project is Gradle's Project object
Repository repository = builder.readEnvironment().findGitDir(project.getProjectDir()).build()
String branchName = repository.branch