## 3\. 開發工具
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#java)Java
現在 OS X 都不會自帶 JDK 了,所以進行 Java 開發的話,需要下載 JDK。在 brew-cask 之前,我們需要從?[https://developer.apple.com/downloads/](https://developer.apple.com/downloads/)?或者 Oracle 網站上下載。還有更麻煩的--卸載 JDK 和升級 JDK。
JDK 安裝文件是 pkg 格式,卸載和`.app`不一樣,且沒有自動卸載方式。
而 brew-cask 提供了自動安裝和卸載功能,能夠自動從官網上下載并安裝 JDK 8。
```source-shell
brew cask install java
```
如果你需要安裝 JDK 7 或者 JDK 6,可以使用`homebrew-cask-versions`:
```source-shell
brew tap caskroom/versions
brew cask install java6
```
在 OS X 上,你可以同時安裝多個版本的 JDK。你可以通過命令`/usr/libexec/java_home -V`來查看安裝了哪幾個 JDK。
那問題來了,當你運行`java`或者 Java 程序時使用的是哪個 JDK 呢?在 OS X 下,`java`也就是`/usr/bin/java`在默認情況下指向的是已經安裝的最新版本。但是你可以設置環境變量`JAVA_HOME`來更改其指向:
```source-shell
$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
$ JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)
```
其中`JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home`可以用`JAVA_HOME=`/usr/libexec/java_home -v 1.6``這種更加通用的方式代替。
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#jenv)[jEnv](https://github.com/gcuisinier/jenv)
也可以使用 jEnv 來管理不同版本的 JDK,這個工具跟?[rbenv](https://github.com/macdao/ocds-guide-to-setting-up-mac#rbenv)?類似,通過當前目錄下的`.java-version`來決定使用哪個 JDK。jEnv 也可以用 brew 安裝。不過要使用 jEnv 要有幾個問題:
* 需要手動把`eval "$(jenv init -)"`加入 profile,沒有 Oh My Zsh 插件。這點是我非常反感的。
可以把`eval "$(jenv init -)"`加入`~/.zlogin`,這樣可以避免修改`~/.zshrc`。
* 需要手動添加 JDK,不會自動采集系統 JDK。跟 Ruby 不同,OS X 已經提供`/usr/libexec/java_home`工具來管理安裝的 JDK。
* 需要?`jenv rehash`。這個是跟 rbenv 學的。
所以我建議不要使用 jEnv。
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#%E6%B0%91%E9%97%B4%E4%BD%BF%E7%94%A8%E7%9A%84-java-%E7%89%88%E6%9C%AC%E5%88%87%E6%8D%A2%E6%96%B9%E6%B3%95)民間使用的 Java 版本切換方法
添加以下腳本到當前 shell 配置文件中:`~/.zprofile`或者`~/.bash_profile`。
```source-shell
function setjdk() {
export JAVA_HOME=`/usr/libexec/java_home -v $@`
}
```
這樣我們就可以通過輸入一條命令進行版本切換了:
```source-shell
setjdk 1.8
```
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#javaocd)Java[OCD]
作為一個強迫癥患者,每當我看到 Java 的錯誤寫法就想糾正過來。
當指編程語言時,Java 的正確寫法是首字母大寫,其余小寫。其他寫法比如`JAVA`、`java`都是不對的。
在其他一些地方會使用小寫的`java`:
* `java`命令
* 原文件`Main.java`
* 包名`java.lang`
只有在全大寫的標題里使用`JAVA`或者環境變量`JAVA_HOME`。
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#intellij-idea)IntelliJ IDEA
Java 開發必備工具 IntelliJ IDEA。可以安裝 Ultimate Edition:
```source-shell
brew cask install intellij-idea
```
也可以安裝開源免費的 Community Edition:
```source-shell
brew cask install intellij-idea-ce
```
IntelliJ IDEA 有幾套內建的快捷鍵方案(Keymap)。其中適用于 OS X 的有`Mac OS X`和`Mac OS X 10.5+`兩種。區別是:
* `Mac OS X`方案和其他平臺上的快捷鍵類似,
* 而`Mac OS X 10.5+`更加符合 OS X 常用的快捷鍵。
一個團隊使用不同的快捷鍵會嚴重影響效率。可以用`View | Quick Switch Scheme`(`? Back Quote`)快速切換 Keymap。
如果可以選擇的話,我建議使用`Mac OS X`方案。因為我經常遇到使用 Windows 的客戶,而 Windows 平臺上的快捷鍵和`Mac OS X`方案類似。
可以從 IDEA 的`Help > Default Keymap Reference`打開快捷鍵的參考手冊。不過從這里打開的是`Mac OS X 10.5+`方案的,而`Mac OS X`方案的可以從這里找到:[http://www.basrikahveci.com/static/ij_keymap_mac.pdf](http://www.basrikahveci.com/static/ij_keymap_mac.pdf)。
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#rbenv)[rbenv](https://github.com/sstephenson/rbenv)
人人都需要一個 Ruby 版本管理工具。rbenv 就是這樣一個輕量級工具,它可以通過 brew 安裝。
安裝:
```source-shell
brew install rbenv ruby-build
```
然后在`~/.zshrc`中加上`rbenv`插件。否則你需要手動添加`eval "$(rbenv init -)"`到`~/zshrc`或者`~/.zprofile`文件里。
有時候項目會依賴一些奇怪的版本號,比如`ruby-2.1.0`,這個時候你需要?[rbenv-aliases](https://github.com/tpope/rbenv-aliases)?幫忙:
```source-shell
brew install rbenv-aliases
```
替代品有 RVM、chruby。因為 RVM 不能通過 brew 安裝,并且安裝的時候會沒有節操的修改一堆文件,所以被我早早的棄用了。chruby 也是一個輕量級工具,而且可以完美的和 Oh My Zsh 集成在一起,我看到有些生產環境在用它。
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#ruby-%E5%B8%B8%E7%94%A8%E5%88%AB%E5%90%8D)Ruby 常用別名
幾乎所有 Ruby 開發人員都會把`bi`作為`bundle install`的別名。Oh My Zsh 提供`builder`插件,這個插件提供了一套別名,比如`bi`、`be`。同時還能讓你在運行一些常用 gem 的時候直接輸入`rspec`,不需要`be rspec`這樣了。具體包括哪些命令請參考[這里](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/bundler)。
Z shell 對于`[`和`]`符號有特殊的處理,所以在運行`rake task[parameter]`的時候會報錯,你需要改成`rake task\[parameter\]`或者`noglob rake task[parameter]`。然而 Oh My Zsh 已經看穿這一切,自帶的 rake 插件已經解決了這個問題:`brake task[parameter]`。
添加插件的時候注意把`rake`放到`bundler`后面,例如這樣:
~~~
plugins=(git z sublime history rbenv bundler rake)
~~~
### [](https://github.com/macdao/ocds-guide-to-setting-up-mac#node-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86)Node 版本管理
Node 的版本管理工具有很多,常用的會有以下幾個:
* [nodenv](https://github.com/nodenv/nodenv)
該工具是一個類似 rbenv 的工具,命令和其完全一樣,安裝和配置也一樣。
~~~
brew install nodenv
~~~
你需要手動添加以下配置到`~/.zshrc`或者`~/.zprofile`文件里。
```source-shell
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"
```
* [nvm](https://github.com/creationix/nvm)
該工具是一個類似 RVM 的工具,命令安裝方式也基本一樣,可以參考官方文檔。
* [n](https://github.com/tj/n)
一個簡單的工具,安裝方式類似 nvm,無需額外配置。具體參考官方文檔。
目前根據 GitHub Stars,這三個管理工具的排名依次是 nvm、n、nodenv。但是個人建議采用 nodenv,原因同 rbenv,尤其已經在使用 rbenv 的伙伴們會覺得 nodenv 更順手????。