Yarn 對(duì)你的代碼來說是一個(gè)包管理器, 你可以通過它使用全世界開發(fā)者的代碼, 或者分享自己的代碼。Yarn 做這些快捷、安全、可靠,所以你不用擔(dān)心什么。
通過Yarn你可以使用其他開發(fā)者針對(duì)不同問題的解決方案,使自己的開發(fā)過程更簡(jiǎn)單。 使用過程中遇到問題,你可以將其上報(bào)或者貢獻(xiàn)解決方案。一旦問題被修復(fù), Yarn會(huì)更新保持同步。
代碼通過 包(package) (或者稱為 模塊(module)) 的方式來共享。 一個(gè)包里包含所有需要共享的代碼,以及描述包信息的文件,稱為 package.json
。
與npm的區(qū)別
Yarn 是 Facebook, Google, Exponent 和 Tilde 開發(fā)的一款新的 JavaScript 包管理工具。它的目的是解決這些團(tuán)隊(duì)使用 npm 面臨的少數(shù)問題,即:
- 安裝的時(shí)候無(wú)法保證速度/一致性
- 安全問題,因?yàn)?npm 安裝時(shí)允許運(yùn)行代碼
npm 和 Yarn 都使用 package.json
來跟蹤項(xiàng)目的依賴,版本號(hào)并非一直準(zhǔn)確,因?yàn)槟憧梢远x版本號(hào)范圍,這樣你可以選擇一個(gè)主版本和次要版本的包,但讓 npm 安裝最新的補(bǔ)丁也許可以修改一些 bug。
理想狀態(tài)下使用語(yǔ)義化版本發(fā)布補(bǔ)丁不會(huì)包含大的變化,但不幸的是這必非真理。npm 的這種策略可能導(dǎo)致兩臺(tái)擁有相同 package.json
文件的機(jī)子安裝了不同版本的包,這可能導(dǎo)致一些錯(cuò)誤。
為了避免包版本的錯(cuò)誤匹配,一個(gè)確定的安裝版本被固定在一個(gè)鎖文件中。每次模塊被添加時(shí),Yarn 就會(huì)創(chuàng)建(或更新)yarn.lock
文件,這樣你就可以保證其它機(jī)子也安裝相同版本的包,同時(shí)包含了 package.json
中定義的一系列允許的版本。
在 npm 中同樣可以使用 npm shrinkwrap
命令來生成一個(gè)鎖文件,這樣在使用 npm install
時(shí)會(huì)在讀取 package.json
前先讀取這個(gè)文件,就像 Yarn 會(huì)先讀取yarn.lock
一樣。這里的區(qū)別是 Yarn 總會(huì)自動(dòng)更新 yarn.lock
,而 npm 需要你重新操作。
除了一些功能差異,Yarn 命令也存在一些區(qū)別。例如移除或修改了一些 npm 命令以及添加了幾個(gè)有趣的命令。
yarn global
不像 npm 添加 -g
或 --global
可以進(jìn)行全局安裝,Yarn 使用的是 global
前綴。不過與 npm 類似,項(xiàng)目依賴不推薦全局安裝。
global
前綴只能用于 yarn add
, yarn bin
, yarn ls
和 yarn remove
,除yarn add
外,這些命令都和 npm 等效。
yarn install
npm install
命令會(huì)根據(jù) package.json
安裝依賴以及允許你添加新的模塊;yarn install
僅會(huì)按 yarn.lock
或 package.json
里面的依賴順序來安裝模塊。
yarn add [–dev]
與 npm install
類似,yarn add
允許你添加與安裝模塊,就像命令的名稱一樣,添加依賴意味著也會(huì)算定將依賴寫入 package.json
,類似 npm 的 --save
參數(shù);Yarn 的 --dev
參數(shù)則是添加開發(fā)依賴,類似 npm 的 --save-dev
參數(shù)。
yarn licenses [ls|generate-disclaimer]
npm 沒有類似命令來方便編寫自己的包。yarn licenses ls
列出所有已安裝包的許可協(xié)議。yarn licenses generate-disclaimer
生成包含已安裝包許可協(xié)議的免責(zé)聲明。某些協(xié)議要求使用者必須在項(xiàng)目中包含該協(xié)議,這時(shí)候該命令將變得非常好用。
yarn why
該命令會(huì)查找依賴關(guān)系并找出為什么會(huì)將某些包安裝在你的項(xiàng)目中。也許你明確為什么添加,也許它只是你安裝包中的一個(gè)依賴,yarn why
可以幫你弄找出。
yarn upgrade
該命令會(huì)根據(jù)符合 package.json
設(shè)定的規(guī)則而不是 yarn.lock
定義的確切版本來將包更新到最新版本。如果想用 npm 來實(shí)現(xiàn)相同目的,可以這樣執(zhí)行:
Shell
1 | rm -rf node_modules |
---|---|
2 | npm install |
不要將該命令與 npm update
混淆,它指的是更新到自己的最新版。
yarn generate-lock-entry
yarn generate-lock-entry
會(huì)基于 package.json
設(shè)置的依賴生成 yarn.lock
文件,該命令與 npm shrinkwrap
類似,但應(yīng)該小心使用,因?yàn)橥ㄟ^ yarn add
和 yarn upgrade
命令添加或更新依賴時(shí)會(huì)自動(dòng)更新生成該鎖文件。
在這介紹兩種安裝方式:
安裝
1. npm工具安裝
npm install yarn -g
2. 官網(wǎng)安裝
使用
初始化一個(gè)新項(xiàng)目
相當(dāng)于npm的 npm init
yarn init
添加依賴包
相當(dāng)于npm的 npm install [packageName] --save
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
將依賴項(xiàng)添加到不同依賴項(xiàng)類別中
分別添加到 devDependencies
、peerDependencies
和 optionalDependencies
類別中:
yarn add [package] --dev 相當(dāng)于 npm install [package] --save-dev
yarn add [package] --peer
yarn add [package] --optional
dependencies: 正常的運(yùn)行過程中的依賴 瀏覽器跑的時(shí)候
devDependencies: 開發(fā)模式 所用的依賴
peerDependencies: 當(dāng)你發(fā)布項(xiàng)目的時(shí)候 可以指定該依賴
optionalDependencies: 可有可無(wú),表示在安裝失敗的時(shí)候一個(gè)備選的依賴保證過程
bundleDependencies: 發(fā)布項(xiàng)目的時(shí)候所用的依賴 不是從npm來的 一起打包發(fā)布到
升級(jí)依賴包
相當(dāng)于npm的 npm update
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]
移除依賴包
相當(dāng)于npm的 npm uninstall [package]
yarn remove [package]
安裝項(xiàng)目的全部依賴
相當(dāng)于npm的 npm i
或者 npm install
yarn
或者
yarn install
依賴和版本
在yarn中與npm中類似都有兩個(gè)依賴和版本文件
依賴項(xiàng)的類型 package.json
依賴項(xiàng)的指定版本 yarn.lock
yarn.cock
文件使機(jī)器之間獲得一致的安裝。
您package.json
將包含所有這些依賴項(xiàng):
{
"name": "my-project",
"dependencies": {
"package-a": "^1.0.0"
},
"devDependencies": {
"package-b": "^1.2.1"
},
"peerDependencies": {
"package-c": "^2.5.4"
},
"optionalDependencies": {
"package-d": "^3.1.0"
}
}
Yarn使用yarn.lock
項(xiàng)目根目錄中的文件。這些“鎖定文件”看起來像這樣:
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
package-1@^1.0.0:
version "1.0.3"
resolved "https://registry.npmjs.org/package-1/-/package-1-1.0.3.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"
package-2@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/package-2/-/package-2-2.0.1.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"
dependencies:
package-4 "^4.0.0"
package-3@^3.0.0:
version "3.1.9"
resolved "https://registry.npmjs.org/package-3/-/package-3-3.1.9.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"
dependencies:
package-4 "^4.5.0"
package-4@^4.0.0, package-4@^4.5.0:
version "4.6.3"
resolved "https://registry.npmjs.org/package-4/-/package-4-2.6.3.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"
yarn命令
常用命令
1. yarn add
yarn add //添加要在當(dāng)前包中使用的包。
2. yarn init
yarn init //初始化包的開發(fā)。
3. yarn install
yarn install //安裝package.json文件中定義的所有依賴項(xiàng)。
4. yarn publish
yarn publish //將包發(fā)布到包管理器。
5. yarn remove
yarn remove //從當(dāng)前包中刪除未使用的包。
自定義命令
運(yùn)行已定義的包腳本
您可以在 package.json
文件中定義要運(yùn)行的腳本命令
{
"name": "my-package",
"scripts": {
"build": "babel src -d lib",
"test": "jest"
}
}
yarn run [script] [<args>]
如果已在scripts
包中定義了一個(gè)對(duì)象,則此命令將運(yùn)行指定的對(duì)象[script]
。例如:
yarn run test
運(yùn)行此命令將執(zhí)行package.json
中您指定的腳本命令"test"
。
您可以通過在腳本名稱后面?zhèn)鬟f其他參數(shù)來將其傳遞給腳本。
yarn run test -o --watch
運(yùn)行此命令將執(zhí)行jest -o --watch
。
[script]
也可以是里面的任何本地安裝的可執(zhí)行文件node_modules/.bin/
。
也可以省略run
這個(gè)命令,每個(gè)腳本都可以用它的名字執(zhí)行:
yarn test -o --watch
運(yùn)行此命令將執(zhí)行相同的操作yarn run test -o --watch
。請(qǐng)注意,內(nèi)置cli命令將優(yōu)先于您的腳本,因此您不應(yīng)始終在其他腳本中依賴此快捷方式
yarn run env
運(yùn)行此命令將列出運(yùn)行時(shí)腳本可用的環(huán)境變量。
如果要覆蓋此命令,可以通過在其中定義自己的"env"
腳本來執(zhí)行此操作package.json
。
yarn run
如果未指定yarn run
命令的腳本,該run
命令將列出可用于運(yùn)行包的所有腳本。