Chisel 项目环境配置

[1] 参考, Chisel 版本 6.0。Chisel 使用 mill 或 sbt 作为项目构建工具,我们这里使用 mill 为例

项目对象

build.sc 里定义了一个代表项目的对象 $NAME$ 后文以 <project_name> 指代 ,项目所有的依赖和配置文件都在这个对象的定义里。如果想在同一个目录下定义多个项目,每个项目有不同的方法和依赖,只需要依次类推定义多个 SbtModule 即可。mill 是按项目管理环境的,每个项目环境独立。这也是为什么 mill 称作项目构建工具而非 conda 的环境管理工具。

对象 object 可以看作只实例一次的 class 或者说 static class

这是我们运行的入口 mill <project_name>.xxx 即可直接调用对应方法

依赖包配置

Scala 三种方式添加依赖包

  • 直接从远程 maven 仓库导入
  • 编译到本地 ivy2 仓库导入
  • 直接将代码 merge 进项目

SbtModule 中定义了很多项目配置相关属性 [2],使用 override def 重定义

  • ivyDeps 依赖的包
  • scalacPluginIvyDeps 编译器扩展包

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]

包路径的间隔符有 ::: 俩种,前者会自动将 scala 版本作为字符串添加进路径中,这与 sbt 中的 %%% 是一样的。

但我设置了国内镜像解析还是很慢 ...

很多包并没有托管到 maven 云仓库,需要编译到本地的 local ivy 仓库,注意 mill 编译项目要继承 PublishModule [5],编译完成文件在 ~/.ivy2/local

如果不想编译直接 copy 代码,在object <project_name>以下语法添加源文件解析路径

  override def sources = T.sources {
    super.sources() ++ Seq(
      PathRef("<your_path>")
    )
  }

使用 ScalaTest 作为测试环境

 // build.sc 中定义的 test object
  object test extends SbtModuleTests with TestModule.ScalaTest {
    override def ivyDeps = m.ivyDeps() ++ Agg(
      ivy"org.scalatest::scalatest::3.2.16"
    )
  }

test 对象继承了 SbtModuleTestsTestModule.ScalaTest

  • SbtModuleTests 用 sbt 的路径管理项目,即源码和测试代码在 src/mainsrc/test
  • TestModule.ScalaTest 使用 ScalaTest 作为测试框架

以上俩个继承让我们当运行 mill <project_name>.test 时,会自动搜索运行所有的 scalatest[6]

命令行入口

mil resolve <project_name>._ 查看包括的方法,依次类推

  • mill <project_name>.run 自动调用项目主函数(继承了 App 的 object),若项目内定义了多个主函数会报错
  • mill <project_name>.runMain <package_path>.<main_class> 单独调用某个主函数
  • mill <project_name>.test 自动搜索所有 scalatest 调用,build.sc 中定义
  • mill <project_name>.testOnly <package_path>.<test_class> 单独调用某个 scalatest

  1. https://github.com/chipsalliance/chisel-template ↩︎

  2. 详情见 https://mill-build.com/mill/Scala_Module_Config.html ↩︎

  3. https://get-coursier.io/ ↩︎

  4. https://mill-build.com/mill/Scala_Module_Config.html#_repository_config ↩︎

  5. https://mill-build.com/mill/Scala_Build_Examples.html#_publish_module ↩︎

  6. https://www.scalatest.org/user_guide/using_scalatest_with_mill ↩︎

posted @ 2024-05-09 22:35  DevilXXL  阅读(203)  评论(0编辑  收藏  举报