Yarn,Facebook開源一個新的Javascript包管理工具。
node
Yarn 是一個新的包管理器,用於替代現有的 npm 客戶端或者其餘兼容 npm 倉庫的包管理工具。Yarn 保留了現有工做流的特性,優勢是更快、更安全、更可靠。linux
任何包管理器的主要功能都是安裝某些軟件包,軟件包即用於特定功能的某段代碼,一般是從一個全局的倉庫安裝到工程師的本地環境。每一個軟件包能夠依賴於其餘包,也能夠不依賴。一個典型的項目結構的依賴樹一般會包含數十個、數百個甚至上千個軟件包。算法
這些依賴包一般是帶版本號的,經過語義化版本控制(semver)安裝。Semver 定義的版本號反映了每一個新版本更改的類型,究竟是進行了不兼容的API改動(MAJOR),仍是添加了向後兼容的新特性(MINOR),仍是進行了向後兼容的 bug 修復(PATCH)。然而,semver 依賴於軟件包的開發者不能犯錯誤——若是依賴關係沒有加鎖,可能會引入一些破壞性更改或者產生新的 bug。npm
在 Node 生態系統中,依賴一般安裝在項目的 node_modules 文件夾中。然而,這個文件的結構和實際依賴樹可能有所區別,由於重複的依賴能夠合併到一塊兒。npm 客戶端把依賴安裝到 node_modules目錄的過程具備不肯定性。這意味着當依賴的安裝順序不一樣時,node_modules 目錄的結構可能會發生變化。這種差別可能會致使相似「個人機子上能夠運行,別的機子不行」的狀況,而且一般要花費大量時間定位與解決。json
Yarn 經過 lockfiles 文件以及一個肯定性的、可靠的安裝算法,解決了版本問題和 npm 的不肯定性問題。Lockfile 文件把安裝的軟件包版本鎖定在某個特定版本,並保證 node_modules 目錄在全部機器上的安裝結果都是相同的。Lockfile 還使用簡潔的有序鍵名的格式,保證了每次的文件變化最小化,進行代碼審查也更爲簡單。
安裝過程分爲如下三個步驟:緩存
處理: Yarn 經過向代碼倉庫發送請求,並遞歸查找每一個依賴項,從而解決依賴關係。安全
抓取: 接下來,Yarn 會查找全局的緩存目錄,檢查所需的軟件包是否已被下載。若是沒有,Yarn 會抓取對應的壓縮包,並放置在全局的緩存目錄中,所以 Yarn 支持離線安裝,同一個安裝包不須要下載屢次。依賴也能夠經過 tarball 的壓縮形式放置在源碼控制系統中,以支持完整的離線安裝。工具
生成: 最後,Yarn 從全局緩存中把須要用到的全部文件複製到本地的 node_modules 目錄中。fetch
經過清晰地細分這些步驟,以及肯定性的算法支持,使得 Yarn 支持並行操做,從而最大化地利用資源,並加速安裝進程。在一些 Facebook 的項目上,Yarn 甚至能夠把安裝過程下降一個數量級,從幾分鐘到只需幾秒鐘。Yarn 還使用了互斥鎖,以確保多個 CLI 實例同時運行時不會互相沖突與影響。版本控制
縱觀整個過程,Yarn 對於軟件包安裝加上了嚴格的限制。你能夠對哪一個生命週期腳本做用於哪一個軟件包進行控制。軟件包的 checksum 也會存儲在 lockfile 中,以確保每一次安裝均可以獲得同一個包。
Yarn 除了讓安裝過程變得更快與更可靠,還添加了一些額外的特性,從而進一步簡化依賴管理的工做流。
同時兼容 npm 與 bower 工做流,並支持兩種軟件倉庫混合使用
能夠限制已安裝模塊的協議,並提供方法輸出協議信息
提供一套穩定的公有 JS API,用於記錄構建工具的輸出信息
可讀、最小化、美觀的 CLI 輸出信息
sudo apt-key adv --fetch-keys http://dl.yarnpkg.com/debian/pubkey.gpg echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
yarn --version
yarn CLI 代替了原有開發工做流中 npm CLI 的做用,用法多是單純的替代,也多是一個新的、類似的命令: