Scala Ammonite:如何使用来自常春藤依赖项的另一个脚本?
我有一个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”) //
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!")