有一天,我想学习Scala。我从喜欢它的人那里看到的语言非常令人鼓舞。
但是,今天不是那一天。今天,我只想对我的团队的构建文件进行一些更改。不幸的是,这个构建文件与SBT放在一起,几乎是不可理解的。
我的主要问题是,在我看来,SBT引入了一些庞大的新运算符集合,这些运算符使用字符串和列表来创建某种sbt对象。例如,在sbt:
中"args4j" % "args4j" % "2.0.12"
显然是实际定义的;但是,我甚至不知道它在scala
repl的类型是什么,因为在repl我得到了明智的错误:
scala> val tstcrap = "args4j" % "args4j" % "2.0.12"
<console>:6: error: value % is not a member of java.lang.String
val tstcrap = "args4j" % "args4j" % "2.0.12"
即使设置了类路径以包含sbt-launch.jar
文件并执行import sbt._
,我也会收到此错误。
同样,我正在处理这样的事情:
val jarSources = (descendents(classesOutput ##, "*") ---
assemblyExclude(classesOutput ##))
##
运算符是什么,---
执行什么,更重要的是这个表达式的类型是什么?所有这些新操作符都记录在某处,是否有某种方法可以使用与sbt构建文件中使用的语言相同的scala repl?
查看此sbt
文件会让我想起在没有阅读任何相关手册页的情况下尝试解密perl
。 (不是推荐的活动)
更新:在查看下面答案中的链接,并查看标记为sbt
的其他问题和答案后,我发现了我的主要scala知识缺失:scala允许定义在解析方法之前调用的隐式转换。在这种情况下,sbt
在ManagedProject
特征内定义了从String
到私有类sbt.GroupID
的隐式转换,因此
"a" % "b"
真的像是
(new GroupID("a")) % "b"
我认为隐式转换的解决顺序和其他规则必须变得非常复杂;它几乎让我想起你可以通过非成员函数在C ++中引入操作符重载的噩梦。
答案 0 :(得分:5)
由于SBT构建文件是一个成熟的Scala源文件并且依赖于SBT本身提供的一些库,因此很难在不依赖于对Scala的熟悉的情况下很好地覆盖SBT。我不知道这样的指南。
对于您提出的具体问题,我认为这些维基页面会有所帮助:
%
运算符表示字符串:http://code.google.com/p/simple-build-tool/wiki/LibraryManagement ##
和---
运营商:http://code.google.com/p/simple-build-tool/wiki/Paths 如果您希望使用SBT库运行Scala REPL,请尝试以下操作:
$ sbt console-project
http://code.google.com/p/simple-build-tool/wiki/RunningSbt列出了一些其他有用的命令。
答案 1 :(得分:1)
2016年更新(5年后)
这不是完整的指南,但Sbt heiroglyphs and multi-projects explained中的文章“Divan Visagie”有助于开始使用sbt
。
另外,the sbt
documentation现在非常完整,涵盖multiple projects in a single build
'---' operator is described in the PathFinder(自the 0.2 version起)。