【问题标题】:How to use third party libraries with Scala REPL?如何在 Scala REPL 中使用第三方库?
【发布时间】:2013-09-19 16:20:43
【问题描述】:

我已经下载了 Algebird,我想使用这个库在 Scala 解释器 中尝试一些东西。我如何实现这一目标?

【问题讨论】:

  • 通常情况下,REPL 提示符下还有一个:cp 命令,但已被破坏;它可能会在 2.11 中回归。

标签: scala interpreter read-eval-print-loop


【解决方案1】:

这是一个使用 Ammonite(与 Scala REPL 相对)的答案——但它是一个非常棒的工具,值得一提。

  1. 您可以使用一个衬垫安装它,例如:
sudo sh -c '(echo "#!/usr/bin/env sh" && curl -L https://github.com/lihaoyi/Ammonite/releases/download/2.1.2/2.13-2.1.2) > /usr/local/bin/amm && chmod +x /usr/local/bin/amm' && amm

或在 macOS 上使用 brew:

brew install ammonite-repl  

对于 scala 2.10,您需要使用 oder 版本 1.0.3:

sudo sh -c '(echo "#!/usr/bin/env sh" && curl -L https://github.com/lihaoyi/Ammonite/releases/download/1.0.3/2.10-1.0.3) > /usr/local/bin/amm && chmod +x /usr/local/bin/amm' && amm
  1. 在终端中运行 Ammonite:
amm
// Displays
Loading...
Welcome to the Ammonite Repl 2.1.0 (Scala 2.12.11 Java 1.8.0_242)
  1. 在 ivy import 中使用以导入您的第 3 部分库:
import $ivy.`com.twitter::algebird-core:0.2.0`

然后您可以在 Ammonite-REPL 中使用您的库:

import com.twitter.algebird._
import com.twitter.algebird.Operators._
Map(1 -> Max(2)) + Map(1 -> Max(3)) + Map(2 -> Max(4))
...

【讨论】:

    【解决方案2】:

    运行sbt console 不会导入使用测试范围声明的库。要在 REPL 中使用这些库,请使用

    启动控制台
    sbt test:consoleQuick
    

    但是,您应该知道,以这种方式启动控制台会跳过编译您的测试源代码。

    来源:http://www.scala-sbt.org/0.13/docs/Howto-Scala.html

    【讨论】:

    • @Zoltan : sbt 如何知道什么在测试范围内,什么不在?我的 sbt 只包含 libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "3.0.5" % "test", "org.scalacheck" %% "scalacheck" % "1.14.0" % "test")。而且这里没有“测试范围”。
    • @Ashwin 该行末尾的% "test" 正是告诉 SBT 这种依赖关系仅用于测试。如果你忽略它,它将成为一个编译依赖。
    【解决方案3】:

    当然,你可以使用 scala -cp 来手动管理你的依赖。但这会变得相当乏味,尤其是当您有多个依赖项时。

    更灵活的方法是使用sbt 来管理您的依赖项。在search.maven.org 上搜索您要使用的库。例如,Algebird 只需 searching for algebird 即可获得。然后创建一个引用该库的 build.sbt,进入目录并输入 sbt console。它将下载所有依赖项并在类路径上自动启动包含所有依赖项的 scala 控制台会话。

    更改诸如 scala 版本或库版本之类的内容只是 build.sbt 中的简单更改。在你的目录中不需要任何 scala 代码。一个只有 build.sbt 的空目录就可以了。

    这是一个 build.sbt 用于使用 algebird:

    name := "Scala Playground"
    
    version := "1.0"
    
    scalaVersion := "2.10.2"
    
    libraryDependencies += "com.twitter" % "algebird-core" % "0.2.0"
    

    编辑:通常当您想使用库时,您要做的第一件事就是导入库的命名空间。这也可以通过添加以下行在 build.sbt 中自动化:

    initialCommands in console += "import com.twitter.algebird._"
    

    【讨论】:

    • 谢谢,这真的很有帮助。
    • SBT 也可以处理很多其他事情,例如下载库可能具有的其他依赖项,根据您的 scalaVersion 值选择正确的版本,它甚至可以通过键入例如在 scala 版本之间“动态”切换。在 sbt 提示符 set scalaVersion := "2.9.0-1"。我强烈建议使用 SBT 来试验新库。
    • 非常感谢您。作为 Scala 的新手(来自 ruby​​,它是一个了不起的 gem 系统),这对我来说是一个很大的挫折。非常感谢您提供的清晰度。
    • 创建一个只包含 build.sbt 的目录。然后从该目录启动sbt console
    • 我强烈建议您检查其他 sbt(控制台)功能,例如,能够通过触发执行连续编译和测试非常有用。 scala-sbt.org/0.13/docs/index.html
    【解决方案4】:

    您可以使用 scala 的 -cp 开关将 jars 保留在类路径中。还有其他可用的开关,例如,-deprecation-unchecked 用于打开各种警告。通过scala -X...scala -Y... 可以找到更多内容。您可以通过scala -help了解更多关于这些开关的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多