小编Mys*_*Dan的帖子

使用sbt 0.13中的.sbt文件编写多项目构建的惯用方法

我听说.sbt文件在0.13中已经以各种方式得到了改进,现在我可以在其中指定多项目构建.

http://www.scala-sbt.org/0.13.0/docs/Community/ChangeSummary_0.13.0.html#sbt-format-enhancements提到我们现在可以在.sbt文件中定义子项目.我也知道根目录中的多个.sbt文件将聚合到一个概念文件中.

但是,我真正喜欢的是不要用十几个子项目.sbt文件污染我的根.有没有办法可以将子项目build.sbt文件放到各自的子目录中,在它们共享的地方保留一些公共代码,然后为整个项目聚合子项目的根build.sbt?我现在在.scala文件中有类似的设置,但如果可能的话,我更愿意使用.sbt文件.

如果这不可能,使用.sbt文件构建大型多项目构建的"正确"方法是什么?

scala sbt

35
推荐指数
1
解决办法
6608
查看次数

试图将F-bounded多态性建模为Scala中的类型成员

我想尝试编写一个类型,其方法可以是同类的,并返回相同类型的值:

object SimpleTest {
  trait Foo extends Product with Serializable {
    type Self <: Foo
    def bar: Self
  }

  case class X() extends Foo {
    type Self = X
    def bar = this
  }

  case class Y() extends Foo {
    type Self = Y
    def bar = this
  }


  trait TC[A]

  implicit val tc: TC[Foo] = new TC[Foo] { }

  def tester[A: TC](x: Seq[A]) = "foo"

