官术网_书友最值得收藏!

0.1 配置開發(fā)環(huán)境

無論你按照圖P-2中的哪條路線來學(xué)習(xí)這本書,都必須先準(zhǔn)備好一套整潔的開發(fā)環(huán)境。本書后續(xù)的內(nèi)容都假設(shè)你已經(jīng)把這一節(jié)里所說的這套開發(fā)環(huán)境給準(zhǔn)備好了。

無論你打算用Go、JavaScript還是Python來學(xué)習(xí)TDD,都需要按照這一節(jié)所說的方法把開發(fā)環(huán)境配置好。

0.1.1 三種語言共用的配置

0.1.1.1 文件夾結(jié)構(gòu)

創(chuàng)建一個(gè)文件夾(也叫作目錄),用來存放我們在學(xué)習(xí)這本書的過程中所寫的全部源代碼。你要給這個(gè)文件夾起個(gè)清晰的名稱,讓你在接下來的幾星期里面,一看到這個(gè)名字,就知道它里面的東西是做什么用的。比方說,可以起名叫作tdd-project

在這個(gè)文件夾下面建立這樣一組子文件夾:

開始寫代碼之前就得將這些文件夾全都建好,即便你打算每次采用一種語言把這本書學(xué)三遍,也還是應(yīng)該先將這套結(jié)構(gòu)配置好。配置這樣一套文件夾結(jié)構(gòu)有下面幾個(gè)好處:

1.可以分開存放這三種語言的代碼,同時(shí)又讓它們彼此離得比較近。

2.能夠讓本書中的大多數(shù)命令都同時(shí)適用于這三種語言的代碼。

? 需要指定完整目錄名及文件名的命令除外,不過這樣的命令比較少。本節(jié)就有這樣一個(gè)例外的命令。

3.能夠把某些高級(jí)的功能(例如持續(xù)集成)同時(shí)運(yùn)用在這三種語言的代碼上。

4.與本書示例代碼庫(https://github.com/saleem/tdd-book-code)的文件夾結(jié)構(gòu)一致。這樣能夠讓你在逐漸擴(kuò)充代碼的過程中與代碼庫里的示例代碼相對照。

接下來的內(nèi)容會(huì)采用TDD Project Root(TDD項(xiàng)目根目錄)來指代這個(gè)包含所有源代碼的根文件夾,也就是剛才說的tdd-project文件夾。這個(gè)文件夾里面有三個(gè)子文件夾,分別是go、js與py,這三者的名稱本身就說明了各自存放的是哪種語言的代碼。

TDD Project Root用來指代包含本書全部源代碼的文件夾。它是go、js與py這三個(gè)文件夾的上級(jí)文件夾。

聲明一個(gè)叫作TDD_PROJECT_ROOT的環(huán)境變量,并把它的值設(shè)為TDD Project Root文件夾的全路徑名[1]。每次開啟shell環(huán)境之后,只要設(shè)置了這個(gè)變量,后續(xù)執(zhí)行的所有命令就都能夠正確地使用該變量的值來運(yùn)作(還有一種更好的辦法,就是把這條設(shè)置環(huán)境變量的命令寫在.bashrc文件之類的初始化腳本里面,這樣每次新開shell時(shí),都會(huì)自動(dòng)設(shè)置該變量)。

例如,在筆者的macOS操作系統(tǒng)上,設(shè)置TDD_PROJECT_ROOT環(huán)境變量所寫的全路徑就是/Users/saleemsiddiqui/code/github/saleem/tdd-project。

消除重復(fù)

每次啟動(dòng)shell時(shí),都需要定義TDD_PROJECT_ROOT環(huán)境變量。如果覺得麻煩,可以在適當(dāng)?shù)呐渲梦募凶龀鲈O(shè)置,這樣以后就無須重復(fù)定義了。具體如何設(shè)置取決于你所使用的操作系統(tǒng)及shell。本書使用的是Bash-like shell(類Bash shell),對于這種shell來說,環(huán)境變量可以在配置文件中定義,雖然細(xì)節(jié)或許有所區(qū)別,但總之是可以這樣做的。比方說,在大多數(shù)Linux系統(tǒng)(以及macOS系統(tǒng))上,都可以把export TDD_PROJECT_ROOT=...這條語句添加在home文件夾的.bashrc文件中(參見https://oreil.ly/SMmFc)。如果你是在Windows系統(tǒng)上使用Git BASH來執(zhí)行命令,那么可能需要使用.bash_profile文件(參見https://oreil.ly/pkgxg)。本章稍后就會(huì)講到Git BASH的用法。

總之,消除重復(fù)肯定是應(yīng)該的。你要設(shè)法通過適當(dāng)?shù)臋C(jī)制來可靠地定義一套環(huán)境變量,讓這套環(huán)境變量的值能夠穩(wěn)定地出現(xiàn)在你學(xué)習(xí)本書時(shí)所使用的各種shell之中。

