欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年06月24日 09:05:18   作者:前端先鋒  
這篇文章主要介紹了什么時(shí)候不能在 Node.js 中使用 Lock Files,但是當(dāng)你在開發(fā)要發(fā)布到 npm 的包時(shí),應(yīng)避免使用這類 lock file 。下面我們來一起了解一下吧

快速摘要

如果你開發(fā)像 Web 服務(wù)器之類的程序,那么 lock file 是非常有用的。但是如果將庫(kù)或 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 范圍。對(duì)于 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,將使用它們代替模塊安裝。這對(duì)于持續(xù)集成(CI)等情況尤其有用。對(duì)于此這種場(chǎng)景,你可以針對(duì)相應(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 的庫(kù)時(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注冊(cè)表。運(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,請(qǐng)將以下內(nèi)容添加到項(xiàng)目中的 .gitignore 文件中:

yarn.lock
package-lock.json

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

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

package-lock=false

對(duì)于 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 注冊(cè)表中。
因此,通過將 npm shrinkwrap 添加到 npm 腳本作為 prepack 腳本甚至是 git commit hook,可以確保在你的開發(fā)環(huán)境中,與你的用戶和 CI 中使用相同版本的依賴項(xiàng)。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs入門教程五:連接數(shù)據(jù)庫(kù)的方法分析

    nodejs入門教程五:連接數(shù)據(jù)庫(kù)的方法分析

    這篇文章主要介紹了nodejs入門教程之連接數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了nodejs連接數(shù)據(jù)庫(kù)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • 玩轉(zhuǎn)Koa之核心原理分析

    玩轉(zhuǎn)Koa之核心原理分析

    這篇文章主要介紹了玩轉(zhuǎn)Koa之核心原理分析,本文從封裝創(chuàng)建應(yīng)用程序函數(shù)、擴(kuò)展res和req、中間件實(shí)現(xiàn)原理、異常處理的等這幾個(gè)方面來介紹,感興趣的可以了解一下
    2018-12-12
  • NodeJS中的命令行程序、工程目錄、NPM

    NodeJS中的命令行程序、工程目錄、NPM

    使用NodeJS編寫的東西,要么是一個(gè)包,要么是一個(gè)命令行程序,而前者最終也會(huì)用于開發(fā)后者,一般我們會(huì)同時(shí)提供命令行模式和API模式兩種使用方式,并且我們會(huì)借助三方包來編寫代碼,NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題
    2023-11-11
  • Node.js中http模塊和導(dǎo)出共享問題

    Node.js中http模塊和導(dǎo)出共享問題

    這篇文章主要介紹了Node.js中http模塊和導(dǎo)出共享,通過?http?模塊提供的?http.createServer()?方法,就能方便的把一臺(tái)普通的電腦,變成一臺(tái)?web?服務(wù)器,從而對(duì)外提供?web?資源服務(wù),本文給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • Nodejs?http模塊返回內(nèi)容中文亂碼問題及解決

    Nodejs?http模塊返回內(nèi)容中文亂碼問題及解決

    這篇文章主要介紹了Nodejs?http模塊返回內(nèi)容中文亂碼問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 從零開始學(xué)習(xí)Node.js

    從零開始學(xué)習(xí)Node.js

    這篇文章主要介紹了從零開始學(xué)習(xí)Node.js結(jié)合具體實(shí)例形式分析了使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • Node.js流管理利器Destroy包使用方法詳解

    Node.js流管理利器Destroy包使用方法詳解

    在 Node.js 中,流(Streams)是處理大量數(shù)據(jù)的高效方式,然而,流的不當(dāng)處理可能會(huì)引發(fā)資源泄露,本文將詳解如何使用 destroy 包,確保流被正確銷毀,需要的朋友可以參考下
    2024-05-05
  • Node.js安裝教程和NPM包管理器使用詳解

    Node.js安裝教程和NPM包管理器使用詳解

    這篇文章主要介紹了Node.js安裝教程和NPM包管理器使用詳解,安裝部分講解了Windows、和MAC OS下的安裝圖解,并介紹了Linux下的源碼安裝方法,最后對(duì)NPM包管理器做了詳細(xì)介紹,需要的朋友可以參考下
    2014-08-08
  • node.js中的fs.writeSync方法使用說明

    node.js中的fs.writeSync方法使用說明

    這篇文章主要介紹了node.js中的fs.writeSync方法使用說明,本文介紹了fs.writeSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js學(xué)習(xí)總結(jié)之調(diào)式代碼的方法

    node.js學(xué)習(xí)總結(jié)之調(diào)式代碼的方法

    調(diào)式代碼很多時(shí)候類似于查案一樣,只是結(jié)果的重要程度不同,警察查案為的是人民安穩(wěn),而我們調(diào)式則是為了系統(tǒng)的安穩(wěn)。既然這樣我們就不要冤枉任何一段代碼和程序,以免他們受到不合理的懲罰。
    2014-06-06

最新評(píng)論