Quero publicar (pelo menos localmente) uma biblioteca multiplataforma JVM/JS usando Mill. Tenho muito disso funcionando com o arquivo de build mostrado abaixo.
A parte que me deixou perplexo é que eu gostaria de incluir uma quantidade modesta de código específico da plataforma. A abordagem mais óbvia para mim é colocar esse código em dois diretórios separados, xpJVM
e xpJS
fazer xpShared.jvm
e xpShared.js
depender deles. Mas isso gera um conflito de tipo com o PublishModule
:
[build.mill-61] [error] found : package_.this.xpJS.type
[build.mill-61] [error] required: mill.scalalib.PublishModule
[build.mill-61] [error] def moduleDeps = Seq(xpJS)
[build.mill-61] [error] ^
[build.mill-61] [error] /Users/bwbecker/temp/xp/build.mill:21:26: type mismatch;
Aqui está a parte importante do layout do arquivo:
.
├── build.mill
├── xpJS
│ └── src
│ └── Platform.scala
├── xpJVM
│ └── src
│ └── Platform.scala
└── xpShared
├── src
│ └── XP.scala
└── test
└── src
└── XPTests.scala
Aqui está o build.mill
arquivo:
package build
import mill._, scalalib._, scalajslib._, publish._
trait AppScalaModule extends ScalaModule {
def scalaVersion = "3.3.5"
}
trait AppScalaJSModule extends AppScalaModule with ScalaJSModule {
def scalaJSVersion = "1.16.0"
}
// JVM-specific stuff
object xpJVM extends AppScalaModule
// JS-specific stuff
object xpJS extends AppScalaJSModule
object xpShared extends AppScalaModule {
trait SharedModule extends AppScalaModule with PlatformScalaModule
object jvm extends SharedModule with XP_Publish {
// The following line causes a compile error
def moduleDeps = Seq(xpJVM)
object test extends ScalaTests {
def ivyDeps = Agg(ivy"com.lihaoyi::utest::0.8.5")
def testFramework = "utest.runner.Framework"
}
}
object js extends SharedModule with AppScalaJSModule with XP_Publish {
// The following line causes a compile error
def moduleDeps = Seq(xpJS)
object test extends ScalaTests with ScalaJSTests {
def ivyDeps = Agg(ivy"com.lihaoyi::utest::0.8.5")
def testFramework = "utest.runner.Framework"
}
}
}
trait XP_Publish extends PublishModule {
override def publishVersion = "0.1.0"
override def artifactName = "xp"
override def pomSettings = PomSettings(
description = "A cross-platform library.",
organization = "ca.uwaterloo",
url = "",
licenses = Seq(),
versionControl = VersionControl(),
developers = Seq()
)
}
Alguma sugestão sobre como proceder? Tenho duas:
- Tente usar o
CrossScalaModule
mostrado na documentação do Mill . Sou cético em relação a essa abordagem porque envolve muita sobrecarga para algo que não preciso (várias versões do Scala) e não há nada naquele exemplo que resolva meu problema específico (código específico da plataforma). - Substitua o
sources
forxpShared.js
expShared.jvm
para incluir as fontes emxpJS
andxpJVM
. Estou mais otimista de que isso funcionará, mas a abordagem descrita acima parece muito mais direta. Eu preferiria essa abordagem, se possível.
Obrigado por qualquer sugestão que você tenha!