Основываясь на this Github issue, я узнал, что можно указать путь для устранения неоднозначности ссылок на библиотеки Javascript. Давайте попробуем устранить ошибку jquery.js
, добавив путь dist
.
jsDependencies ++= Seq(
"org.webjars.bower" % "jquery" % "3.0.0-beta1"/"dist/jquery.js"
)
Но работает fastOptJS
снова возвращается в ту же ошибку
[error] - Ambiguous reference to a JS library: jquery.min.js
[error] Possible paths found on the classpath:
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.min.js
[error] - META-INF/resources/webjars/jquery/2.1.4/jquery.min.js
[error] originating from: root:compile
[error] - Ambiguous reference to a JS library: jquery.js
[error] Possible paths found on the classpath:
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/src/jquery.js
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.js
[error] - META-INF/resources/webjars/jquery/2.1.4/jquery.js
[error] originating from: root:compile
[error] Total time: 2 s, completed Mar 2, 2016 7:29:08 PM
Эта проблема на самом деле создается с помощью libraryDependencies
записи "org.querki" %%% "jquery-facade" % "0.10"
. Использование в dependency graph SBT plugin мы видим полный граф зависимостей:
[info] root:root_sjs0.6_2.11:0.1-SNAPSHOT [S]
[info] +-org.querki:jquery-facade_sjs0.6_2.11:0.10 [S]
[info] | +-org.querki:querki-jsext_sjs0.6_2.11:0.6 [S]
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.5 (evicted by: 0.6.7)
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.7 [S]
[info] | |
[info] | +-org.scala-js:scalajs-dom_sjs0.6_2.11:0.8.0 [S]
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.0 (evicted by: 0.6.7)
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.5 (evicted by: 0.6.7)
[info] | | +-org.scala-js:scalajs-library_2.11:0.6.7 [S]
[info] | |
[info] | +-org.scala-js:scalajs-library_2.11:0.6.5 (evicted by: 0.6.7)
[info] | +-org.scala-js:scalajs-library_2.11:0.6.7 [S]
[info] | +-org.webjars:jquery:2.1.4
[info] |
[info] +-org.scala-js:scalajs-java-time_sjs0.6_2.11:0.1.0 [S]
[info] | +-org.scala-js:scalajs-library_2.11:0.6.6 (evicted by: 0.6.7)
[info] | +-org.scala-js:scalajs-library_2.11:0.6.7 [S]
[info] |
[info] +-org.scala-js:scalajs-library_2.11:0.6.6 (evicted by: 0.6.7)
[info] +-org.scala-js:scalajs-library_2.11:0.6.7 [S]
[info] +-org.webjars.bower:jquery:3.0.0-beta1
Выход показывает org.querki:jquery-facade_sjs0.6_2.11:0.10
зависеть от org.webjars:jquery:2.1.4
. Это объясняет сообщение об ошибке Ambiguous reference to a JS library
, потому что у нас все еще есть две версии библиотеки jquery, доступные в перечисленных зависимостях.
Что мы можем попробовать, это использовать exclude
в зависимости от библиотеки.
libraryDependencies ++= Seq(
"org.scala-js" %%% "scalajs-java-time" % "0.1.0",
"org.querki" %%% "jquery-facade" % "0.10" exclude("org.webjars","jquery")
)
Запуск fastOptJS
задачу теперь возвращает
[error] (compile:resolvedJSDependencies) org.scalajs.core.tools.jsdep.JSLibResolveException: Some references to JS libraries could not be resolved:
[error] - Ambiguous reference to a JS library: jquery.js
[error] Possible paths found on the classpath:
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/src/jquery.js
[error] - META-INF/resources/webjars/jquery/3.0.0-beta1/dist/jquery.js
[error] originating from: root:compile
[error] Total time: 2 s, completed Mar 2, 2016 7:47:14 PM
Таким образом, хотя мы избавились от некоторых ошибок, мы не совсем там еще. Я не 100% уверен, что здесь, но, кажется, эта ошибка является результатом в how the build.sbt of the jQuery Facade includes jQuery using jsDependencies itself:
jsDependencies += "org.webjars" % "jquery" % "2.1.4"/"jquery.js" minified "jquery.min.js"
Так что, похоже, мы столкнулись с той же проблемой, мы имели в начале. Неквалифицированный jquery.js
(т. Е. Без предшествующего пути) не может быть однозначно разрешен.
Для решения этой проблемы мы можем использовать настройку jsManifestFilter
. Я нашел этот совет в Scala.js Gitter room.
jsManifestFilter := {
import org.scalajs.core.tools.jsdep.{JSDependencyManifest, JSDependency}
(seq: Traversable[JSDependencyManifest]) => {
seq map { manifest =>
def isOkToInclude(jsDep: JSDependency): Boolean = {
println(s"jsDep=>$jsDep")
jsDep.resourceName != "jquery.js"
}
new JSDependencyManifest(
origin = manifest.origin,
libDeps = manifest.libDeps filter isOkToInclude,
requiresDOM = manifest.requiresDOM,
compliantSemantics = manifest.compliantSemantics
)
}
}
}
Здесь мы перезаписать настройки jsManitestFilter
и явно отфильтровать голую jquery.js
зависимость. fastOptJS
задача теперь работает отлично:
[info] Resolving org.eclipse.jetty#jetty-continuation;8.1.16.v20140903 ...
[info] Done updating.
jsDep=>JSDependency(resourceName=dist/jquery.js)
jsDep=>JSDependency(resourceName=jquery.js, minifiedResourceName=Some(jquery.min.js))
[info] Fast optimizing jsdeps/target/scala-2.11/root-fastopt.js
[success] Total time: 3 s, completed Mar 2, 2016 8:27:40 PM
Обратите внимание, что добавленный println
заявление также выводит resourceName
для включенных зависимостей.
http://stackoverflow.com/questions/37239261/ambiguous-reference-to-a-js-library-jquery-js – ses