以 [1] 参考
Chisel 使用 mill 或 sbt 作为项目构建工具,我们这里使用 mill 为例
build.sc
项目里最核心的文件,build.sc
里定义了一个代表项目的对象 $NAME$
,项目所有的依赖和配置文件都在这个对象的定义里。如果想在同一个目录下定义多个项目,每个项目有不同的方法和依赖,只需要依次类推定义多个 SbtModule
即可,这也是 scala 的核心思想——万物皆对象,连项目本身也是一个对象!
对象
object
可以看作只实例一次的class
或者说 static class
这是我们运行的入口 mill $NAME$.xxx
即可直接调用对应方法
包环境
SbtModule
中定义了很多项目配置相关属性 [2],我们用 override def
来重定义它,其中 ivyDeps
和 scalacPluginIvyDeps
指明了环境依赖项
ivyDeps
依赖的包scalacPluginIvyDeps
编译器扩展包
mill 是按项目管理环境的,每个项目环境独立。这也是为什么 mill 称作项目构建工具而非 conda 的环境管理工具。
mill 使用 coursier 解析管理依赖 [3]。所有下载的依赖包都会放在 coursier 的缓存目录中,Linux 下是 ~/.cache/coursier/v1
。比如 org.chipsalliance::chisel:6.2.0
包位置在 ~/.cache/coursier/v1/https/repo1.maven.org/maven2/org/chipsalliance
mill 同样读取 coursier 的镜像源配置,在 ~/.config/coursier/mirror.properties
设置镜像源配置 [4]
但我设置了国内镜像解析还是很慢 ...
测试环境
在 build.sc
中除了依赖项,还可以看到定义了一个 test
对象
object test extends SbtModuleTests with TestModule.ScalaTest {
override def ivyDeps = m.ivyDeps() ++ Agg(
ivy"org.scalatest::scalatest::3.2.16"
)
}
test
对象继承了 SbtModuleTests
和 TestModule.ScalaTest
SbtModuleTests
告诉 mill 用 sbt 的路径管理项目,即源码和测试代码在src/main
和src/test
中TestModule.ScalaTest
告诉 mill 用 ScalaTest 作为测试框架
以上俩个继承让我们当运行 mill $NAME$.test
时,会自动搜索运行所有的 scalatest