SBT如何从任务运行Node.js包?执行yarn命令报错求助
解决Scala.sys.process调用Yarn时的模块找不到问题
你碰到的这个报错很典型——当你在SBT任务里调用yarn.cmd时,系统默认会从当前项目的node_modules目录里找Yarn的执行文件,但你的项目里并没有本地安装Yarn,所以才会抛出Cannot find module '...\yarn.js'的错误。
下面给你两个可行的解决思路:
思路1:调用全局安装的Yarn
如果你已经通过官方安装包或者npm install -g yarn在系统全局装了Yarn,直接调用全局的yarn命令就行(Windows下scala.sys.process会自动识别可执行文件,不用加.cmd后缀):
lazy val ttt = taskKey[Unit]("Some task") ttt := { import scala.sys.process._ Seq("yarn", "-v").! }
要是全局Yarn的路径没加到系统PATH环境变量里,那就写全路径:
Seq("C:\\Program Files\\Yarn\\bin\\yarn.cmd", "-v").!
思路2:在项目本地安装Yarn
如果你的场景必须依赖项目本地的Yarn,先在项目根目录跑npm install yarn --save-dev,把Yarn装到项目的node_modules里。之后用本地的路径来调用:
lazy val ttt = taskKey[Unit]("Some task") ttt := { import scala.sys.process._ Seq("./node_modules/.bin/yarn.cmd", "-v").! }
小提示
建议先在命令行手动执行一遍对应的Yarn命令,确认能正常输出版本号后再写到SBT任务里,这样能先排除环境本身的问题。另外Windows系统里写路径记得用双反斜杠转义,或者用Scala的原始字符串"""C:\Your\Path\yarn.cmd"""。
内容的提问来源于stack exchange,提问作者Oleg