0.1.1.2 文本編輯器或集成開發(fā)環(huán)境

我們需要一個(gè)文本編輯器來編輯源代碼文件。你還可以選用集成開發(fā)環(huán)境(Integrated Development Environment, IDE)來編輯源文件,這樣能夠讓你用同一個(gè)工具編輯、編譯并測試各種語言的代碼。具體選用哪種辦法可以根據(jù)你的喜好而定,你應(yīng)該選擇最適合自己的一種。

附錄A詳細(xì)描述了IDE。

0.1.1.3 shell

我們需要用一個(gè)shell(也就是一個(gè)命令行解釋器)來運(yùn)行測試、查看輸出信息并執(zhí)行其他任務(wù)。與IDE類似,選用哪種shell比較好,也是一個(gè)很容易在開發(fā)者之間引起激烈爭論的話題。這本書假設(shè)我們是采用Bash-like shell來輸入命令的。幾乎所有的類Unix操作系統(tǒng)以及macOS系統(tǒng),本身都已經(jīng)裝好了Bash shell。

在Windows操作系統(tǒng)上,可以使用名叫Git BASH的shell(參見https://gitforwindows.org/)。Windows 10的Windows Subsystem for Linux(WSL,參見https://oreil.ly/UZ0KU)提供了原生的Bash shell支持,而且還支持其他一些“Linux goodies”(Linux里的好東西)。這兩種方式,或者與之類似的其他方式,都可以考慮。當(dāng)然,你必須從這些方式之中選擇一種來運(yùn)行本書的示例代碼。

圖0-1顯示的是在一個(gè)Bash-like shell之中輸入命令后所看到的執(zhí)行結(jié)果。

圖0-1:為了學(xué)習(xí)本書中的代碼,我們需要使用一個(gè)Bash-like shell

0.1.1.4 git

第13章會(huì)介紹怎樣使用GitHub Actions做持續(xù)集成(Continuous Integration, CI)。為了學(xué)習(xí)那一章的內(nèi)容,你需要?jiǎng)?chuàng)建自己的GitHub項(xiàng)目并向其中push(推送)代碼。

Git是個(gè)開源的分布式版本控制系統(tǒng)。GitHub是一個(gè)協(xié)作式的互聯(lián)網(wǎng)托管平臺(tái),讓大家能夠在上面分享彼此的項(xiàng)目及其源代碼。

