背景

最近由于工作需要, 我总是在不同的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. 【Python】Java程序员学习Python(十一)— IO

    一.前言 io的内容其实还是有很多的,现在我也只是了解初步用法,当然详细内容还是应该参照官方api的: 官方api:https://docs.python.org/3/library/os.html. ...

  2. ES6入门——类的概念

    1.Class的基本用法 概述 JavaScript语言的传统方式是通过构造函数,定义并生成新对象.这种写法和传统的面向对象语言差异很大,下面是一个例子: function Point(x, y) { ...

  3. Executors相关的类(线程池)

    一.概述 Java是天生就支持并发的语言,支持并发意味着多线程,线程的频繁创建在高并发及大数据量是非常消耗资源的,因为java提供了线程池.在jdk1.5以前的版本中,线程池的使用是及其简陋的,但是在 ...

  4. Windows Pre-commit hook for comment length Subversion

    @echo off :: Stops commits that have empty log messages. @echo off setlocal rem Subversion sends thr ...

  5. 通过runtime获取对象相关信息

    通过runtime获取对象相关信息 在这里,本人给大家提供一个runtime关于NSObject的扩展,用来显示各种NSObject中的信息,这有助于你来分析类的组成:) 先准备以下类供测试: Mod ...

  6. Linux setenforce命令详解[SeLinux操作]

    SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统. 关闭SELinux 临时生效: 命令临时 ...

  7. Hadoop HBase概念学习系列之模式设计(十)

      Hbase与RDBMS的区别在于:HBase的Cell(每条数据记录中的数据项)是具有版本描述的(versioned),行是有序的,列(qualifier)在所属列簇(Column familie ...

  8. 三星平板SM-T320刷机

    三星 Galaxy Tab Pro 8.4 (SM-T320) / 国行 固件下载 刷机教程 下载手机驱动,刷机工具Odin,相应的固件包,手机和电脑用数据线连接安装好手机的驱动. 手机先完全的关机, ...

  9. Alpha 冲刺报告(3/10)

    Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:开始编写角色的移动脚本 明日计划:继续学习并进行脚本编写 剩余任务:物品背包交互代码 困难:如何把各个模块的脚本整合起来 --------- ...

  10. [转载并收藏]JavaScript 疲劳终极指南:我们行业的真相

    这篇文章说的深得我心,特别是前半段. 特此收藏. 中文译文:http://www.zcfy.cc/article/the-ultimate-guide-to-javascript-fatigue-re ...