【Scala系列】sbt仓库目录配置和国内镜像配置

【Scala系列】sbt仓库目录配置和国内镜像配置

前置知识:sbt的依赖管理

sbt从1.3.0开始,使用Coursier作为默认的依赖管理实现,替换掉了之前的Ivy。不过,sbt中还是有一些功能需要用到Ivy,所以sbt也保留了切换回Ivy的开关,如下:

// 设置为false,就会切换到Ivy
ThisBuild / useCoursier := false

因此,本文配置仓库目录的前提是,读者的项目使用sbt版本高于1.3.0且配置文件build.sbt中没有显式配置使用Ivy。

至于sbt基于Ivy的配置,本文不作讨论。

文中所提及的"用户目录"表示系统为用户分配的目录,具体来说它在:

  • Linux发行版:/home/your-username(如果是root用户,那么是/root)

  • macOS:/Users/your-username

  • Windows:C:\Users\your-username

仓库目录配置

分为两个部分:Coursier的Cache目录配置;本地Maven仓库目录配置

需要注意的是,Coursier并不能直接配置maven本地仓库的目录实现与maven的完全共享(下载归档机制的区别所致),在官网文档中也着重强调了“避免直接使用”。因此在sbt项目中,我们只能分别给Coursier配置一个本地目录,以及给sbt指定一个maven本地仓库目录让它可以复用已有依赖包。

Coursier的Cache目录配置

Coursier的默认仓库目录在%LOCALAPPDATA%\Coursier\Cache\v1,要更改它,官网文档中介绍了如下几个方法:

  1. 在命令行中传入–cache选项,比如--cache D:\Coursier_repo。此方法并不常用,因为除了初学者第一次安装Scala运行时的时候官网推荐使用Coursier安装,一般很少直接用到Coursier的命令行工具cs了。

  2. 在sbt中,配置coursierCache。本文将重点提及这个方法。

  3. 在API调用的时候,传入cache参数以指定。这也很少用,做一般业务开发很少接触到Coursier API的调用。

  4. 如果上述都没有,则从COURSIER_CACHE的环境变量中加载指定目录

  5. 如果4也没有,则尝试使用coursier.cache的java property配置

  6. 如果5也没有,则采用默认路径:%LOCALAPPDATA%\Coursier\Cache\v1

上述第2点是我们将会采用的方法。在build.sbt中:

lazy val root = (project in file("."))
    .settings(
        name := "demo",
        // 这里配置Coursier的Cache目录
        csrCacheDirectory := file("D:\\develop\\coursier_cache"),
    )

本地Maven仓库目录配置

如果是经常使用maven或gradle做构建工具的工程师,电脑里一般已经有一个很庞大的本地maven仓库了,这个仓库在sbt中也是可以复用的,在build.sbt中配置:

lazy val root = (project in file("."))
    .settings(
        name := "demo",
        // resolvers中可以加入MavenCache实例,以配置本地maven仓库
        resolvers += MavenCache("local-maven-repo", file("D:\\develop\\maven_repository")),
    )

配置好以后,sbt就可以自动查找指定目录下的依赖包了,若符合引用条件,就不会调用Coursier下载而是直接引用本地已存在的依赖包。

国内镜像配置

Coursier默认使用maven central仓库作为镜像源,这个源对国内的工程师不太友好,我们可以通过修改项目中的build.sbt的配置来指定一个国内的源:

lazy val root = (project in file("."))
    .settings(
        name := "demo",
        // 指定国内源
        resolvers += "central" at "https://maven.aliyun.com/repository/public",
        // 屏蔽默认的maven central源
        externalResolvers := Resolver.combineDefaultResolvers(resolvers.value.toVector, mavenCentral = false)
    )

关于全局配置

上述两类配置都写在build.sbt中,是项目级别配置,并不能全局生效,如果每个项目都要配置一次,未免有点繁琐。而且如果使用诸如Idea之类的IDE来新建项目,则会在进入项目时自动执行依赖分析并下载一些依赖到默认路径,这未免不美。

查找官方文档后,我找到了全局配置的切入点:在用户目录的.sbt\1.0\global.sbt文件中(没有这个文件就新建一个),可以配置全局的属性,默认应用到所有项目中。

于是,我们可以将上述Cache目录配置放到global.sbt文件中:

// 引用本地maven仓库
resolvers := {
    val localMavenRepo = MavenCache("local-maven-repo", file("D:\\develop\\maven_repository"))
    localMavenRepo +: resolvers.value
}

// cache目录配置
csrCacheDirectory := file("D:\\develop\\coursier_cache")

[!TIP]

实际上这里可以配置任何SettingKey(build.sbt中的setting()里能写的内容)作为全局配置。

除了指定cache目录和maven仓库目录,我们也可以使用全局配置来默认使用国内源。

在用户目录的.sbt\repositories文件中(没有这个文件就新建一个),可以配置国内镜像源:

[repositories]
local
my-maven-repo: https://maven.aliyun.com/repository/public

配置完成后,项目sbt里的相关配置就可以删除了,全局的配置将会生效,重启sbt shell就可以应用最新内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值