以编程方式使用sbt解析工件

时间:2013-12-16 08:11:59

标签: sbt

以下博客提出了如何使用常春藤(http://developers-blog.org/blog/default/2010/11/08/Embed-Ivy-How-to-use-Ivy-with-Java)直接从java获取工件。

public class IvyArtifactResolver {
    public File resolveArtifact(String groupId, String artifactId, String version) throws Exception {
        //creates clear ivy settings
        IvySettings ivySettings = new IvySettings();
        //url resolver for configuration of maven repo
        URLResolver resolver = new URLResolver();
        resolver.setM2compatible(true);
        resolver.setName("central");
        //you can specify the url resolution pattern strategy
        resolver.addArtifactPattern(
                "http://repo1.maven.org/maven2/"
                + "[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]");
        //adding maven repo resolver
        ivySettings.addResolver(resolver);
        //set to the default resolver
        ivySettings.setDefaultResolver(resolver.getName());
        //creates an Ivy instance with settings
        Ivy ivy = Ivy.newInstance(ivySettings);

        File ivyfile = File.createTempFile("ivy", ".xml");
        ivyfile.deleteOnExit();

        String[] dep = null;
        dep = new String[]{groupId, artifactId, version};

        DefaultModuleDescriptor md =
                DefaultModuleDescriptor.newDefaultInstance(ModuleRevisionId.newInstance(dep[0],
                dep[1] + "-caller", "working"));

        DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(md,
                ModuleRevisionId.newInstance(dep[0], dep[1], dep[2]), false, false, true);
        md.addDependency(dd);

        //creates an ivy configuration file
        XmlModuleDescriptorWriter.write(md, ivyfile);

        String[] confs = new String[]{"default"};
        ResolveOptions resolveOptions = new ResolveOptions().setConfs(confs);

        //init resolve report
        ResolveReport report = ivy.resolve(ivyfile.toURL(), resolveOptions);

        //so you can get the jar library
        File jarArtifactFile = report.getAllArtifactsReports()[0].getLocalFile();

        return jarArtifactFile;
    }
}

我想知道sbt是否暴露了这种界面,因为它使用了常春藤。

resolve :: ModuleId - >文件

1 个答案:

答案 0 :(得分:3)

脚本,REPL和依赖项

有一个名为Scripts, REPL, and Dependencies的文档,您可能会对此感兴趣。例如,Script runner可以让您编写如下内容:

#!/usr/bin/env scalas
!#

/***
scalaVersion := "2.9.0-1"

libraryDependencies ++= Seq(
  "net.databinder" %% "dispatch-twitter" % "0.8.3",
  "net.databinder" %% "dispatch-http" % "0.8.3"
)
*/

import dispatch.{ json, Http, Request }
import dispatch.twitter.Search

以编程方式驾驶sbt

你也可以使用sbt的任何子部分作为库并自己驱动它。由于插件生态系统,在点版本之间保持二进制兼容性非常好。抓取罐子的关键任务是update,因此def updateTaskDefaults.scala#L1113)可能是一个很好的起点。但是,如果您正在从客户端代码驱动sbt,那么最终是否会重新实现sbt shell或包含所有sbt的依赖项?您可能还有一个单独的sbt shell窗口或sbt脚本部分。

自定义解析器

sbt附带了各种可自定义的解析器,因此首先要检查的是:Resolvers

  

sbt提供了Ivy中可用的存储库类型的接口:文件,URL,SSH和SFTP。 Ivy中存储库的一个关键特性是使用模式来配置存储库。

     

使用sbt.Resolver中的工厂为所需类型构建存储库定义。此工厂创建可以进一步配置的Repository对象。下表包含指向存储库类型的Ivy文档的链接以及工厂和存储库类的API文档。除工厂名称外,SSH和SFTP存储库的配置相同。使用Resolver.ssh用于SSH,Resolver.sftp用于SFTP。

例如,你可以这样做:

resolvers += Resolver.file("my-test-repo", file("test")) transactional()

RawRepository

但如果你真的想要一个可编程的解析器,那就有RawRepository

final class RawRepository(val resolver: DependencyResolver) extends Resolver
{
    def name = resolver.getName
    override def toString = "Raw(" + resolver.toString + ")"
}

这是org.apache.ivy.plugins.resolver.DependencyResolver周围的一个薄包装,您可以通过扩展其中一个解析器来编写它。 (我自己没试过。)