我听说.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文件构建大型多项目构建的"正确"方法是什么?
我想尝试编写一个类型,其方法可以是同类的,并返回相同类型的值:
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) 我有一个需要很长时间的sbt构建.它既大又复杂,很难知道从哪里开始清理它.似乎sbt保留了很多关于构建结构的元数据,具有相互依赖性,命名任务,范围等等.通过所有这些元数据,似乎很容易跳入并测量每个不同任务(带有范围)所花费的时间.在代码中这样做,而不是基于日志消息不仅感觉更干净,但并发处理很好的优势,建立和其他复杂的东西,可能导致日志时间是误导性的.
目前有没有设施可以做到这一点?它不像我们在"用户"构建中可以做的事情,但也许SBT插件可以挂钩任务启动器并在最后维护/生成一个大的时间报告.这将有助于集中精力改善缓慢的事情,而不会在即时发生的事情上浪费时间.
作为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.令人沮丧的是,至少可以说:(
使用junit-interface runner,有一个方便的选项:
-q抑制stdout成功测试.Stderr通常会打印到控制台.Stdout被写入缓冲区并在测试成功时被丢弃.如果失败,则将缓冲区转储到控制台.由于Java中的stdio重定向是一个糟糕的问题(System.setOut()通过本机代码更改静态最终字段System.out),这可能不适用于所有方案.Scala拥有自己的控制台,具有理智的重定向功能.如果在类路径上检测到Scala,则junit-interface也会尝试重新路由scala.Console的stdout.
我想知道是否有一种简单的方法让scalatest做同样的事情.我可以尝试自己重定向输出,但如果可能的话,我更愿意使用标准的东西.
我正在升级我的构建以尽可能多地使用新的宏语法,我遇到了一个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.有人有任何想法吗?
我正在使用该~/.sbt/repositories文件告诉sbt 0.13.5从哪个存储库中检索.该文件仅包含具有自定义布局local的file://存储库,该布局与标准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 2.10中,someDouble.isNaN预计是盒子吗?.isNaN通过反编译器运行我的代码调用,我仍然double2Double在我的代码中看到了调用.鉴于AnyVal2.10中的新工作,我预计它不会比java.lang.Double.isNaN(someDouble)运行时更糟,没有虚假分配.我错过了什么吗?
我正在寻找良好的做法,以避免一遍又一遍地重写相同的代码,以实现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) sbt 维护任务之间的依赖关系,并且可以相当容易地推理结果图。另一方面,浏览源代码,增量编译逻辑似乎更加不透明。我希望能够做以下事情:
其中任何一个可行吗?我并不反对编写 sbt 插件,但希望得到有关如何继续的提示。
编辑:看起来Relation很有usesInternalSrc(dep: File): Set[File]希望。这是否捕获了 sbt 的所有依赖知识?
编辑2:更有希望的是,DotGraphsbt 源代码树中有一个对象。它没有文档,谷歌也没有任何关于它的人类可读的文本。如果我能弄清楚如何使用它,我会发布答案。
scala ×10
sbt ×5
boxing ×2
ivy ×1
jvm ×1
polymorphism ×1
reflection ×1
scala-2.10 ×1
scalatest ×1