我有一个标准结构的sbt项目.我想要有文件,我可以将其与我的构建分开并指定在Build.scala或build.sbt中使用的值(以省略使用本地配置的破坏存储库).
它可能是普通的.properties格式或scala文件,或类型安全配置,或任何其他(当然最常见的.sbt实践):
prop1=value1
prop2=42
.......
Run Code Online (Sandbox Code Playgroud)
是否有通用的做法,因此可以在sbt构建文件中访问这些值?我想将它们作为测试参数传递,以避免构建文件本身.
我想知道有多少种方法可以在正常的"在命令行上调用它来编译我的源代码"之外与Scala编译器进行交互.
是否有一些方法可以解析代码,构建抽象语法树或使用库在运行时编译代码?
compiler-construction programming-languages scala compilation abstract-syntax-tree
在旧生锈的Pascal中,有一个方便的构造来对对象或记录执行一系列操作:
with obj do
begin
methodCall
otherMethodCall
...
end
Run Code Online (Sandbox Code Playgroud)
我试图在scala中触摸类似的东西,但在我脑海中缺少的东西:)
是否有可能以某种方式实现这样的效果,就好像obj在传递闭包的当前范围内并且表现如下:
{
import obj._
callObjMethod(x, y)
objVal.doSomething()
...
}
Run Code Online (Sandbox Code Playgroud)
但在自定义语法中:
doWith (obj) {
callObjMethod(x, y)
objVal.doSomething()
}
Run Code Online (Sandbox Code Playgroud)
直觉上我觉得这no不仅仅是yes好奇心想知道的.
尝试使用 ScalikeJDBC 和 SQLite。根据提供的示例编写一个简单的代码:
import scalikejdbc._, SQLInterpolation._
object Test extends App {
Class.forName("org.sqlite.JDBC")
ConnectionPool.singleton("jdbc:sqlite:test.db", null, null)
implicit val session = AutoSession
println(sql"""SELECT * FROM kv WHERE key == 'seq' LIMIT 1""".map(identity).single().apply()))
}
Run Code Online (Sandbox Code Playgroud)
它失败但有异常:
Exception in thread "main" java.sql.SQLException: Cannot change read-only flag after establishing a connection. Use SQLiteConfig#setReadOnly and QLiteConfig.createConnection().
at org.sqlite.SQLiteConnection.setReadOnly(SQLiteConnection.java:447)
at org.apache.commons.dbcp.DelegatingConnection.setReadOnly(DelegatingConnection.java:377)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setReadOnly(PoolingDataSource.java:338)
at scalikejdbc.DBConnection$class.readOnlySession(DB.scala:138)
at scalikejdbc.DB.readOnlySession(DB.scala:498)
...
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 scalikejdbc 1.7 和 2.0,错误仍然存在。作为 sqlite 驱动程序,我使用"org.xerial" % "sqlite-jdbc" % "3.7.+".
我可以做什么来修复该错误?
我正在学习scala,这个问题可能很愚蠢,但是......为什么?
例如,这没关系:
def matchList(ls: List[Int]): List[Int] = ls match {
case 1 :: rest => rest
case a :: b :: rest => (a + b) :: rest
case _ => ls
}
matchList: (ls: List[Int])List[Int]
Run Code Online (Sandbox Code Playgroud)
但是带有类型参数的函数无法编译:
def matchList[T](ls: List[T]): List[T] = ls match {
case 1 :: rest => rest
case a :: b :: rest => (a + b) :: rest
case _ => ls
}
<console>:10: error: type mismatch;
found : T
required: String
case a :: …Run Code Online (Sandbox Code Playgroud) 我有点困难.(我是regexp的专家,但在scala/java中没有太多使用它们).我有11个字符长度的数字字符串,只需要最后10个,所以:
val Pattern = """(\d{10})$""".r
"79283767219" match {
case Pattern(m) => m
}
Run Code Online (Sandbox Code Playgroud)
它给了MatchError,但为什么?!我误解了什么?
我有一个SBT(0.13.2)多项目,并在一个单独的构建文件中声明了一组子项目,如下所示:
object SubBuilds extends Build {
lazy val sub_project1 = Project("sub_project1", file("sub/Project1")).dependsOn(Build.core)
lazy val sub_project2 = Project("sub_project2", file("sub/Project2")).dependsOn(Build.core)
...
}
Run Code Online (Sandbox Code Playgroud)
每个子项目都有自己的build.sbt文件,name := "..."可以在其中指定.
我可以root简单地访问构建中的项目列表SubBuilds.projects并获取Seq[Project].它本来settings: Seq[Def.Setting[_]]就是我希望使用的属性,但我完全不知道如何从这些属性中获取价值.我可以找到一个带键的设置,name但它没有任何相似之处value.
我怎样才能实现这一点:name在scala构建中使用Project实例获取属性?
更新:我应该注意到我打算在其他任务中使用它,我尝试了@ eugene-yokota的答案,但它在构建编译期间产生"非法动态引用".
object CustomTasks {
/** Task to display Subprojects */
val subList = taskKey[Unit]("Display subprojects")
val subListTask = subList := {
SubBuilds.projects foreach { a =>
val v = (name in a).value
println(s"Subproject ${a.id}, …Run Code Online (Sandbox Code Playgroud) 我有基于spray.io的webservice,它作为独立jar运行(我使用sbt assembly然后只是java -jar myws.jar).它与喷涂示例中的靴带非常相似,如下所示:
/** Bootstrap */
object Boot extends App {
// we need an ActorSystem to host our application in
implicit val system = ActorSystem("my-system")
// create and start our service actor
val service = system.actorOf(Props[MyServiceActor], "my-ws-service")
implicit val timeout = Timeout(10.seconds)
CLIOptionsParser.parse(args, CLIOptionsConfig()) map { config =>
// start a new HTTP server
IO(Http) ? Http.Bind(service, interface = config.interface, port = config.port)
}
}
Run Code Online (Sandbox Code Playgroud)
现在我只是在背景中运行该过程java -jar my-service "$@" &并停止 …
我有(以前)REST spray.io webservice.现在,我需要在我的一个方法中生成SESSIONID以与其他一些方法一起使用.我希望它在响应标题中.
基本上,我想象逻辑如下:
path("/...") {
get {
complete {
// some logic here
// .....
someResult match {
case Some(something) =>
val sessionID = generateSessionID
session(sessionID) = attachSomeData(something)
// here I need help how to do my imaginary respond with header
[ respond-with-header ? ]("X-My-SessionId", sessionID) {
someDataMarshalledToJSON(something)
}
case None => throw .... // wrapped using error handler
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它并不完整,我指的是respondWithHeader指令.我需要一个建议.
我有一个spark应用程序,它从文件中读取行并尝试使用jackson对它们进行反序列化.为了使这段代码能够工作,我需要在Map操作中定义ObjectMapper(否则我得到一个NullPointerException).
我有以下代码正在工作:
val alertsData = sc.textFile(rawlines).map(alertStr => {
val mapper = new ObjectMapper()
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.registerModule(DefaultScalaModule)
broadcastVar.value.readValue(alertStr, classOf[Alert])
})
Run Code Online (Sandbox Code Playgroud)
但是,如果我在地图外部定义映射器并对其进行广播,则会因NullPointerException而失败.
此代码失败:
val mapper = new ObjectMapper()
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.registerModule(DefaultScalaModule)
val broadcastVar = sc.broadcast(mapper)
val alertsData = sc.textFile(rawlines).map(alertStr => {
broadcastVar.value.readValue(alertStr, classOf[Alert])
})
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
谢谢,Aliza
出于我的具体原因,我想覆盖test任务以运行并非所有测试,而是像test-only TopTestSuiteName param1 param2. 是否可以?
我试图阅读有关任务和示例的文档,但仍远未了解什么是可能的,什么是不可能的。
或者我可以创建自定义任务并以某种方式使用现有test-only功能?我觉得这是合理的,但完全无法理解 - 我从哪里开始。
对不起,我确信它被问了十亿次,但我还没有找到确切的答案:
var = value if condition else other_value
Run Code Online (Sandbox Code Playgroud)
if .. else相对于作业的优先顺序是什么?就像在C/Java三元组中一样?
scala ×11
sbt ×3
spray ×2
akka ×1
apache-spark ×1
compilation ×1
jackson ×1
python ×1
regex ×1
scalikejdbc ×1
spray-dsl ×1
sqlite ×1
types ×1
web-services ×1