深入體驗bash on windows,在windows上搭建原生的linux開發環境,酷!
今年微軟Build 2016大會最讓開發人員興奮的訊息之一,就是在Windows上可以原生執行Linux bash,對開發人員來說,這是一個喜聞樂見的訊息。
1 安裝
你必須安裝開發者預覽版本,才能使用windows的linux subsystem功能。
-
首先開啟你的Windows 10的設定,在"更新和安全"選項中(我的機器是英文作業系統,但中文作業系統類似),選擇"開發者",然後選擇"開發者模式":
-
在Windows 更新和安全選項中,選擇"Windows 更新",在"更新設定"中選擇高階選項,你必須開啟"內部預覽版本"選項,並且將內部預覽的級別設定為最快:
-
在"設定"->"系統"選項中,檢視當前系統資訊,你的OS版本必須是14316,如果不是這個版本,請執行線上升級,升級到這個版本:
-
升級完成後,開啟"控制面板"-》"程式",選擇"開啟或者關閉Windows特性",找到Windows Subsystem for Linux(beta)點選並確定,系統會下載更新並提示重啟機器:
-
重啟完成後,進入命令列程式,激動人心的時刻來臨了,在命令列下敲bash,會提示你是否繼續,選擇yes,系統會安裝Ubuntu檔案系統等待完成後,系統會切換到你熟悉的Linux bash模式,試試你熟悉的ls等命令:
-
開啟Windows選單,你會發現系統中多了一個Ubuntu的圖示,這個就是bash on Ubuntu on Windows:
-
簡單測試一下python,perl等語言,發現已經裝好了,當然,這個就是Ubuntu的bash,你可以安裝Java,Ruby等等:
下面來實際測試下ubuntu on windows環境!
2 系統檢測和更新
2.1 版本檢測
執行 uname -a
結果如下
webmaster@FEKETERIGO-PC:~$ uname -a
Linux FEKETERIGO -PC 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
webmaster@FEKETERIGO-PC:~$
執行 lsb_release -a
結果如下
webmaster@FEKETERIGO-PC:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: trusty
可以看到,安裝的是ubuntu 14.04 trusty
2.2 系統更新
既然是ubuntu,就可以使用apt-get進行軟體包管理。
首先替換自帶的更新源
sudo mv /etc/apt/sources.list /etc/apt/sources.list.save
把下面的阿里源內容貼上到 /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
你也可以使用163源等,選取原則是更新速度,目前測試的情況是阿里雲的源更新速度最快。
接著執行下面的命令進行系統更新,如果速度很慢的話請嘗試使用其他的源,另外ubuntu的源是版本相關的,注意別新增錯誤版本的源。
sudo apt-get update
sudo apt-get upgrade
使用sudo
命令之前可以執行 passwd
更新當前使用者的命令, bashonwindows預設執行在使用者模式,
windows會把當前使用者新增到sudoer
列表中,如果想切換到超級管理員,需要手動輸入su -
3 搭建開發環境
3.1 使用apt和ppa repository安裝git
ubuntu trusty預設的git版本是1.9.1
如果你不想使用git最新版本的話可以執行sudo apt-get install git
直接安裝
如果想安裝最新的git版本參考下面的命令
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
sudo add-apt-repository ppa:git-core/ppa
會在/etc/apt/sources.list.d
目錄下面生成一個
git-core-ppa-trusty.list
檔案,然後執行sudo apt-get update
的時候會從相應的倉庫裡面獲取新
的git版本資訊。
由於每個人的網路環境不一樣, 如果你更新失敗,使用apt-get不能安裝最新版本的git的話,請到github上面下載原始碼進行編譯安裝,過程也很簡單
這裡就不寫原始碼編譯教程了, git原始碼點選 這裡
3.2 使用pyenv搭建python開發環境
命令如下
sudo apt-get install curl
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
pyenv install 2.7.11
pyenv install 3.5.1
pyenv shell 3.5.1
python的2.x和3.x版本不相容,所有把兩個版本多安裝到本地,方便需要的時候進行版本切換,使用命令pyenv shell 2.7.11
指定當前的python版本。上面的命令指定的python版本是3
python的另一個有用的工具是virtualenv,它和pyenv都能實現python版本的切換,不過實現的方法卻大相徑庭。
pyenv在使用者模式下安裝多個版本python,但是每一個python版本的包依賴還是安裝的同一個位置,它不能解決兩個專案中引用
同一個庫有版本衝突,但是viertualenv可以。
virtualenv給每一個python專案安裝一個專案內部python,具體版本可以在初始化的時候指定,專案的依賴也是安裝在內部python的路徑下面,這樣能防止和系統上其他python專案的依賴衝突, 隔離性更高,不好的地方是安裝和使用略微複雜。
具體使用哪個工具看個人喜好,github上面pyenv的關注度要高點,而且現在pyenv有一個virtualenv外掛,可以使用後者同樣的功能,我個人還是推薦使用pyenv。
3.3 使用rvm安裝ruby
curl -L https://get.rvm.io | bash -s stable --autolibs=enabled --ruby
rvm install 2.3.1
bash --login
rvm use ruby-2.3.1
具體命令輸入rvm help
,很好掌握。
3.4 使用gvm安裝go語言
curl -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer | bash
gvm install go1.6
gvm use go1.6 --default
由於hugo是使用go語言開發的,趁著這個機會向學習一些這個由google開發的程式語言,本部落格就是使用
hugo搭建的,伺服器使用firebase,firebase提供和github pages一樣的免費靜態服
務器的功能,穩定性比github要好,github在國內的訪問速度實在不能再慢了,特別是在clone大一點的專案的時候。
go語言開發的程式有一個好處就是沒有執行時依賴,打包成exe就能直接執行,簡單方便,更多的內容以後再更新吧,這裡集中在開發環境搭建這個主題上面。
3.5 使用nvm安裝nodejs
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.0/install.sh | bash
nvm install v6.2.0
nvm use v6.2.0
node.js
可以說是從2015年以來最火的語言了,node.js是後端工程師轉向前端最好的工具,博主一起就是java後端開發工程師,偶然的機會
學習了node.js,然後開始了自己的前端工程師的進化之路,目標是全棧工程師。
node.js還有一個npm包n
可以用來進行版本管理,不過你需要先安裝一個node.js才能使用npm install -g n
安裝這個工具
n
和nvm
都很好用,你可以隨便選擇一個,也可以兩個都安裝,他們之間沒有衝突,可以共存。
這裡注意一下,如果你使用的是
windows build 14352
的話,使用nvm安裝nodejs可能會出現錯誤,詳情參見這裡
我安裝的時候是出現問題,但是又沒有看到其他人遇到這個問題,如果你安裝的windows預覽版是比14352更新的版本的話,你可以自己測試下
3.6 安裝gcc工具鏈
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev
wget curl llvm libncurses5-dev libncursesw5-dev
這些工具不僅僅是c和c++開發者才會用到,如果你開發一個node.js native模組,你也需要這些工具。
3.7 安裝nginx
sudo apt-get install python-software-properties sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx
和安裝git的時候一樣,這裡通過新增nginx的第三方repository,實現apt-get方式安裝nginx最新版本,比原始碼編譯安裝方式在管理上還是要方便一點。
3.8 使用shell安裝rust-lang
安裝命令,非常簡單
curl -sSf https://static.rust-lang.org/rustup.sh | sh
rust是和node.js一樣熱門的新星程式語言,不過和node.js不同,rust不是一款前端領域的程式語言,而是一款系統程式語言。
rust的有點是安全、高併發,吸收了大量現代高階程式語言的有點,極力避免現有程式語言的各種缺點,讓我印象最深刻的一個特性是
rust的垃圾回收機制,
最開始的時候rust也是使用類似java語言的garbage collector方式實現垃圾回收,後來受不了gc的執行時效能損耗,自己實現了一套更高效的垃圾回收機制,極大的提高的系統穩定性和效能。
而且在rust在1.0的時候已經實現了自舉(自己編譯自己),後面版本的rust都是使用rust自己編譯出來的,包括編譯器。
唯一不好的地方是rust語言為了最大程度的幫助開發人員避免犯錯誤,採用了極其複雜的語法,對於剛開始學習程式語言的人來說,不建議學習rust,因為rust的學習曲線非常陡峭,入門語言選擇c或者java都是不錯的。
4 最後總結
雖然這篇文章沒有講一些高深的內容(水平有限), 但是還是總結一些。
4.1 關於包管理
不管是作業系統,linux、mac、windows,還是程式語言,java、node.js、rust,流行的趨勢是自帶包管理工具,
linux 有apt,centos有yum,mac有brew,windows目前沒有,不排除以後不會有,win10應用商店已經有了,估計應用管理工具也不好很遠了吧,目前已經有一個第三方的10AppsManager了。
java沒有自帶的包管理工具,但是maven
,node.js有npm,rust有cargo。
使用包管理工具能幫助開發者解決很多的問題,例如版本管理,依賴管理,甚至軟體釋出都可以使用包管理工具來完成,node.jsd的包就是使用npm進行釋出的。
所以我覺得自帶包管理工具應該是以後程式語言的趨勢,這方面做得最差的是java,從make到ant到ivy再到maven再到gradle,java的包
管理是最複雜的,如果是心學習java的推薦學習gradle,gradle還能用來打包android專案,是目前最優秀的工具。
另外作業系統的包管理工具比程式語言又更悠久的歷史,幾乎每一個類linux作業系統都有自己的包管理工具。
4.2 版本管理
軟體版本管理
每一個軟體都會進行版本迭代,有時候進行版本更新的時候又會有broken update,為了方便實現版本切換,現在很多程式語言
都提供了版本管理工具(第三方的),所以我在想能不能把這個功能新增在程式語言上面,簡而言之就是程式語言能自帶一個版本管理
工具(就像自帶包管理工具一樣),這樣能更快的實現版本切換。
4.3 以開發人員為中心
隨著windows開始各種拉攏開發人員和軟體工程師隊伍的壯大,我認為以開發人員為中心的時代,廣大開發人員的春天就要到來了.