Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 通过“获取运行时要编译的资产”;“激活器运行”;在游戏中_Scala_Playframework_Sbt_Sbt Web - Fatal编程技术网

Scala 通过“获取运行时要编译的资产”;“激活器运行”;在游戏中

Scala 通过“获取运行时要编译的资产”;“激活器运行”;在游戏中,scala,playframework,sbt,sbt-web,Scala,Playframework,Sbt,Sbt Web,我正在使用Sass作为我的CSS预处理器,并试图通过资产管道运行它。我曾尝试将这个sassTask作为源文件任务和web资产任务来实现,但在这两方面都遇到了问题 如果我将Sass作为源任务运行(见下文),则当请求页面并在页面重新加载时找到更新的文件时,activator run会触发Sass。我遇到的问题是,生成的CSS文件都被直接转储到target/web/public/main/lib,而不是反映在resources managed目录下的子目录中。我不知道该怎么做 相反,我尝试将Sass编

我正在使用Sass作为我的CSS预处理器,并试图通过资产管道运行它。我曾尝试将这个sassTask作为源文件任务和web资产任务来实现,但在这两方面都遇到了问题

如果我将Sass作为源任务运行(见下文),则当请求页面并在页面重新加载时找到更新的文件时,
activator run
会触发Sass。我遇到的问题是,生成的CSS文件都被直接转储到
target/web/public/main/lib
,而不是反映在
resources managed
目录下的子目录中。我不知道该怎么做

相反,我尝试将Sass编译作为web资产任务来实现(见下文)。以这种方式工作,据我所知,
管理的资源
没有发挥作用,因此我将文件直接编译到
target/web/public/main/lib
。我肯定我做得不够动态,但我不知道如何做得更好。但这里最大的问题是,当使用
activator run
时,管道显然没有运行。我可以使用
activator stage
运行它,但我确实需要在常规开发工作流程中使用它,这样我就可以在dev服务器运行时更改样式文件,与Scala文件一样

我曾尝试通过这些论坛、sbt web文档和一些现有插件进行梳理,但我发现这个过程非常令人沮丧,因为sbt的复杂性和构建过程中实际发生的事情的不透明性

将Sass编译为源文件任务:

lazy val sassTask = TaskKey[Seq[java.io.File]]("sassTask", "Compiles Sass files")

sassTask := {
  import sys.process._
  val x = (WebKeys.nodeModules in Assets).value
  val sourceDir = (sourceDirectory in Assets).value
  val targetDir = (resourceManaged in Assets).value
  Seq("sass", "-I", "target/web/web-modules/main/webjars/lib/susy/sass", "--update", s"$sourceDir:$targetDir").!
  val sources = sourceDir ** "*.scss"
  val mappings = sources pair relativeTo(sourceDir)
  val renamed = mappings map { case (file, path) => file -> path.replaceAll("scss", "css") }
  val copies = renamed map { case (file, path) => file -> targetDir / path }
  copies map (_._2)
}

sourceGenerators in Assets <+= sassTask

我认为,根据与的相关文档,源文件任务是一种方法:

作为插件的源文件任务示例有CoffeeScript、LESS和 JSHint。其中一些获取源文件并生成目标web 资产,例如CoffeeScript生成JS文件。这类插件 在功能方面相互排斥,即。 只有一个CoffeeScript插件将获取CoffeeScript源代码和 生成目标JS文件。总之,源文件插件产生web服务 资产

我认为你努力实现的目标属于这一类

TL;博士;-<代码>build.sbt 解释 假设您在
app/assets/
目录中有一个sass文件,并且您希望在
web/public/main/
目录中创建css文件,这就是您可以做的

创建一个任务,它将读取
app/assets/
目录和子目录中的文件,并将它们输出到我们定义的
sassOutputDir

val sassTask = taskKey[Seq[File]]("Compiles Sass files")

val sassOutputDir = settingKey[File]("Output directory for Sass generated files")

sassOutputDir := target.value / "web" / "sass" / "main"

resourceDirectories in Assets += sassOutputDir.value

sassTask := {
  val sourceDir = (sourceDirectory in Assets).value
  val outputDir = sassOutputDir.value
  val sourceFiles = (sourceDir ** "*.scss").get
  Seq("sass", "--update", s"$sourceDir:$outputDir").!
  (outputDir ** "*.css").get
}
但这还不够。如果要保留目录结构,必须将
sassOutputDir
添加到资产中的
资源目录中。这是因为sbt web中的映射声明如下:

mappings := {
  val files = (sources.value ++ resources.value ++ webModules.value) ---
    (sourceDirectories.value ++ resourceDirectories.value ++ webModuleDirectories.value)
  files pair relativeTo(sourceDirectories.value ++ resourceDirectories.value ++ webModuleDirectories.value) | flat
}
这意味着所有未映射的文件都使用
flat
策略进行映射。不过,修复方法很简单,只需将其添加到
build.sbt

resourceDirectories in Assets += sassOutputDir.value

这将确保目录结构被保留。

哦,天哪,老兄,你救了我的命。令人沮丧的是,我花了48小时试图弄明白这一点,我阅读了整整48页的SBT教程。如果我阅读了全部文档,我想我最终可能会无意中发现这种行为,但我必须说,SBT中幕后发生的所有“魔法”都非常令人沮丧。@acjay我很高兴它帮助了你。如果你认为答案是正确的,你能接受吗?因此这个问题不是没有答案的。谢谢。您使用的是
sourceGenerators
,但您的意思可能是
resourceGenerators
。无论如何,谢谢你指出了正确的方向。@lpiepiora,非常感谢你的回答。这对我帮助很大!
mappings := {
  val files = (sources.value ++ resources.value ++ webModules.value) ---
    (sourceDirectories.value ++ resourceDirectories.value ++ webModuleDirectories.value)
  files pair relativeTo(sourceDirectories.value ++ resourceDirectories.value ++ webModuleDirectories.value) | flat
}
resourceDirectories in Assets += sassOutputDir.value