SBT-根据任务监视不同的源

SBT-根据任务监视不同的源,sbt,scala.js,Sbt,Scala.js,在跨Scala JS服务器/客户机项目中,我希望更改一些源以重新启动服务器,并希望更改其他源以触发打包过程,但不需要重新启动。不同的任务不会有帮助,因为它们只会做一个或另一个,而我想同时做两个 更详细地说: 我有一个Scala.js项目。我使用以下方法来确保服务器可以为构建的脚本提供服务: val app = crossProject.settings(...) lazy val appJS = app.js lazy val jsFile = fastOptJS in(appJS, Compi

在跨Scala JS服务器/客户机项目中,我希望更改一些源以重新启动服务器,并希望更改其他源以触发打包过程,但不需要重新启动。不同的任务不会有帮助,因为它们只会做一个或另一个,而我想同时做两个

更详细地说: 我有一个Scala.js项目。我使用以下方法来确保服务器可以为构建的脚本提供服务:

val app = crossProject.settings(...)
lazy val appJS = app.js
lazy val jsFile = fastOptJS in(appJS, Compile)
lazy val appJVM = app.jvm.settings(
  (resources in Compile) += jsFile.value.data,
  (resources in Compile) += jsFile.value.data.toPath.resolveSibling(jsFile.value.data.name+".map").toFile,
  (resources in Compile) += (packageJSDependencies in(appJS, Compile)).value
)
如果我运行
~appJVM/compile:packageBin::packageConfiguration
,那么对JavaScript源代码的更改会立即被编译并放入appJVM target/classes目录中,因此刷新浏览器会得到我的新代码-brilliant

但是,如果我编辑服务器端代码,我还想使用sbt revolver插件重新启动服务器。但是有一个问题——如果我使用
~;appJVM/compile:packageBin::packageConfiguration;appJVM/reStart
然后更改客户端源代码,重新启动服务器,这是我不希望看到的。但是如果我从transitive watch中删除客户端项目,那么它就不会再注意到我是否更改了客户端项目


是否有一种方法可以根据每个任务定义不同的监视传递源?

您确定使用的是
sbt解析器
而不是
sbt旋转器

因为第二个允许使用

  • watchSources
    -为单个项目定义 监视更改。默认情况下,项目监视资源和资源 Scala和Java源代码
  • watchTransitiveSources
    -然后将
    watchSources
    用于当前项目以及所有执行和类路径 依赖项(有关interProject的详细信息,请参见 依赖项)

Source:

~
实际上是一个命令,它监视基本项目的可传递源,然后在这些源发生更改时同步运行作为参数传递给它的所有内容,然后再重新运行原始输入(包括~)。它不会向这些命令行输入提供任何关于已更改内容的信息(很难看出它是如何更改的)

因此,我的解决方案是编写一个新的watch命令。它还需要监视所有源代码,然后根据已更改的文件有条件地选择要执行的操作


我已经把一些丑陋的东西拼凑在一起做了这件事,但我会考虑让它更易读、更通用、更经过测试,并且成为一个插件。然而,在此期间,任何试图跟随我的路线的人都可以使用以下公开要点:

是的,sbt左轮手枪-打字错误。我看过文件了。它们并没有解决我的问题——根据同一项目的任务查看不同的源代码集。更一般地说,我完全不想使用
~
,而是创建一个任务,监视任意一组文件,并在每次文件更改时运行其他任务,但是我的谷歌搜索让我失望了——我找不到一个这样做的例子。我想你的问题可以写得更简单一些。另外,不要暗示答案,而是描述你的需求。如果我理解正确,您希望更改某些源以重新启动服务器,并希望更改其他源以触发打包过程,但不需要重新启动。不同的任务不会有帮助,因为它们只是做一个或另一个任务,而你想同时做这两个任务。对吗?对,对。我将把开头的一段改为你的措辞。