真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么時(shí)候不能在Node.js中使用LockFiles

快速摘要

成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)公司).為客戶提供專業(yè)的成都西云數(shù)據(jù)中心,四川各地服務(wù)器托管,成都西云數(shù)據(jù)中心、多線服務(wù)器托管.托管咨詢專線:13518219792

如果你開發(fā)像 Web 服務(wù)器之類的程序,那么 lock file 是非常有用的。但是如果將庫或 CLI 發(fā)布到 npm,則永遠(yuǎn)不要發(fā)布 lock file。因?yàn)槿绻闶褂盟?,則意味著你和你的用戶可能在使用不同版本的依賴項(xiàng)。

什么是Lock File?

lock file 描述了整個(gè)依賴關(guān)系樹,它在創(chuàng)建時(shí)被解析,包括具有特定版本的嵌套依賴關(guān)系。在 npm 名為 package-lock.json ,在 yarn 中名為 yarn.lock。在這兩個(gè)npm和yarn它們被放置旁邊你的package.json。
package-lock.json 的內(nèi)容應(yīng)該是這樣:

{
"name": "lockfile-demo",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
}
}
}

yarn.lock 的格式不同,但也包含類似的信息:

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1

ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"

兩者都包含一些重要的信息:

  • 安裝的每個(gè)依賴項(xiàng)的實(shí)際版本
  • 每個(gè)依賴項(xiàng)的依賴項(xiàng)
  • 已解決的軟件包中用校驗(yàn)和驗(yàn)證軟件包的完整性

既然 lock file 中已經(jīng)列出了所有的依賴項(xiàng),拿為什么還要將它們寫在 package.json 中呢?為什么我們需要兩個(gè)文件?

package.json vs. Lock File

package.json 中 dependencies 字段顯示你的項(xiàng)目應(yīng)該安裝的依賴項(xiàng),但不顯示這些依賴項(xiàng)的依賴項(xiàng)。依賴項(xiàng)可以指定精確版本或 semver 范圍。對于 semver 范圍,npm 或 yarn 將h會(huì)選擇最適合的版本。

這意味著,如果在發(fā)布新版本時(shí)多次運(yùn)行 npm install ,有可能會(huì)得到相同版本的依賴項(xiàng)。例如用 npm install twilio 安裝 twilio 這樣的依賴項(xiàng),那么 package.json 中的依賴項(xiàng)可能會(huì)存在類似于這樣的條目:

{
"dependencies": {
"twilio": "^3.30.3"
}
}

如果你查閱 npm 網(wǎng)站上的 semver 文檔,就會(huì)看到 ^ 意味著任何大于 3.30.3 的版本和小于 4.0.0 都是有效版本。因此,如果在發(fā)布新版本時(shí)你沒有鎖定文件,npm install 或 yarn install 會(huì)自動(dòng)安裝一個(gè),你的 package.json 將不會(huì)被更新。但是 lock file 的內(nèi)容會(huì)有所不同。

如果 npm 或 yarn 找到它們各自的 lock file,將使用它們代替模塊安裝。這對于持續(xù)集成(CI)等情況尤其有用。對于此這種場景,你可以針對相應(yīng)的包管理器使用特殊命令或標(biāo)志:

npm ci # will install exactly what's in the package-lock.json
yarn install --frozen-lock-file # will install exactly what's in yarn.lock without updating it

當(dāng)你在構(gòu)建 Web 程序或服務(wù)器之類的應(yīng)用時(shí),這非常有用,因?yàn)槲覀兿M?CI 環(huán)境中模擬用戶的行為。因此,如果在源代碼控制(如 git)中跟蹤我們的 lock file,就可以確保每個(gè)開發(fā)人員以及服務(wù)器或構(gòu)建系統(tǒng)還有 CI 系統(tǒng)都能夠使用相同版本的依賴項(xiàng)。

那么當(dāng)我們編寫要發(fā)布到 npm 的庫時(shí),為什么不能做同樣的事呢?要回答這個(gè)問題,首先要討論發(fā)布的工作原理。

如何發(fā)布模塊

