package.json:
这个文件主要用于管理项目的元数据和依赖列表。文件中包含了项目名称、版本、描述、作者等信息,并且列出了项目所依赖的npm packages及其版本号。当你运行npm install命令时,npm会查看package.json文件,自动下载所需要的包并安装。
package-lock.json:
这个文件被npm用来锁定安装时的依赖的精确版本号。这样,当你的项目在不同的环境(例如,不同开发者的电脑,或者生产环境)中安装依赖时,可以确保都是相同版本,避免“在我电脑上可以运行,为什么在你那里就不行”的问题。package-lock.json文 件由npm install命令自动生成或更新。
举个例子,你在package.json里可以写"lodash": "^4.17.15"这样的版本号,符号"^"表示安装4.x系列的最新版本。此时,如果lodash有一个新的小版本4.18.0发布,那么当运行npm install命令时,可能会安装到这个新版本。但是,如果你有一个package-lock.json文件,且文件中记录的lodash版本为4.17.15,那么不论什么环境下,npm都会按照lock文件安装4.17.15版本的lodash,从而保证了版本的稳定一致性。
两个文件共同工作,确保了npm依赖的版本一致且易于管理。package.json通过指定包和符合要求的版本范围,而package-lock.json则锁定了具体的安装版本。
使用package-lock.json:的优势: 不需要项目每次安装时都需要重新解析依赖关系并下载,而无法利用到package-lock.json文件带来的性能优化和版本一致性保证。
在我们的构建中 提到项目构建失败的原因是缺少viewerjs依赖,也就是说项目有用到viewerjs依赖的地方,而该项目引入viewerjs依赖的方式是通过v-viewer引入
项目中"v-viewer": "^1.6.4" 的意思是
^1.6.4 : 这是一个semver(Semantic Versioning,语义化版本)范围。^的意思是允许安装1.6.4以上但小于2.0.0的最新版本。也就是说,可以自动下载并安装所有小更新(1.x.x)、补丁更新(1.6.x),但不包括大版本升级(如2.x.x),因为大版本更新可能会包含重大改动,有可能造成兼容性问题。
因此,"v-viewer": "^1.6.4" 的意思就是指定在项目中使用v-viewer这个包,并且使用的版本可以是1.6.4以上,但是小于2.0.0的任何版本。那么我们在npm install 的时候具体会下载哪个v-viewer版本依赖呢 ,因为没有指定v-viewer的具体版本,所以在npm install 的时候会下载最新的v-viewer版本的依赖 ,之前问题没有发生是因为直到npm官网里面的v-viewer的1.7.2版本之前viewerjs依赖都会作为v-viewer的Dependency 而1.7.2版本之之后官方更新了v-viewer依赖 viewerjs依赖不再作为v-viewer的Dependency (原因可能是:避免第三方依赖的限制:使用第三方库作为依赖可能会受到许可、维护和更新等方面的限制。通过将viewerjs集成到 v-viewer 中,可以减少对外部库的依赖,从而更好地控制项目的整体稳定性、安全性和可维护性。)导致viewerjs依赖没有被下载,构建失败。
解决方案:
- 项目在package.json文件明确写明需要哪个版本的依赖,比如说项目有用到viewerjs依赖 那就在文件中加入viewerjs": "^1.11.6" ,不要采用通过依赖去引入依赖的方式。或着是明确写明我要哪个版本的依赖 比如"v-viewer": "1.6.4 我只要1.6.4版本的v-viewer的依赖 因为这个版本依赖的 Dependency会用到viewerjs" 避免官网版本更新造成不可预知的问题。
- 加入package-lock.json文件,package-lock.json做代码版本更新和维护,Jenkins构建时通过这两个文件来确定要下载哪个版本依赖。