快速摘要
成都地區(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"
兩者都包含一些重要的信息:
既然 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)。