我想使用 Mill 发布(至少在本地)一个 JVM/JS 跨平台库。我使用下面显示的构建文件进行了大量工作。
让我困惑的部分是我想包含适量的平台特定代码。对我来说最明显的方法是将该代码放在两个单独的目录中,xpJVM
然后xpJS
makexpShared.jvm
并xpShared.js
依赖它们。但这会产生类型冲突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;
这是文件布局的重要部分:
.
├── build.mill
├── xpJS
│ └── src
│ └── Platform.scala
├── xpJVM
│ └── src
│ └── Platform.scala
└── xpShared
├── src
│ └── XP.scala
└── test
└── src
└── XPTests.scala
这是build.mill
文件:
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()
)
}
关于如何进行有什么建议吗?我有两个建议:
- 尝试使用Mill 文档
CrossScalaModule
中所示的方法。我对这种方法持怀疑态度,因为它涉及很多我不需要的东西(多个 Scala 版本)的开销,并且该示例中没有任何内容可以解决我的特定问题(特定于平台的代码)。 - 重写
sources
forxpShared.js
和xpShared.jvm
以将源包含在xpJS
和 中xpJVM
。我更乐观地认为这会起作用,但上面概述的方法似乎更直接。如果可能的话,我更喜欢这种方法。
感谢您的任何建议!
好的,经过数小时的工作,在发布并开始寻求上述第二种选择后 15 分钟就找到了解决方案。
mill show __.sources
节目对于 也类似
xpShared.jvm.sources
。只需将平台特定的代码放入
xpShared/src-js
和中xpShared/src-jvm
。很简单 — — 一旦您知道了。公平地说,搜索文档(使用内置搜索和谷歌)不会
src-jvm
有任何结果。