背景

最近由于工作需要, 我总是在不同的scala项目间流动开发. 这就遇到一个很棘手的问题, 这几个项目用的sbt版本不一致, 老项目用的是 sbt 0.13.15, 新项目用的是 sbt 1.0.2. 写scala项目最要命的可能就是高版本总是不兼容低版本.

一开始着急干活, 就很暴力的卸载了老版本, 安装需要的sbt版本. 但是当一天当中都需要处理两个项目的时候, 这种切换版本的方式就好浪费生命. 起初我是想自己写个shell来实现自动版本切换的, 但一想估计有人遇到过我这问题, 各种搜索后(我已然忘记了我是怎么搜的了), 发现了这个很好用的工具 sbtenv.

sbtenv 是什么

官网给了个定义: Groom your sbt environment.

本质sbtenv干的事情就像nvm, sbtenv能很轻松的切换sbt版本, 这样就可以不同的项目用不同版本的sbt, 同时本机上可以装多个版本的sbt.

sbtenv 安装

使用brew安装sbtenv很方便的, 具体步骤如下:

  1. 安装

    brew install sbtenv
  2. 添加 ~/.sbtenv/bin 到 $PATH

    echo 'export PATH="${HOME}/.sbtenv/bin:${PATH}"' >> ~/.bash_profile
  3. 添加 sbtenv init 到 shell

    echo 'eval "$(sbtenv init -)"' >> ~/.bash_profile
  4. 重启shell, 检验sbtenv是否安装成功

    type sbtenv
    sbtenv is a shell function from /Users/qyf404/.bash_profile

用sbtenv安装不同版本的sbt

光把sbtenv安装了, 还不能工作呢, 还需要安装你需要的sbt.

  1. 使用命令sbtenv install -l查询能安装的sbt版本

    $> sbtenv install -l
    All available versions:
    sbt-0.13.15
    sbt-0.13.16
    sbt-0.13.17
    sbt-0.13.2
    sbt-0.13.5
    sbt-0.13.6
    sbt-0.13.7
    sbt-0.13.8
    sbt-0.13.9
    sbt-1.0.0
    sbt-1.0.1
    sbt-1.0.2
    sbt-1.0.3
    sbt-1.0.4
    sbt-1.1.0
    sbt-1.1.1
  2. 安装指定版本的sbt

    $> sbtenv install sbt-0.13.17
  3. 检查是否安装成功, 使用命令sbtenv versions能查看本机安装的所有sbt版本.

    $> sbtenv versions
    system
    sbt-0.13.17

用sbtenv切换不同版本的sbt

  1. 当前工作目录切换sbt版本使用命令sbtenv local sbt-0.13.17. (切换后会在当前目录增加一个.sbt-version的文件来记录使用的sbt版本)

    $> sbtenv local sbt-0.13.17
  2. 检查是否切换成功使用命令sbtenv version.

    $> sbtenv version
    sbt-sbt-0.13.17 (set by /Users/yfqi/.sbt-version)

进阶

手动安装sbt

有时候sbtenv install -l里面没有我们要安装的sbt版本, 这时我们可以采取手动安装的方式.

  1. github上找到我们要安装的版本.

  2. 下载tgz的压缩包, 比如我下的是 sbt-1.1.6.tgz.

  3. 创建存放目录

    $> mkdir -p ~/.sbtenv/versions/sbt-1.1.6
  4. 将下载的压缩包移到创建好的目录里

    $> mv ~/Downloads/sbt-1.1.6.tgz ~/.sbtenv/versions/sbt-1.1.6
  5. 解压并删除压缩包 (解压后sbt命令的磁盘路径应该是/Users/qyf404/.sbtenv/versions/sbt-1.1.6/sbt/bin)

    $> cd ~/.sbtenv/versions/sbt-1.1.6
    $> tar xf sbt-1.1.6.tgz && rm -f *.tgz
    $> ls
    sbt
  6. 检查是否安装成功

    $> sbtenv versions
    system
    sbt-0.13.17
    sbt-1.1.6

设置全局sbt版本

使用sbtenv global sbt-1.1.6可以设置全局的sbt版本.

sbt版本设置优先级

sbt版本设置生效的优先级依次是:

项目的设置 > 当前目录的设置 > 全局的设置

  • 项目的设置在文件./project/build.properties中配置.

    sbt.version=0.13.15
    
    
  • 当前目录的设置在文件./.sbt-version中配置

    sbt-0.13.17
  • 全局的设置在文件~/.sbtenv/version中设置

    sbt-1.1.6

参考

sbtenv github

日期:2018-06-20 作者:辵鵵

学习sbtenv的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. C#.NET里面抽象类,接口,虚方法

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  2. 将jsonModel转化为文件

    将jsonModel转化为文件 这个类是我自己写着用的,用于将字典文件直接转换成Model的文件,省去你写无数Model中属性的代码: TransformDictionary.h 与 Transfor ...

  3. [UI] 精美UI界面欣赏[10]

    精美UI界面欣赏[10]

  4. [翻译] RDVTabBarController

    RDVTabBarController https://github.com/robbdimitrov/RDVTabBarController 效果: Supports iPad and iPhone ...

  5. (1)StringBuilder类和StringBuffer类 (2)日期相关的类 (3)集合框架 (4)List集合

    1.StringBuilder类和StringBuffer类(查手册会用即可)1.1 基本概念 由于String类描述的字符串内容无法更改,若程序中出现大量类似的字符串时需要申请独立的内存空间单独保存 ...

  6. Memorize and recite an important historical speech

    Memorize and recite an important historical speech memorize['memәraiz]v.[亦作memorise] 记住, 记忆 historic ...

  7. Memcached与Redis对比,Redis基础笔记回顾

    Memcached 1.为什么要把数据存入内存?快 2.Memcached和Redis的区别 (1)Memcached缓存.Redis数据库,Memcached不支持持久化到磁盘 (2)Redis提供 ...

  8. php实现动态随机验证码机制(CAPTCHA)

    php实现动态随机验证码机制 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Ap ...

  9. BZOJ 2330 糖果 差分约束求最小值

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2330 题目大意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果 ...

  10. 解决osx下 ssh: connect to host localhost port 22: Connection refused

    解决办法: 终端下执行:sudo  systmesetup -setremotelogin on