Git(https://git-scm.com)是一個(gè)免費(fèi)且開源的分布式版本控制系統(tǒng)。GitHub(https://www.github.com)是一個(gè)使用Git的代碼分享平臺(tái)。

為了做持續(xù)集成,我們現(xiàn)在需要先做一些準(zhǔn)備,另外一些準(zhǔn)備工作可以等到第13章再做。現(xiàn)在具體要做的就是把我們的開發(fā)環(huán)境納入Git版本控制系統(tǒng)之中。至于如何創(chuàng)建GitHub項(xiàng)目,到了第13章再說。

首先,下載并安裝Git版本控制系統(tǒng)(https://git-scm.com/downloads)。這個(gè)工具在macOS、Windows以及Linux/Unix系統(tǒng)上都能安裝。安裝完成之后,請?jiān)诮K端窗口(也就是shell窗口或命令提示符窗口)里輸入git--version命令并按回車(Enter)鍵。你應(yīng)該會(huì)看到Git的回應(yīng),如圖0-2所示。

圖0-2:在shell里輸入git--version命令并按回車鍵,以確認(rèn)Git安裝到位

接下來,我們要在TDD_PROJECT_ROOT之中創(chuàng)建一個(gè)新的Git項(xiàng)目。在shell窗口里輸入下列命令:

這條命令執(zhí)行完會(huì)輸出一段信息,告訴你它已經(jīng)把TDD_PROJECT_ROOT下面的.git文件夾初始化成了一個(gè)空白的Git repository(Git庫)。現(xiàn)在,TDD_PROJECT_ROOT目錄的結(jié)構(gòu)應(yīng)該變成了下面這個(gè)樣子:

.git文件夾是Git用來保存工作信息的地方。我們不需要修改它的內(nèi)容。

我們在后面幾章會(huì)編寫源代碼,而且會(huì)定期把這些代碼提交到Git庫中。我們通過Git CLI(Command Line Interface,命令行界面)來執(zhí)行該操作。

在本書后續(xù)的內(nèi)容里面,我們會(huì)頻繁地將修改之后的代碼提交到Git庫。本書采用這樣一個(gè)圖標(biāo)來強(qiáng)調(diào)這種操作:

0.1.2 Go

為了學(xué)習(xí)本書的內(nèi)容,我們需要安裝1.17版本的Go。各種操作系統(tǒng)都能安裝這個(gè)版本(https://golang.org/dl)。

為了檢查Go是否正確地安裝到位,你可以在shell里面輸入go version命令并按回車鍵。這會(huì)打印出已經(jīng)安裝的Go是什么版本,如圖0-3所示。

圖0-3:在shell中輸入go version命令并按回車鍵,以驗(yàn)證Go是否能夠正常運(yùn)作

我們還需要設(shè)置幾個(gè)與Go有關(guān)的環(huán)境變量:

1.名為GO111MODULE的環(huán)境變量應(yīng)設(shè)為on。

2.名為GOPATH的環(huán)境變量不應(yīng)把TDD_PROJECT_ROOT或其下任何目錄(例如go目錄)包含進(jìn)來。

在shell中執(zhí)行這樣兩條命令:

我們需要?jiǎng)?chuàng)建一個(gè)最基本的go.mod文件,以便開始撰寫代碼。請執(zhí)行下面這兩條命令來創(chuàng)建這份文件:

這樣會(huì)創(chuàng)建出一份名叫g(shù)o.mod的文件,該文件的內(nèi)容為:

從現(xiàn)在起,如果要在Go語言的環(huán)境下學(xué)習(xí)本書內(nèi)容,那么一定要先讓shell進(jìn)入TDD_PROJECT-ROOT里面的go文件夾。

要想學(xué)習(xí)本書的Go代碼,必須先進(jìn)入 $TDD_PROJECT_ROOT/go文件夾,然后再運(yùn)行Go命令。

簡單說說Go語言的包管理機(jī)制

Go語言的包管理機(jī)制正在發(fā)生劇烈變化。老式的方案是通過GOPATH環(huán)境變量來管理,這種方式正在逐漸讓位給新的方式,也就是通過go.mod文件來管理。這兩種管理方式基本上無法互相兼容。

剛才定義的那兩個(gè)環(huán)境變量和生成的那個(gè)極簡的go.mod文件,是為了確保Go語言所提供的那套工具能夠順利處理我們的源代碼,尤其是我們所創(chuàng)建的包。我們在第5章就要?jiǎng)?chuàng)建Go語言的包。

0.1.3 JavaScript

我們需要使用版本14(代號(hào)“Fermium”)或版本16的Node.js來學(xué)習(xí)本書。這兩種版本都可以在Node.js的網(wǎng)站中找到(參見https://nodejs.org/en/download),而且各種操作系統(tǒng)都能夠安裝。

為了確認(rèn)Node.js已經(jīng)正確安裝,請?jiān)趕hell里面輸入node-v命令并按回車鍵。這條命令應(yīng)該會(huì)打印出一行消息,告訴你Node.js的版本,如圖0-4所示。

圖0-4:在shell中輸入node-v命令并按回車鍵,以確認(rèn)Node.js能夠正常運(yùn)作

0.1.3.1 簡單說說Node.js的測試庫

