如何让Gradle在动态版本上使用特定的存储库?

时间:2014-08-12 17:22:38

标签: gradle

我们的依赖项有不同的存储库,具体取决于我们正在处理的分支。我们希望能够添加每个存储库并让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]"
            }
        }   
}

1 个答案:

答案 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