與某些人想的相反,你發(fā)布到 npm 的內(nèi)容并不總是與 GitHub 上或項(xiàng)目中的內(nèi)容完全相同。發(fā)布模塊的方式是 npm 將通過檢查 package.json 和 .npmignore 文件中的 files 鍵或者如果沒有``來確定應(yīng)該發(fā)布的文件。 gitignore文件。還有一些文件總是包含在內(nèi),有些文件將永遠(yuǎn)被排除在外。你可以在 [npm page](https://docs.npmjs.com/files/package.json#files) 上找到這些文件的完整列表。例如,.git` 目錄始終會(huì)被忽略。

之后 npm 將會(huì)獲取文件列表,并用 npm pack 將它們一起打包成 tarball。如果要查看打包的文件,可以在項(xiàng)目中運(yùn)行 npm pack --dry-run,能看到包含所有文件的輸出。

那個(gè) tarball 將被上傳到 npm注冊表。運(yùn)行此命令時(shí)你可能會(huì)注意到加入你已經(jīng)有了一個(gè) package-lock.json,它實(shí)際上沒有被捆綁。這是因?yàn)?package-lock.json 將始終被忽略。

這意味著如果另一個(gè)開發(fā)人員安裝了你發(fā)布的軟件包,他們永遠(yuǎn)不會(huì)下載你的 package-lock.json,因此在安裝過程中將會(huì)完全忽略它。

這可能會(huì)導(dǎo)致“在我的機(jī)器上能夠工作”的意外,因?yàn)槟愕?CI 和開發(fā)環(huán)境可能會(huì)選擇不同的依賴項(xiàng)版本。那么我們可以做些什么呢?

禁用 lock file 并收縮包裝

首先,應(yīng)該停止跟蹤我們的 lock file。如果你用的是git,請將以下內(nèi)容添加到項(xiàng)目中的 .gitignore 文件中:

yarn.lock
package-lock.json

Yarn 的文檔說即使你創(chuàng)建了庫,也應(yīng)該簽入 yarn.lock,但是如果你想確保自己能夠保證與用戶相同的體驗(yàn),我建議將其添加到 .gitignore。

你可以通過在項(xiàng)目里的 .npmrc 文件中添加以下內(nèi)容來關(guān)閉 package-lock.json 文件的生成:

package-lock=false

對于 yarn,你可以通過添加 yarn install --no-lockfile 標(biāo)志保證不生成 lock file。

擺脫了 package-lock.json 并不意味著無法固定我們所擁有的依賴關(guān)系和子依賴關(guān)系。我們可以用另一個(gè)名為 npm-shrinkwrap.json 的文件。

它與 package-lock.json 基本相同,并由 npm shrinkwrap 生成并實(shí)際的打包并發(fā)布到 npm 注冊表中。
因此,通過將 npm shrinkwrap 添加到 npm 腳本作為 prepack 腳本甚至是 git commit hook,可以確保在你的開發(fā)環(huán)境中,與你的用戶和 CI 中使用相同版本的依賴項(xiàng)。

**一個(gè)重要的提示:**通過使用 shrinkwrap 文件,你可以確定精確的版本,但它也會(huì)阻止人們獲得自動(dòng)安裝的關(guān)鍵補(bǔ)丁程序。 npm 強(qiáng)烈反對庫的 shrinkwrap 的用例。

了解更多信息

不幸的是,雖然 npm docs 中有很多相關(guān)內(nèi)容,但有時(shí)很難找到你想要的東西。如果你想更好地了解安裝或打包的內(nèi)容,那么你一個(gè)常見標(biāo)志就是 --dry-run。運(yùn)行該命令而不會(huì)影響你的系統(tǒng)。

例如 npm install --dry-run 并不會(huì)將依賴項(xiàng)安裝到你的文件系統(tǒng),或者 npm publish --dry-run 實(shí)際上也不會(huì)發(fā)布該包。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


本文題目:什么時(shí)候不能在Node.js中使用LockFiles
網(wǎng)站網(wǎng)址:http://weahome.cn/article/ijppis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部