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