如何让 IntelliJ 识别 Scala 脚本中的导入?

How to get IntelliJ to recognize imports in Scala script?

我无法让 IntelliJ 识别我的 Scala 脚本中的 Ammonite 导入。这是一项新功能,已报告 here,其中也有说明。我按照说明在 IntelliJ 中启动了一个新的 sbt 项目来尝试它,但它不起作用。

我在项目的 "External Libraries" 中看到了 Ammonite 依赖项,我在 build.sbt 中指定了它: libraryDependencies += "com.lihaoyi" %% "ammonite-ops" % "1.0.3" libraryDependencies += "com.lihaoyi" % "ammonite" % "1.0.3" cross CrossVersion.full

(非常简单的)项目似乎已成功构建。我还指定 Scala 工作表文件应被视为 "Always Ammonite".

所有这些,但是 IDE 显示的脚本如下:

我还需要做些什么才能让它发挥作用?

版本:

您需要将 .sc 文件与菊石相关联。

在你的设置中,它应该是这样的 (解决方案取自 here

我还建议阅读以下内容blog post(向下滚动到 Ammonite 脚本支持)以确保您满足所有需要的要求

我在使用 IntelliJ 时遇到了类似的问题,所以让我分享一下我是如何让它工作的。

我的版本:

  • IntelliJ Ultimate 2017.3.2(所以和你的版本基本一样)
  • IntelliJ Scala 插件 2017.3.11
  • Kubuntu,因此可能需要调整以下键盘快捷键

现在,我从与您相同的代码开始,使用更新版本的依赖项 0.6.7

现在已经按下第 1 行旁边的绿色箭头运行 Ammonite。下载依赖项并显示 link。 这是 IntelliJ 识别新 jar 可用的必需步骤

同样在这个阶段,Intellij 向我展示了一个小弹出窗口,其中包含我可以导入 jar 的信息。 我没用过

为了让 IntelliJ 识别导入,我按 Alt+Enter Show Intention Actions在损坏的 com.lihaoyi::scalatags:0.6.7 依赖项上使用 从 jar 创建库...

这会让 Intellij 识别库、导入并开始给你提示。

库添加到项目的依赖项中(Ctrl+Alt+Shift+ s)。您还可以看到来自下面其他文件的依赖项。

我在使用 IntelliJ 时遇到了类似的问题,而且似乎是 IntelliJ 中的错误。

我的版本:

  • IntelliJ 旗舰版 2018.2.4
  • IntelliJ Scala 插件 2018.2.11
  • OS: Windows
  • Scala:2.12.6(目前 Ammonite 当前版本 1.2.1 未针对 Scala 2.12.7 发布,请参阅 #879 及以下内容)

没有 IntelliJ 项目

如果我只是打开 .sc 文件而没有打开项目,则会收到

提示
  • 项目 JDK 未定义
  • 模块中没有 Scala SDK
  • 通知:'Add all Ammonite standard dependencies to the project?'

通知很快就消失了。如果我在修复 JDK 之前单击 'Add' 按钮,导入不起作用,并且添加按钮消失了。修复 jdk 和 scala,然后在事件日志中找到 'Add all Ammonite...' 并单击那里的 'add',然后就可以了。

但是,下次我重新打开 IntelliJ 时,所有设置更改都会丢失。

使用 IntelliJ 项目

  • 创建新项目 Scala sbt 项目,默认基于目录的项目。
  • 我把我的 sc 文件放在那里的某个地方

现在 IntelliJ 会记住 sc 文件的设置。在将 'open with...' 配置为 intellij 后,我什至可以直接从 IntelliJ 的 explorer/total commander 打开 sc 文件,尽管我更喜欢。

不允许 IntelliJ 通过通知自动导入 sbt 项目设置,这似乎会破坏库导入,我需要重新创建项目才能恢复。

Scala 版本问题

库自动导入 'add' 按钮仅适用于发布了 Ammonite 的 Scala 版本。参见 Maven Central Ammonite releases. At the time of writing Ammonite 1.2.1 is not released for scala-2.12.7, though the current unstable version of ammonite is. See Ammonite bug-report #879。添加按钮只是无声地失败,这很糟糕,尤其是。对于像我这样的新手。

自动生成的 sbt 构建文件如下所示

name := "Ammonite"
version := "0.1"
scalaVersion := "2.12.6"

这是库成功加载后在项目设置中的样子:

这里是使其编译的依赖项。请注意,'SBT : ' 依赖项是通过 SBT 文件自动生成的(看起来),其他是 scala 插件 ammonite 通知功能添加的库

当 IntelliJ 无法加载 ammonite 库时,上面的库列表为空。

带有 SBT 的 IntelliJ(因为 IntelliJ 失去了菊石进口,并且对于 $ivy)

IntelliJ 似乎经常丢失其菊石进口。如果我有 SBT 设置来提供进口,那就没那么重要了。此外,IntelliJ $ivy 对 ammonite 的支持仅在文件已本地缓存在 ivy-cache 中时有效,并且 运行 我的 windows 上的 Ammonite 脚本将文件缓存在不同位置,这意味着 IntelliJ $ivy 导入实际上不会工作。因此,我使用 SBT 来设置我在脚本中使用的导入总和。

我的build.sbt

scalaVersion := "2.12.7"
// https://mvnrepository.com/artifact/com.lihaoyi/ammonite
libraryDependencies += "com.lihaoyi" % ("ammonite_" + scalaVersion) % "1.2.1-16-48ce533"

// Extra example dependency
libraryDependencies += "org.jsoup" % "jsoup" % "1.11.3"

如果您主要使用 Scala 2.13 和 SBT 1.3+ 以及 Coursier 库管理,我认为 IntelliJ IDEA 不会在本地缓存中找到依赖项。我们需要通过将依赖项下载到 Ivy 缓存来帮助 IntelliJ IDEA。

我通过以下方式解决了这个问题:

  1. 在需要依赖项的地方创建 ivy.xml,例如:

    <ivy-module version="1.0">
        <info organisation="test" module="download-deps"/>
        <dependencies>
            <dependency org="com.softwaremill.sttp.client" name="core_2.12" rev="2.1.1"/>
            <dependency org="com.softwaremill.sttp.client" name="okhttp-backend_2.12" rev="2.1.1"/>
            <dependency org="com.github.tototoshi" name="scala-csv_2.12" rev="1.3.6"/>
        </dependencies>
    </ivy-module>
    

    注意,我这里指定的是Scala 2.12

  2. 运行 ivy -refresh 来自创建的目录 ivy.xml.

  3. 然后我们需要的是"Create library from jar..."从IntelliJ IDEA中的red import的context actions。

就这些了!