首页 > 其他分享 >技术文档丨 OpenSCA技术原理之npm依赖解析

技术文档丨 OpenSCA技术原理之npm依赖解析

时间:2023-04-19 10:11:33浏览次数:76  
标签:npm 依赖 package OpenSCA json 文档 版本 组件

本文主要介绍基于npm包管理器的组件成分解析原理。

npm介绍

npm(全称Node Package Manager)是Node.js标准的软件包管理器。

npm的依赖管理文件是package.json,开发者可以在package.json中指定每个依赖项的版本范围。

如果一个项目中存在package.json文件,便可以执行npm install命令自动安装和维护当前项目所需的所有模块并生成package-lock.json文件。

package.json完整文件结构如下:

{
  "name": "screeps",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "push": "rollup -cw --environment DEST:main",
    "build": "rollup -cw --environment DEST:local",
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@rollup/plugin-commonjs": "^21.0.1",
    "@rollup/plugin-node-resolve": "^13.1.1",
    "@types/lodash": "^3.10.1",
    "@types/screeps": "^3.2.4",
    "rollup": "^2.61.1",
    "rollup-plugin-clear": "^2.0.7",
    "rollup-plugin-copy": "^3.4.0",
    "rollup-plugin-screeps": "^1.0.1",
    "rollup-plugin-typescript2": "^0.31.1",
    "typescript": "^4.5.4"
  },
  "dependencies": {
    "source-map": "^0.6.1"
  }
}
其中name为项目名,version为项目版本,license为项目声明的许可证,devDependencies为开发环境使用的依赖,dependencies为生产环境使用的依赖。