  // tester(Seq(X(), Y()))
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,注释掉的行调用tester失败并出现以下错误(Scala 2.10):

Error: could not find implicit value …
Run Code Online (Sandbox Code Playgroud)

polymorphism scala f-bounded-polymorphism

13
推荐指数
1
解决办法
683
查看次数

分析sbt构建

我有一个需要很长时间的sbt构建.它既大又复杂,很难知道从哪里开始清理它.似乎sbt保留了很多关于构建结构的元数据,具有相互依赖性,命名任务,范围等等.通过所有这些元数据,似乎很容易跳入并测量每个不同任务(带有范围)所花费的时间.在代码中这样做,而不是基于日志消息不仅感觉更干净,但并发处理很好的优势,建立和其他复杂的东西,可能导致日志时间是误导性的.

目前有没有设施可以做到这一点?它不像我们在"用户"构建中可以做的事情,但也许SBT插件可以挂钩任务启动器并在最后维护/生成一个大的时间报告.这将有助于集中精力改善缓慢的事情,而不会在即时发生的事情上浪费时间.

scala sbt

11
推荐指数
1
解决办法
1402
查看次数

使用Scala反射和Java反射

作为DSL的一部分,我有很多代码使用Java反射来调用Java对象上的任意用户指定方法.

但是,实际上很多Java对象都是Scala对象,并且它们上的一些方法都标有Scala @deprecated注释.不幸的是,Java的注释机制无法看到Scala注释,直到Scala 2.10没有方便的方式(我知道?)才能访问这些注释.

我最终升级到2.10,并希望能够从我的DSL发出弃用警告.但是,我不想重写整个评估器(至少现在)使用Scala反射,所以有一种方便的方法从一个java.lang.reflect.Method我可以使用Scala反射的东西来弄清楚Scala方法是否在问题已被弃用?或者,在获取该信息之前,我是否必须使用Scala反射复制许多现有的方法解析逻辑?

它看起来像一个JavaToScala曾经存在于Scala反射中的类,它有一个methodToScala方法可以实现我想要的.在谷歌代码项目中,我能找到的唯一痕迹就在这里.为什么功能移出核心反射?或者它仍然以不同的名称存在?

编辑:看起来有问题的代码存在scala.reflect.runtime.JavaMirrors,但不幸的是它是私有的(有另一个JavaMirrors是公共API的一部分,但不提供我需要的任何东西.)我无法弄清楚它的生命如果有一个通过公共API进行调用的"路径",那么我就会把我一直带到私有的methodAsScala深处JavaMirrors.令人沮丧的是,至少可以说:(

reflection scala scala-java-interop

8
推荐指数
1
解决办法
1196
查看次数

如何失败,如何只显示最新测试的stdout

使用junit-interface runner,有一个方便的选项:

-q抑制stdout成功测试.Stderr通常会打印到控制台.Stdout被写入缓冲区并在测试成功时被丢弃.如果失败,则将缓冲区转储到控制台.由于Java中的stdio重定向是一个糟糕的问题(System.setOut()通过本机代码更改静态最终字段System.out),这可能不适用于所有方案.Scala拥有自己的控制台,具有理智的重定向功能.如果在类路径上检测到Scala,则junit-interface也会尝试重新路由scala.Console的stdout.

我想知道是否有一种简单的方法让scalatest做同样的事情.我可以尝试自己重定向输出,但如果可能的话,我更愿意使用标准的东西.

scala scalatest

7
推荐指数
1
解决办法
1491
查看次数

sbt 0.13任务宏等效于flatMap

我正在升级我的构建以尽可能多地使用新的宏语法,我遇到了一个flatMap我不知道如何处理的问题.

假设我曾经有过以下形式的任务

myTask <<= (foo, bar) flatMap { (x, y) => someFunctionProducingATask(x, y, 5) }
Run Code Online (Sandbox Code Playgroud)

现在,Def.taskDyn看起来模糊不清,但不太合适.将它翻译成天真的东西是行不通的:

myTask <<= Def.taskDyn {
  val x = foo.value
  val y = bar.value
  someFunctionProducingATask(x, y, 5) // ERROR: we need an Initialize[Task[...]], but have a Task[...]
}
Run Code Online (Sandbox Code Playgroud)

Initialize感觉monadic但我找不到pure它,所以我不知道如何把我的任务放入其中,或者如果这甚至是可取的.除了暗示我使用之外,文档似乎没有说什么taskDyn.有人有任何想法吗?

scala sbt

6
推荐指数
1
解决办法
416
查看次数

sbt/ivy无法解析文件系统解析器上的通配符常春藤依赖项

我正在使用该~/.sbt/repositories文件告诉sbt 0.13.5从哪个存储库中检索.该文件仅包含具有自定义布局localfile://存储库,该布局与标准sbt非常相似,sbtVersion并且scalaVersion表示了可选字段.

在解决我的项目的依赖关系时,我注意到了奇怪的行为:

  • 解决确切的依赖项工作正常
  • latest.integration 也行得很好
  • 表单的通配符解析x.y.+ 没有找到任何内容,而是似乎在搜索文字模式.我收到表格的错误:
    [warn] ==== myrepo: tried
    [warn]   file://path/to/my/repo/myorg/mypackage_2.10/[revision]/ivy-[revision].xml
    [info] Resolving myorg#mypackage_2.10;2.7.1.+ ...
    [warn]  module not found: myorg#mypackage_2.10;2.7.1.+

如您所见,明确提及repo布局模式.

我大部分时间都很困惑,因为除了+通配符依赖项外,解析器的工作正常.我试着戳常春藤文档周围找出是否某些解析器(如file://解析器我使用),不实施某些类型的依赖解析,但似乎并没有成为一个事情,所以我大多难住了.知道我可以做些什么来使它工作,或者可能导致它的原因?

scala ivy sbt

6
推荐指数
1
解决办法
453
查看次数

Scala 2.10,Double.isNaN和拳击

在Scala 2.10中,someDouble.isNaN预计是盒子吗?.isNaN通过反编译器运行我的代码调用,我仍然double2Double在我的代码中看到了调用.鉴于AnyVal2.10中的新工作,我预计它不会比java.lang.Double.isNaN(someDouble)运行时更糟,没有虚假分配.我错过了什么吗?

boxing scala scala-2.10

5
推荐指数
1
解决办法
2529
查看次数

Boilerplate-free Scala ArrayBuilder专业化

我正在寻找良好的做法,以避免一遍又一遍地重写相同的代码,以实现unboxedness.说我有这样的事情:

def speedyArrayMaker[@specialized(Long) A: ClassTag](...): Array[A] = {
  val builder = Array.newBuilder[A]
  // do stuff with builder
  builder.result
}
Run Code Online (Sandbox Code Playgroud)

这将导致在我builder可能的情况下存在未装箱的存储,但据我所知,没有任何未装箱的方法调用它,因为我正在经历非特殊化的ArrayBuilder特征.

在一个专门的单形世界中Long,我会写val builder = new ArrayBuilder.ofLong()和避免拳击,但缺乏说明ArrayBuilder/ Builder专注于所有原始类型,我想不出一个避免重复努力的好方法.我想到的一种方法可能是speedyArrayMaker:

val (add, builder): (A => Unit, ArrayBuilder[A]) = implicitly[ClassTag[A]].runtimeClass match {
  case java.lang.Long.TYPE =>
    val builder = new ArrayBuilder.ofLong()
    ((x: Long) => builder += x, builder).asInstanceOf
  case _ =>
    val builder = Array.newBuilder[A]
    ((x: A) => builder += x, builder)
} …
Run Code Online (Sandbox Code Playgroud)

boxing jvm scala specialization

5
推荐指数
1
解决办法
390
查看次数

绘制sbt的增量编译逻辑

sbt 维护任务之间的依赖关系,并且可以相当容易地推理结果图。另一方面,浏览源代码,增量编译逻辑似乎更加不透明。我希望能够做以下事情:

  • 相当于“如果我[以这种方式]修改了这个接口,什么会变得无效?”
  • 构建一个图表,说明修改不同的类接口如何影响构建的其余部分。考虑到 Scala 中隐式依赖关系的复杂程度,绘制 scala 导入依赖关系图并不是一个特别好的近似方法。似乎 sbt 必须以某种形式维护这些信息才能进行增量编译,所以我“只是”需要弄清楚如何访问它,并希望它的形式适合我的用例。

其中任何一个可行吗?我并不反对编写 sbt 插件,但希望得到有关如何继续的提示。

编辑:看起来Relation很有usesInternalSrc(dep: File): Set[File]希望。这是否捕获了 sbt 的所有依赖知识?

编辑2:更有希望的是,DotGraphsbt 源代码树中有一个对象。它没有文档,谷歌也没有任何关于它的人类可读的文本。如果我能弄清楚如何使用它,我会发布答案。

scala sbt

5
推荐指数
1
解决办法
233
查看次数