2016-11-29 2 views
2

Мне нужно создать файл js из файлов sjsir во время выполнения, чтобы реализовать систему плагинов, чтобы она не могла быть выполнена во время компиляции с остальной частью моей компиляции. Я использовал тот же процесс в 0.6.3 со следующим кодом, но он, кажется, устарел. Какой алгоритм вы рекомендуете достичь того же действия с 0,6.13? БлагодаряПостроить JS из SJSIR `вручную`

val scalajsLib = copyJar("scalajs-library_2.11-0.6.3") 

val semantics = org.scalajs.core.tools.sem.Semantics.Defaults 

val partialClasspath = 
    PartialClasspathBuilder.build(collection.immutable.Seq(scalajsLib, src)) 

val completeClasspath = partialClasspath.resolve() 

val optimizer = new ScalaJSOptimizer(semantics) 

val logger = new ScalaConsoleLogger 

val out = WritableFileVirtualJSFile(
    new java.io.File(target, JS_FILE)) 
if (optimized) { 
    val sems = semantics.optimized 

    new ScalaJSClosureOptimizer(sems).optimizeCP(
    new ScalaJSOptimizer(sems), 
    completeClasspath, 
    ScalaJSClosureOptimizer.Config(out), 
    logger 
) 
} else { 
    optimizer.optimizeCP(
    completeClasspath, 
    ScalaJSOptimizer.Config(out, checkIR = false, wantSourceMap = !optimized), 
    logger 
) 
} 

ответ

2

Инструментов API резко изменилась в 0.6.5, на самом деле. В будущем он стал намного проще и более способным развиваться нерегулярными способами.

Ваш код выше может быть записан с новым API следующим образом:

import java.io.File 

import org.scalajs.core.tools.io._ 
import org.scalajs.core.tools.sem._ 
import org.scalajs.core.tools.linker.backend.{OutputMode, ModuleKind} 
import org.scalajs.core.tools.linker.Linker 
import org.scalajs.core.tools.logging.ScalaConsoleLogger 

def link(inputClasspath: Seq[File], outputJSFile: File): Unit = { 
    // Obtain VirtualScalaJSIRFile's from the input classpath 
    val irCache = new IRFileCache().newCache 
    val irContainers = IRFileCache.IRContainer.fromClasspath(inputClasspath) 
    val sjsirFiles = irCache.cached(irContainers) 

    // A bunch of options. Here we use all the defaults 
    val semantics = Semantics.Defaults 
    val outputMode = OutputMode.Default 
    val moduleKind = ModuleKind.NoModule 
    val linkerConfig = Linker.Config() 

    // Actual linking 
    val linker = Linker(semantics, outputMode, moduleKind, linkerConfig) 
    val logger = new ScalaConsoleLogger 
    linker.link(sjsirFiles, WritableFileVirtualJSFile(outputJSFile), logger) 
} 

А вы можете назвать эту link функцию со следующими параметрами, чтобы точно соответствовать вашим выше фрагмент кода:

link(Seq(scalajsLib, src), new java.io.File(target, JS_FILE)) 

Если вы намереваетесь вызывать этот метод несколько раз по тому же пути к классам в рамках одного и того же процесса, рекомендуется кэшировать и повторно использовать экземпляры irCache и linker во время прогона, так как это значительно ускорит процесс ,

См. Также the Scaladoc of the Tools API.

+0

Отлично! Благодарю. – Mathieu

0

Есть ли способ предотвратить ошибки в повторении класса в пакете sjsir (который генерирует сообщение: XXX already seen) во время ссылки? Я думаю, это так, поскольку эта ошибка не возникает, когда сборка выполняется во время компиляции из файла build.sbt.

Смежные вопросы