依赖写法为"name":"version",版本可以指定准确版本或一个范围,范围需遵循semver语义化版本规范(详见:https://semver.org/)。

解析算法

package-lock.json

package-lock.json是在npm install时自动生成的文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号,通过该文件可以准确定位到npm项目的依赖及版本。所以优先解析package-lock.json文件。

package-lock.json文件结构如下:

{
  "name": "foo",
  "version": "1.0.0",
  "dependencies": {
    "b": {
      "version": "1.2.1"
    },
    "a": {
      "version": "2.1.5",
      "requires": {
        "b": "^1.1.9"
      }
    },
    "c": {
      "version": "1.3.1",
      "requires": {
        "b": "^1.2.0"
      }
    }
  }
}
其中name字段为项目名称,version字段为项目版本。dependencies字段中包含项目使用的所有直接和间接依赖,而且记录了组件间的依赖关系。

例如:

"b": {
  "version": "1.2.1"
},
代表组件b的版本号为1.2.1。
"a": {
  "version": "2.1.5",
  "requires": {
    "b": "^1.1.9"
  }
},
代表项目依赖2.1.5版本的组件a,该组件依赖版本约束为^1.1.9的组件b。

同理可知项目依赖1.3.1版本的组件c,该组件依赖版本约束为^1.2.0的组件b。

<package-lock.json文件结构>可看出组件a和组件c都没有被其他组件所依赖,所以可知这两个组件是项目的直接依赖。

仅通过package-lock.json无法确定组件b是否是直接依赖,可以结合package.json文件进一步确定,没有package.json时,将b当作间接依赖处理。若一个组件同时为直接和间接依赖,按直接依赖处理。

注:

  • ^1.1.9代表版本号需要>=1.1.9且<2.0.0;
  • ^1.2.0代表版本号需要>=1.2.0且<2.0.0;
  • 更多约束格式请参阅semver官网

由此可以构建出当前项目的依赖结构:

实线代表直接依赖,虚线代表间接依赖。

package.json

package.json为开发者编写管理的依赖管理文件,在未找到package-lock.json文件时将解析该文件。

package.json仅包含直接依赖,在项目构建时会从npm仓库下载需要的间接依赖并构建为package-lock.json文件,因此可以模拟npm构建流程来获取项目引用的组件依赖。

package.json文件结构如下:

{
  "name": "foo",
  "version": "1.0.0",
  "devDependencies": {
    "a": "^2.0.0"
  },
  "dependencies": {
    "c": "^1.1.0"
  }
}
dependencies为项目实际使用的直接依赖,devDependencies为项目开发时使用的直接依赖。

例如:

"devDependencies": {
  "a": "^2.0.0"
}
代表项目开发过程中依赖版本约束为^2.0.0的组件a。
"dependencies": {
  "c": "^1.1.0"
}
代表项目直接依赖版本约束为^1.1.0组件c。

分析到这里我们可以总结出如下图依赖关系:

通过该依赖关系可以看出项目组件的直接依赖及组件的版本范围,但无法得知组件依赖的具体版本。

在没有package-lock.json文件的情况下,为了进一步获取依赖的准确版本及间接依赖,需要从npm仓库下载对应组件的详细信息。

例如组件a的详细信息结构为:

{
  "time": {
    "2.1.5": "2011-02-16T22:31:02.088Z",
    "3.1.1": "2011-04-10T12:23:22.088Z"
  },
  "versions": {
    "2.1.5": {
      "dependencies": {
        "b": "^1.1.9"
      }
    },
    "3.1.1": {
      "dependencies": {
        "b": "^2.2.0"
      }
    }
  }
}
其中time字段为组件所有版本及发布日期,根据约束从这里获取约束范围内的最大版本。

versions字段为组件各个版本对应的详细信息,其中dependencies字段为组件的依赖信息。

对于本例来说,组件a的约束为^2.0.0,要求版本号>=2.0.0且<3.0.0,所以选择2.1.5版本。因此组件依赖结构就变成了:

按照这种方式层级解析便可获取整个项目的依赖信息。


OpenSCA已在GitHub和Gitee开源,欢迎Star和PR,成为我们的开源贡献者,也可提交问题或建议至Issues。我们会参考大家的建议不断完善OpenSCA开源项目,敬请期待更多功能的支持。

GitHub: https://github.com/XmirrorSecurity/OpenSCA-cli/releases

Gitee: https://gitee.com/XmirrorSecurity/OpenSCA-cli/releases

OpenSCA官网: https://opensca.xmirror.cn/

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 [email protected] 删除。

   

标签:npm,依赖,package,OpenSCA,json,文档,版本,组件
From: https://www.cnblogs.com/openscacommunity/p/17332295.html

相关文章

  • ROS2 学习记录文档
    ros2的安装(humbleversion)1.换源2.过程sudoaptupdate&&sudoaptinstalllocalessudolocale-genen_USen_US.UTF-8sudoupdate-localeLC_ALL=en_US.UTF-8LANG=en_US.UTF-8exportLANG=en_US.UTF-8sudoaptinstallcurlgnupglsb-releasesudocurl......
  • docker官方文档解读
    官网:https://docs.docker.com/get-started/overview/1Dockeroverview2开始2.1创建镜像并启动这里我们以一个nodejs用于为例,说明容器化应用程序过程首先克隆这个应用程序源码 gitclonehttps://github.com/docker/getting-started.git 然后,创建一个Dockerfile文件[......
  • Apple iWork(Pages、Numbers、Keynote)13.0 - 文档、电子表格、演示文稿
    请访问原文链接:https://sysin.org/blog/apple-iwork-13/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org苹果今天将其专为iOS和macOS设备设计的iWork应用套件更新为版本12(sysin),引入了许多新功能和改进功能。文档、电子表格、演示文稿,尽可集思广益。Pages......
  • Npm
    npm的目的:解决插件冲突,基于node环境,npm可以安装第三方库!npm组成部分:1.registry:入口(可以想象他是数据库,类似将第三方放进来,谁用就来数据库拿)2.官网:https://www.npmjs.com/3.Cli:需要熟悉的npm命令了解registry:该服务器是国外的,想要在国内使用,需要重新设置registry:https://re......
  • Oracle mos文档关于视图v$open_cursor中说法矛盾
     Oraclemos文档关于视图v$open_cursor中矛盾说法 HowtoMonitorandtuneOpenandCachedCursors(文档ID1430255.1)中指出:v$open_cursorshowscachedcursors,notcurrentlyopencursors,bysession.Ifyouarewonderinghowmanycursorsasessionhasopen......
  • 【内附源码和文档】基于C++14异步蒙特卡洛工具函数
    Simple-Monte-Carlo-Tool-Function这是一个使用C++实现的简单的异步蒙特卡洛算法工具函数C++标准:C++14使用autores=MonteCarlo(sample_nums,check_sample_funtion,generate_sample_funtion,…args);doublep=res.get();std::cout<<p<<std::endl;sample_nums:需要生成的样......
  • linux蚁剑入门到熟悉文档地址整理
    linux蚁剑入门到熟悉文档地址收录蚁剑GetHub地址帮助文档kali安装出现问题的解决方式kali安装记录linuxdebian下载解压后进入文件内,使用root身份执行./AntSword后选择下载运行环境,新建并选择位置即可之后再次./AntSword即可......
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本
    在新建项目时候遇到一个问题如上图,安装cnpm或者node都会报这个错误找了半天发现解决方法如下(操作如上图)1、打开终端2、在终端执行:get-ExecutionPolicy,显示Restricted(表示状态是禁止的)3、在终端执行:set-ExecutionPolicyRemoteSigned4、在终端执行:get-ExecutionPolicy,显示RemoteSig......
  • 超实用!教你如何熟练使用POI-TL框架,快速完成Office文档生成!
    POI-TL是一个用于生成Office文档的Java库,Configure类是该库中的一个配置类,其作用是提供了一些全局的配置选项,可以用于定制化生成的文档。<!--poi-tl是基于ApachePOI的Word模板引擎。poi-tl依赖的是poi4.1.2版本--><dependency><groupId>com.deepoove</groupId><ar......
  • 【内附源码和文档】在线课堂管理平台的设计与实现
    【内附源码和文档】在线课堂管理平台的设计与实现一、需求分析1.1需求来源通过研究传统的课堂学习特点,了解到传统课堂教学中存在教师与学生沟通不便,通知与作业不能及时传达,教学资源不能高效共享等不足,本项目使用JavaEE技术来解决上述需求。此项目贴近我们高校学生生活,可以从平......