当开发者使用npm进行包含包的管理时,会有两个文件被生成: package.json和package-lock.json。这两个文件都用来描述项目中使用到的依赖库以及版本号等信息。但是,在实际开发中,它们所起到的作用却是有所区别的。
package.json的作用
package.json是一个标准的JSON格式的文件,它主要用于定义项目中所需的依赖库以及版本号等信息。其中主要包括以下内容:
- name: 项目名称
- version: 项目版本号
- description: 项目描述信息
- main: 项目的入口文件地址
- scripts: 可执行脚本
- dependencies: 项目依赖库
- devDependencies: 开发时依赖库
在一个项目的本地开发过程中,package.json文件是开发者手动书写的,并且往往需要频繁地更新。当开发者在执行npm install命令时,它会根据package.json文件中所定义的依赖库及其版本号信息来自动下载并安装依赖库。
例如,下面是一个简单的package.json文件示例:
{
"name": "my-project",
"version": "1.0.0",
"description": "A simple project.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"express": "^4.17.1",
"body-parser": "^1.19.0"
},
"devDependencies": {
"nodemon": "^2.0.9"
}
}
在这个示例中,我们定义了项目的名称、版本号、描述信息以及入口文件地址,同时包含了运行测试脚本、使用到的依赖库以及开发时依赖库等信息。当执行npm install命令时,它会检查当前目录下是否有package.json文件,如果有,就会根据其中的依赖库信息自动下载并安装。
package-lock.json的作用
虽然package.json文件中已经定义了依赖库的名称和版本号信息,但是在npm运行时,它并不是完全依赖于package.json文件。当我们执行npm install命令时,npm还会自动产生并更新package-lock.json文件,用于记录当前安装的依赖库的确切版本号信息,以保证项目能够在不同的环境中正确地运行。
package-lock.json文件主要包含以下信息:
- dependencies: 所有依赖库的确切版本号信息,用于保证安装时的稳定性
- packages: 所有已经下载并缓存的依赖库信息,用于加快安装速度
下面是一个简单的package-lock.json文件示例:
{
"name": "my-project",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaarkiSPOGJ6W+kzh7L1Oy503frVLyDvpsuMHAELr1O9sPSFmitObymaxbyA==",
"requires": {
"bytes": "3.1.0",
"debug": "2.6.9",
"depd": "1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "1.6.18"
}
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
"accepts": "1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "1.1.2",
"encodeurl": "1.0.2",
"escape-html": "1.0.3",
"etag": "1.8.1",
"finalhandler": "1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "1.1.2",
"on-finished": "2.3.0",
"parseurl": "1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "2.0.7",
"qs": "6.7.0",
"range-parser": "1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "1.5.0",
"type-is": "1.6.18",
"utils-merge": "1.0.1",
"vary": "1.1.2"
}
}
}
}
在这个示例中,我们可以看到,package-lock.json文件记录了已经下载的依赖库的确切版本号信息,以及所有依赖库之间的依赖关系。如果我们将这个项目同时部署在不同的开发环境中,例如本地环境和云服务器环境,那么根据package-lock.json文件中记录的确切版本号信息,npm就可以确保在不同的环境中安装的依赖库版本是一致的,从而保证项目的稳定性。
package.json与package-lock.json之间的关系
当我们使用npm安装依赖库时,它会同时检查项目根目录下是否存在package.json和package-lock.json这两个文件。如果两个文件都存在,npm会自动根据package-lock.json文件中记录的确切版本号信息来安装依赖库。如果package-lock.json文件不存在,则需要根据package.json文件中的依赖库信息在npm库中查找相应的版本号并自动安装。
同时,当我们在执行npm install命令时,npm会先检查package-lock.json文件中是否已经记录了所需的依赖库信息。如果已经存在,它就会在package-lock.json文件中查找相应的依赖库版本信息,并以此来安装依赖库。如果package-lock.json文件中没有相应的信息,它就会根据package.json文件中的依赖库信息来在npm库中查找相应的版本号并自动安装。因此,在开发过程中,我们通常只需要手动维护package.json文件,让npm自动维护package-lock.json文件即可。
示例如下
示例一
比如我在package.json中声明了依赖的版本为 "^1.0.0",表示可以接受任何 1.X.X 版本(除了 2.0.0+)。在安装时,NPM会按照这个规则,自动安装最新的 1.X.X 版本。那么package-lock.json文件会记录下来这个版本的确切信息,包括哪个版本,从哪里下载。
示例二
在一个项目中存在开发依赖和生产依赖,它们分别被放置于package.json文件中的 "devDependencies" 和 "dependencies" 属性。这两个依赖之间的唯一区别是,安装生产依赖时需要添加参数 --production, 安装源代码包时不需要。而其他一切都相同,包括repo,semver规则等等。因此单独维护两个package.lock.json文件也并不是一个好主意,因为您无法在两个文件之间进行区别。NPM 7+ 使用了较新的 package-lock.json v2 文件格式,可以轻松解决这一问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:package.json与package-lock.json的区别及详细解释 - Python技术站