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

技术文档 | OpenSCA技术原理之composer依赖解析

时间:2023-04-19 10:22:37浏览次数:63  
标签:依赖 1.1 require OpenSCA 文档 composer 组件

OpenSCA知识小课堂开课了!

今天主要介绍基于composer包管理器的组件成分解析原理。

composer介绍

composer是PHP的依赖管理工具。

开发者受到Node.js的npm及Ruby的bundler启发,composer设计上与两者有诸多相似。

composer的依赖管理文件是composer.json。开发者可以在composer.json中指定每个依赖项的版本范围或使用composer require/update/remove ${name}命令管理依赖项。

如果一个项目中存在composer.json文件,便可以执行composer install命令自动安装当前项目所需的依赖项并生成composer.lock文件

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

{
  "name": "cakephp/app",
  "type": "project",
  "license": "MIT",
  "require": {
      "php": ">=7.2",
      "cakephp/cakephp": "^4.3",
      "cakephp/migrations": "^3.2",
      "cakephp/plugin-installer": "^1.3",
      "mobiledetect/mobiledetectlib": "^2.8"
  },
  "require-dev": {
      "cakephp/bake": "^2.6",
      "cakephp/cakephp-codesniffer": "^4.5",
      "cakephp/debug_kit": "^4.5",
      "josegonzalez/dotenv": "^3.2",
      "phpunit/phpunit": "~8.5.0 || ^9.3"
  },
}
其中name为项目名称;type为包的类型,有library、project、metapackage和composer-plugin四种类型,默认情况下为library;license为项目声明的许可证,可以是一个字符串或是一个字符串数组。

require-dev为开发环境或测试使用的依赖,require为生产环境使用的依赖,依赖写法为"name":"version",版本可以指定准确版本或一个范围。

解析算法

composer.lock

composer.lock文件为自动生成的文件,可以准确定位到PHP项目使用的依赖及版本,所以优先解析composer.lock文件。

composer.lock文件结构如下:

{
  "packages": [
    {
      "name": "a",
      "version": "1.1.0",
      "require": {
          "c": "1.1.*"
      }
    },
    {
      "name": "b",
      "version": "1.2.2",
      "require": {
          "c": "^1.0.2"
      }
    },
    {
       "name": "c",
      "version": "1.1.2"
    }
  ],
  "packages-dev": []
}
其中packages和packages-dev字段包含项目使用的所有直接和间接依赖,而且记录了组件间的依赖关系,packages为生产环境的依赖,packages-dev为开发环境的依赖。

示例:

{
  "name": "a",
  "version": "1.1.0",
  "require": {
      "c": "1.1.*"
  }
}
代表项目依赖1.1.0版本的组件a,且该组件依赖版本约束为1.1.*的组件c。

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

且组件a和组件b都没有被其他依赖所依赖,所以可知这两个组件是项目的直接依赖。

注:

1.1.*代表版本号需要>=1.1.0且<1.2.0

^1.0.2代表版本号需要>=1.0.2且<2.0.0

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

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

图:composer.lock检测结果示例

composer.json

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

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

composer.json文件结构如下:

{
  "name": "foo",
  "type": "project",
  "license": "MIT",
  "require": {
      "a": "^1.1.0",
      "b": "^1.2.0",
  },
  "require-dev": {},
}
require为项目实际使用的直接依赖,require-dev为项目开发时使用的直接依赖。

例如:

"a": "^1.1.0"代表项目依赖版本约束为^1.1.0的组件a。

"b": "^1.2.0"代表项目依赖版本约束为^1.2.0的组件b。

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

实线代表直接依赖

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

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

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

{
  "packages": {
    "a": [
      {
        "version": "1.0.1",
        "require": {
          "c": "^1.0.0"
        }
      },
      {
        "version": "1.1.0",
        "require": {
          "c": "^1.1.0"
        }
      }
    ]
  }
}
其中packages字段为组件及各个版本信息的映射,require字段为组件的依赖信息。

对于本例来说,组件a的约束为^1.1.0,要求版本号>=1.1.0且<2.0.0,所以选择1.1.0版本。

因此组件依赖结构就变成了:

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

图:composer.json检测结果示例

感谢每一位开源社区成员对OpenSCA的支持和贡献。

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

OpenSCA官网:

https://opensca.xmirror.cn/

GitHub:

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

Gitee:

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

 

标签:依赖,1.1,require,OpenSCA,文档,composer,组件
From: https://www.cnblogs.com/openscacommunity/p/17332357.html

相关文章

  • 技术文档丨 OpenSCA技术原理之npm依赖解析
    本文主要介绍基于npm包管理器的组件成分解析原理。npm介绍npm(全称NodePackageManager)是Node.js标准的软件包管理器。npm的依赖管理文件是package.json,开发者可以在package.json中指定每个依赖项的版本范围。如果一个项目中存在package.json文件,便可以执行npminstall......
  • 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......
  • 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即可......
  • 超实用!教你如何熟练使用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技术来解决上述需求。此项目贴近我们高校学生生活,可以从平......
  • [企业管理]招投标过程中的对话——投标文档撰写的具体要求
    对话中涉及到招投标启动前和过程中的一些具体问题,最后这个哥们问到了我的全程建模培训的举行情况,他曾经带了两个朋友参加了我2005年元旦的全程建模培训。 山东的一个朋友 20:59:49青润,在?山东的一个朋友 20:59:52?青润 21:01:29在青润 21:01:37刚过来。山东的一个朋......