【问题标题】:What determines the output javascript file name generated by scalajs sbt plugin?是什么决定了 scalajs sbt 插件生成的输出 javascript 文件名?
【发布时间】:2019-05-23 07:20:14
【问题描述】:

在这个项目中:

https://github.com/tribbloid/scalajs-cli-demo

我使用 npm 和 sbt 的组合定义了一个 scalajs 项目,在 npm 包文件中我将 sbt 声明为预发布脚本:

  "scripts": {
    "prepublish": "sbt 'show fullOptJS' && cp target/scala-2.12/scalajs-cli-demo-opt.js ./lib/main.js",
    "test": "sbt test"
  },

sbt 构建定义使用 scalajs sbt 插件来拉取依赖项并调用转译器:

resolvers += Resolver.sonatypeRepo("releases")
enablePlugins(ScalaJSPlugin)
name := "Scala.js CLI Demo first release"
scalaVersion := "2.12.7"
scalaJSModuleKind := ModuleKind.CommonJSModule
scalaJSUseMainModuleInitializer := true
mainClass in Compile := Some("HelloWorldApp")

// https://mvnrepository.com/artifact/io.scalajs/nodejs
libraryDependencies += "io.scalajs" %%% "nodejs" % "0.4.2"

moduleName in fullOptJS := "scalajs-cli-demo"

但是,当我运行npm install 时,我在日志中得到以下错误信息:

67 info lifecycle scalajs-cli-demo@1.0.4~prepublish: Failed to exec prepublish script
68 verbose stack Error: scalajs-cli-demo@1.0.4 prepublish: `sbt 'show fullOptJS' && cp target/scala-2.12/scalajs-cli-demo-opt.js ./lib/main.js`
68 verbose stack Exit status 1
68 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:301:16)
68 verbose stack     at EventEmitter.emit (events.js:182:13)
68 verbose stack     at ChildProcess.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
68 verbose stack     at ChildProcess.emit (events.js:182:13)
68 verbose stack     at maybeClose (internal/child_process.js:962:16)
68 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:251:5)
69 verbose pkgid scalajs-cli-demo@1.0.4
70 verbose cwd /home/peng/git-release/scalajs-cli-demo
71 verbose Linux 4.19.11-041911-generic
72 verbose argv "/usr/bin/node" "/usr/bin/npm" "install"
73 verbose node v10.14.2
74 verbose npm  v6.4.1
75 error code ELIFECYCLE
76 error errno 1
77 error scalajs-cli-demo@1.0.4 prepublish: `sbt 'show fullOptJS' && cp target/scala-2.12/scalajs-cli-demo-opt.js ./lib/main.js`
77 error Exit status 1
78 error Failed at the scalajs-cli-demo@1.0.4 prepublish script.
78 error This is probably not a problem with npm. There is likely additional logging output above.
79 verbose exit [ 1, true ]

进一步调查显示cp命令target/scala-2.12/scalajs-cli-demo-opt.js中的文件不存在。

相反,该文件被命名为scala-js-cli-demo-opt.js,但是我在定义此文件名的 scalajs sbt 插件中的任何地方都找不到它。事实上,scala-js-cli-demo 这个名字在我的源代码中甚至都不存在!那么 scalajs sbt 插件是如何导出这个文件名的呢?我应该怎么做才能纠正它?

【问题讨论】:

    标签: npm sbt npm-install scala.js


    【解决方案1】:

    好的,我自己弄清楚了,名称是从项目名称/artifactID 生成的。在这种情况下,它只是将所有不规则字符替换为破折号。

    【讨论】:

      【解决方案2】:

      除了确定生成的工件名称的通用有用键:namenormalizedName(用破折号替换不允许的符号)、moduleNameartifactName,您还可以覆盖编译 @ 987654325@ 文件被放置以及如何使用artifactPath 设置调用它(尽管有所有与名称相关的设置)。例如:

      Compile / fullOptJS / artifactPath := baseDirectory.value / "lib" / "main.js"
      

      或与fastOptJS相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 2020-11-18
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多