Node.js環(huán)境里面有許多測試框架。一般來說,這些框架都很適合用來編寫測試并執(zhí)行測試驅(qū)動(dòng)開發(fā)。然而本書不打算使用這些框架,而是要用一個(gè)名叫assert的NPM包來做斷言,并通過一個(gè)帶有方法的簡單類來整理我們所寫的測試。這樣可以讓我們把重點(diǎn)放在TDD的做法和語義上,而不會(huì)陷入某個(gè)庫的語法細(xì)節(jié)。第6章會(huì)更詳細(xì)地討論測試。附錄B會(huì)列舉幾個(gè)測試框架,并解釋筆者為什么不打算使用其中任何一個(gè)框架。

0.1.3.2 簡單說說JavaScript語言的包管理機(jī)制

跟測試框架類似,在JavaScript語言中定義包與依賴關(guān)系也有許多辦法。本書用的是CommonJS方式。第6章會(huì)討論其他三種管理包的辦法,前兩種是ES6與UMD,筆者會(huì)結(jié)合代碼對它們進(jìn)行詳細(xì)解釋,第三種是AMD,筆者會(huì)簡略地介紹這種包管理機(jī)制,而不會(huì)輔以代碼。

0.1.4 Python

我們需要使用3.10版本的Python學(xué)習(xí)本書,這個(gè)版本可以從Python網(wǎng)站下載(參見https://oreil.ly/xNLPa),各種操作系統(tǒng)都能安裝。

Python語言在Python 2與Python 3之間發(fā)生了很大變化。用舊一些的Python 3(例如3.6版本)來學(xué)習(xí)這本書的內(nèi)容或許沒有太大問題,但用Python 2來學(xué)則不合適。

你的計(jì)算機(jī)上可能已經(jīng)安裝了Python 2。比方說,許多macOS操作系統(tǒng)(也包括版本號(hào)是11的Big Sur系統(tǒng))都自帶Python 2。你沒有必要(而且也不建議你)專門為了學(xué)習(xí)本書而卸載Python 2。你只需要確保在學(xué)習(xí)本書的時(shí)候使用的是Python 3。

為了消除誤解,本書明確使用python3來指代這個(gè)啟動(dòng)Python 3編程環(huán)境時(shí)所用的可執(zhí)行文件。雖然你也可以設(shè)法讓python命令成為python3的別名或別稱(alias),也就是讓自己總是可以通過輸入python來啟動(dòng)Python 3,但這同樣沒什么必要。

下面有一種簡單的辦法可以判斷到底應(yīng)該如何啟動(dòng)Python 3。請?jiān)趕hell里面輸入python--version命令并按回車鍵。如果你看到啟動(dòng)的是Python 3,那意味著以后只要直接輸入python就行。如果你看到的是Python 2,那意味著你在執(zhí)行本書所提到的各種Python命令時(shí),必須明確輸入python3。

圖0-5演示了一個(gè)既裝有Python 2又裝有Python 3的開發(fā)環(huán)境。

圖0-5:確認(rèn)本機(jī)是否已經(jīng)安裝Python 3,并了解自己應(yīng)該通過哪個(gè)命令啟動(dòng)Python 3(圖中所示的情況,意味著必須明確通過python3命令而非默認(rèn)的python命令來啟動(dòng)Python 3)

應(yīng)該用Python 3學(xué)習(xí)本書的代碼,不要使用Python 2,因?yàn)檫@些代碼無法在Python 2里運(yùn)行。

圖0-6能夠幫你很快地記住剛才那幾段話所說的意思。

圖0-6:這張圖會(huì)讓你很快就記住本書需要的是哪一個(gè)版本的Python

主站蜘蛛池模板: 阿拉善左旗| 威远县| 吉木萨尔县| 永安市| 扶余县| 马公市| 蒙城县| 游戏| 霍林郭勒市| 云阳县| 高雄县| 信阳市| 麻城市| 社旗县| 莱西市| 马鞍山市| 梧州市| 噶尔县| 乌什县| 通河县| 江永县| 东海县| 普宁市| 林西县| 邮箱| 栖霞市| 福建省| 瑞昌市| 历史| 云林县| 福州市| 永城市| 罗平县| 阜宁县| 巴林左旗| 保德县| 灵寿县| 共和县| 永吉县| 肇庆市| 漳浦县|