Scala Ammonite:如何使用来自常春藤依赖项的另一个脚本?

Scala Ammonite:如何使用来自常春藤依赖项的另一个脚本?,scala,ammonite,scala-script,Scala,Ammonite,Scala Script,我有一个Ammonite脚本,我想把它放在一个罐子里 在另一个项目中,我想使用这个脚本-但到目前为止没有成功 我根据文档(sol\u local\u build.sc)进行了尝试: local\u build.sc在我要使用的脚本中 这是我得到的例外: sol_local_build.sc:2: '.' expected but eof found. ^ 脚本必须实时编译 将脚本放入标准sbt项目中 在目录中,例如目录名:“test1” 放置外部脚本(示例名称:“script.sc”) //

我有一个Ammonite脚本,我想把它放在一个罐子里

在另一个项目中,我想使用这个脚本-但到目前为止没有成功

我根据文档(
sol\u local\u build.sc
)进行了尝试:

local\u build.sc
在我要使用的脚本中

这是我得到的例外:

sol_local_build.sc:2: '.' expected but eof found.

^

脚本必须实时编译

将脚本放入标准sbt项目中

在目录中,例如目录名:“test1”

放置外部脚本(示例名称:“script.sc”)

//script.sc

println(“你好,世界!”)

进入test1项目的资源目录(“test1\src\main\resources\script.sc”)

在本地发布项目,即sbt publishLocal

它被发布到“.ivy2\local\default\test1\u 2.12\0.1-SNAPSHOT\…”目录

现在您可以使用下面的ammonite脚本“test.sc”

它从本地ivy存储库中的jar中读取“script.sc”

并将其写入本地目录(必须具有读/写访问权限),然后执行外部进程

它调用scala“解释器”并执行脚本

// test.sc

import $ivy.`default:test1_2.12:0.1-SNAPSHOT`


val scriptCode = scala.util.Try {scala.io.Source.fromResource("script.sc").mkString} getOrElse """Println("Script-file not found!")"""

println("*" * 30)
println(scriptCode)
println("*" * 30)
println()


java.nio.file.Files.write(java.nio.file.Paths.get("script.sc"), scriptCode.getBytes(java.nio.charset.StandardCharsets.UTF_8))

val cmd = Seq("cmd.exe", "/c", "scala", "script.sc")

val output = sys.process.Process(cmd).!! 

println(output)
执行脚本Ammonite REPL,您会得到:

******************************
// script.sc

println("Hello world!")
******************************

Hello world!

脚本没有错误处理,将文件保留在运行目录中。 您可以使用“-savecompiled”编译器开关加速执行,即

val cmd = Seq("cmd.exe", "/c", "scala", "-savecompiled", "script.sc")

然后在运行目录中创建一个额外的.jar文件。

Scala脚本不是真正解释的,而是“在后台”编译的 就像每一个普通的Scala程序一样。 因此,所有代码在编译时都必须是可访问的 您不能从jar文件调用另一个脚本中的函数

但菊石有一个内置的多阶段功能。 它编译一个部分,执行它,然后编译下一个部分

几乎没有改进的亚扪人脚本。 它不是无错误的,而是运行的

也许有更好的方法将脚本从jar中取出。 你应该问问李浩毅

// test_ammo.sc 
// using ammonite ops

// in subdirectoy /test1

// Ammonite REPL:
// import $exec.test1.test_ammo
// @ Ammonite-multi-stage

import $ivy.`default::test1:0.1-SNAPSHOT`

//import scala.util.Properties
import scala.sys.process.Process

val scriptFileName = "script.sc"

write.over(pwd/"test1"/scriptFileName, read(resource(getClass.getClassLoader)/scriptFileName))

val cmd = Seq("cmd.exe", "/c", "scala", scriptFileName)
val output = Process(cmd).!! 
println(output)

@

import $exec.script // no .sc suffix

ppp() // is a function inside script.sc

script.sc位于项目的资源文件夹内 使用“sbt publishLocal”在本地发布:


谢谢,但是我怎样才能重用库文件的功能,比如我的问题中的
doit
,它使用了我的库中的
curl
?请尝试导入$ivy。
mycompany:myproject\u 2.12:2.1.0-SNAPSHOT
,local\u build.\uu最后!在import-$ivy语句的末尾添加。检查您的文件编码!这里没有成功。对于
import$ivy.
mycompany:devops\u 2.13:2.4.0-SNAPSHOT
,local\u build.\u
我收到以下错误:
project\u build.sc:1:未找到:value local\u build import$ivy.$,local\u build.\u
是否使用:scala project\u build.sc启动脚本?再次感谢;)。我是Mac用户,所以我这样做了:
val cmd=Seq(“bash”,“scala”,scriptFileName)
,但它无法编译,甚至无法解析ammonite导入
local\u build.sc:4:错误:未找到:值ammonite import ammonite.main.Router.main
// test_ammo.sc 
// using ammonite ops

// in subdirectoy /test1

// Ammonite REPL:
// import $exec.test1.test_ammo
// @ Ammonite-multi-stage

import $ivy.`default::test1:0.1-SNAPSHOT`

//import scala.util.Properties
import scala.sys.process.Process

val scriptFileName = "script.sc"

write.over(pwd/"test1"/scriptFileName, read(resource(getClass.getClassLoader)/scriptFileName))

val cmd = Seq("cmd.exe", "/c", "scala", scriptFileName)
val output = Process(cmd).!! 
println(output)

@

import $exec.script // no .sc suffix

ppp() // is a function inside script.sc

// script.sc

println("Hello world!")

def ppp() = println("Hello world from ppp!")