From 45390c8b92af1d86d6e7f96d4e54f71b92786f4b Mon Sep 17 00:00:00 2001 From: qiaominna Date: Thu, 11 Mar 2021 19:47:54 +0800 Subject: [PATCH] pkgship --- .../userguide/images/packagemanagement.jpg | Bin 0 -> 60874 bytes docs/zh/docs/userguide/pkgship.md | 509 ++++++++---------- 2 files changed, 215 insertions(+), 294 deletions(-) create mode 100644 docs/zh/docs/userguide/images/packagemanagement.jpg diff --git a/docs/zh/docs/userguide/images/packagemanagement.jpg b/docs/zh/docs/userguide/images/packagemanagement.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f7a1045519eca2fd3c11729a2be1dcaae72b4d4 GIT binary patch literal 60874 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

Mn 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 Y{oem9oaG-pG4ucb-TzZsQ2!qJU(ip?D*ylh literal 0 HcmV?d00001 diff --git a/docs/zh/docs/userguide/pkgship.md b/docs/zh/docs/userguide/pkgship.md index 092e17953..764d9d039 100644 --- a/docs/zh/docs/userguide/pkgship.md +++ b/docs/zh/docs/userguide/pkgship.md @@ -1,382 +1,303 @@ -# pkgship +# pkgship - - -- [pkgship](#pkgship) - - [介绍](#介绍) - - [架构](#架构) - - [软件下载](#软件下载) - - [运行环境](#运行环境) - - [安装工具](#安装工具) - - [配置参数](#配置参数) - - [服务启动和停止](#服务启动和停止) - - [工具使用](#工具使用) - - +[[toc]] ## 介绍 + pkgship是一款管理OS软件包依赖关系,提供依赖和被依赖关系完整图谱的查询工具,pkgship提供软件包依赖查询、生命周期管理、补丁查询等功能。 1. 软件包依赖查询:方便社区人员在软件包引入、更新和删除的时候了解软件的影响范围。 -2. 生命周期管理:跟踪上游软件包发布状态,方便维护人员了解当前软件状态,及时升级到合理的版本。 -3. 补丁查询:方便社区人员了解openEuler软件包的补丁情况以及提取补丁内容,详细内容请参见[patch-tracking](./patch-tracking.md)。 +2. 补丁查询:方便社区人员了解openEuler软件包的补丁情况以及提取补丁内容,详细内容请参见[patch-tracking](./../userguide/patch-tracking.md)。 ## 架构 -系统采用flask-restful开发,使用SQLAlchemy ORM查询框架。 +系统采用flask-restful开发 -![avatar](./images/pkgship_outline.png) +![avatar](./images/packagemanagement.jpg) ## 软件下载 -* Repo源挂载正式发布地址: -* 源码获取地址: -* rpm包版本获取地址: +- Repo源挂载正式发布地址:https://repo.openeuler.org/ +- 源码获取地址:https://gitee.com/openeuler/pkgship +- rpm包版本获取地址:https://117.78.1.88/project/show/openEuler:Mainline ## 运行环境 -* 可用内存700M以上 -* python版本 3.8及以上 -* sqlite版本 3.32及以上 +- 可用内存700M以上 +- python版本 3.8及以上 +- Elasticsearch 版本7.10.1 +- Redis ## 安装工具 -工具安装可通过以下两种方式中的任意一种实现。 -* 方法一,通过dnf挂载repo源实现。 - 先使用dnf挂载pkgship软件在所在repo源(具体方法可参考[应用开发指南](https://openeuler.org/zh/docs/21.03/docs/ApplicationDev/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)),然后执行如下指令下载以及安装pkgship及其依赖。 +**1、pkgship工具安装** - ```bash - dnf install pkgship - ``` -* 方法二,通过安装rpm包实现。 - 先下载pkgship的rpm包,然后执行如下命令进行安装(其中“x.x-x”表示版本号,请用实际情况代替)。 +工具安装可通过以下两种方式中的任意一种实现。 - ```bash - rpm -ivh pkgship-x.x-x.oe1.noarch.rpm - ``` +- 方法一,通过dnf挂载repo源实现。 + 先使用dnf挂载pkgship软件在所在repo源(具体方法可参考[应用开发指南](./../ApplicationDev/开发环境准备.md)),然后执行如下指令下载以及安装pkgship及其依赖。 - 或者 + ``` + dnf install pkgship + ``` - ```bash - dnf install pkgship-x.x-x.oe1.noarch.rpm - ``` +- 方法二,通过安装rpm包实现。 先下载pkgship的rpm包,然后执行如下命令进行安装(其中“x.x-x”表示版本号,请用实际情况代替)。 -## 配置参数 + ``` + rpm -ivh pkgship-x.x-x.oe1.noarch.rpm + ``` -1. 在配置文件中对相应参数进行配置,系统的默认配置文件存放在 /etc/pkgship/packge.ini,请根据实际情况进行配置更改。 + 或者 - ```basn - vim /etc/pkgship/package.ini - ``` + ``` + dnf install pkgship-x.x-x.oe1.noarch.rpm + ``` - ```ini - [系统配置] +**2、Elasticsearch和Redis安装** - ; 初始化数据库时导入的yaml文件存放位置,该yaml中记录导入的sqlite文件位置 - init_conf_path=/etc/pkgship/conf.yaml +如果环境没有安装Elasticsearch或者Redis,可以在pkgship安装之后执行自动化安装脚本。 - ; 存放成功导入的sqlite文件的地址 - data_base_path=/var/run/pkgship_dbs +脚本路径默认为: - ; 写接口 - write_port=8080 +``` +/etc/pkgship/auto_install_pkgship_requires.sh +``` - ; 读接口 - query_port=8090 +执行方法为 - ; 写权限访问ip - write_ip_addr=127.0.0.1 +``` +/bin/bash auto_install_pkgship_requires.sh elasticsearch +``` - ; 读权限访问ip - query_ip_addr=127.0.0.1 +或者 - ; 远程服务的地址,命令行可以直接调用远程服务来完成数据请求, 只需在每个命令行后加 -remote参数 - remote_host=https://api.openeuler.org/pkgmanage +``` + /bin/bash auto_install_pkgship_requires.sh redis +``` - [LOG] +## 配置参数 - ; 日志存放路径 - log_path=/var/log/pkgship/ +1.在配置文件中对相应参数进行配置,系统的默认配置文件存放在 `/etc/pkgship/packge.ini`,请根据实际情况进行配置更改。 - ; 打印日志级别,支持如下: - ; INFO DEBUG WARNING ERROR CRITICAL - log_level=INFO +``` +vim /etc/pkgship/package.ini +[SYSTEM-系统配置] +; 初始化数据库时导入的yaml文件存放位置,该yaml中记录导入的sqlite文件位置。 +init_conf_path=/etc/pkgship/conf.yaml - ; 日志名称 - log_name=log_info.log +; 数据库端口。 +query_port=8090 - ; 日志文件大小达到上限后动态创建的日志的数量 - backup_count=10 +; 数据库ip地址。 +query_ip_addr=127.0.0.1 - ; 每个日志文件的大小 - max_bytes=314572800 +; 远程服务的地址,命令行可以直接调用远程服务来完成数据请求。 +remote_host=https://api.openeuler.org/pkgmanage - [UWSGI服务配置] +; 初始化和下载临时文件存放目录,不会长时间占用,建议可用空间至少1G。 +temporary_directory=/opt/pkgship/tmp/ - ; uwsgi 日志路径 - daemonize=/var/log/uwsgi.log +[LOG-日志] +; 业务日志存放路径。 +log_path=/var/log/pkgship/ - ; 前后端传输数据大小 - buffer-size=65536 +; 打印日志级别,支持如下: +; INFO DEBUG WARNING ERROR CRITICAL +log_level=INFO - ; HTTP Connection time - http-timeout=600 +[UWSGI-Web服务器配置] +; 操作日志路径。 +daemonize=/var/log/pkgship-operation/uwsgi.log +; 前后端传输数据大小。 +buffer-size=65536 +; 网络连接超时时间。 +http-timeout=600 +; 服务响应时间。 +harakiri=600 - ; Server response time - harakiri=600 +[REDIS-缓存配置] +; Redis缓存服务器的地址可以是已发布的可以正常访问的域或IP地址。 +;链接地址默认为127.0.0.1 +redis_host=127.0.0.1 - [TIMEDTASK] +;Redis缓存服务器的端口,默认为6379 +redis_port=6379 - ; 是否开启定时任务 - open=True +;Redis服务器一次允许的最大连接数 +redis_max_connections=10 - ; 设定定时任务触发的时间 - hour=3 - minute=0 +[DATABASE-数据库] +;数据库类型,默认为elastic,目前只支持elasticsearch +database_engine_type=elastic - [LIFECYCLE] - ; 每个包的yaml地址的存储远程地址 - warehouse_remote=https://gitee.com/openeuler/openEuler-Advisor/raw/master/upstream-info/ +;数据库访问地址,默认为本机地址 +database_host=127.0.0.1 - ; 在执行定时任务时,可以打开多线程执行,并且可以根据服务器的配置设置线程池中的线程数 - pool_workers=10 +;数据库访问端口,默认为9200 +database_port=9200 +``` - ; 仓库的名字 - warehouse=src-openeuler +2.创建初始化数据库的yaml配置文件: conf.yaml 文件默认存放在 /etc/pkgship/ 路径下,pkgship会通过该配置读取要建立的数据库名称以及需要导入的sqlite文件,也支持配置sqlite文件所在的repo地址。conf.yaml 示例如下所示。 - ``` +``` +dbname: openEuler-20.03 #数据库名称 +src_db_file: /etc/pkgship/repo/openEuler-20.09/src #源码包所在的本地路径 +bin_db_file: /etc/pkgship/repo/openEuler-20.09/bin #二进制包所在的本地路径 +priority: 1 #数据库优先级 + +dbname: openEuler-20.09 +src_db_file: https://repo.openeuler.org/openEuler-20.09/source #源码包所在的repo源 +bin_db_file: https://repo.openeuler.org/openEuler-20.09/everything/aarch64 #二进制包所在的repo源 +priority: 2 +``` -2. 创建初始化数据库的yaml配置文件: - conf.yaml 文件默认存放在 /etc/pkgship/ 路径下,pkgship会通过该配置读取要建立的数据库名称以及需要导入的sqlite文件。conf.yaml 示例如下所示。 +> 如需更改存放路径,请更改package.ini下的 init_conf_path 选项。 +> +> 不支持直接配置sqlite文件路径。 - ```yaml - - dbname: openEuler-21.03 - src_db_file: /etc/pkgship/src.sqlite - bin_db_file: /etc/pkgship/bin.sqlite - lifecycle: enable - priority: 1 - ``` +## 服务启动和停止 - > 如需更改存放路径,请更改package.ini下的 init_conf_path 选项。 +pkgship启动和停止方式有两种,systemctl方式和pkgshipd方式,其中systemctl方式启动可以有异常停止自启动的机制。两种方式的执行命令为: -## 服务启动和停止 +``` +systemctl start pkgship.service 启动服务 -pkgship使用uWSGI web服务器,启动和停止命令如下所示,可指定只启动读(写)服务,或同时启动。 +systemctl stop pkgship.service 停止服务 -```bash -pkgshipd start [manage/selfpkg] +systemctl restart pkgship.service 重启服务 +pkgshipd start 启动服务 -pkgshipd stop [manage/selfpkg] +pkgshipd stop 停止服务 ``` +> 每次起停周期内仅支持一种方式,不允许两种操作同时使用。 + ## 工具使用 -1. 数据库初始化。 - > 使用场景:服务启动后,为了能查询对应的数据库(比如mainline, openEuler-21.03)中的包信息及包依赖关系,需要将这些数据库通过createrepo生成的sqlite(分为源码库和二进制库)导入进服务内,生成对应的db文件。当conf.yaml里配置数据库的参数项lifecycle声明为enable的时候,在lifecycle.db中会生成一张对应的表,用于记录数据库信息,后续需要读取数据库表名称(tablename)的操作会从此文件读取,[-filepath]为可选参数。 +1. 数据库初始化。 + + > 使用场景:服务启动后,为了能查询对应的数据库(比如openEuler-20.09, openEuler-21.03)中的包信息及包依赖关系,需要将这些数据库通过createrepo生成的sqlite(分为源码库和二进制库)导入进服务内,生成对应的包信息json体然后插入Elasticsearch对应的数据库中。数据库名为根据config.yaml中配置的dbname生成的dbname-source/binary,[-filepath]为可选参数。 - ```bash - pkgship init [-filepath path] - ``` + ``` + pkgship init [-filepath path] + ``` - > 参数说明: - > -filepath:指定初始化配置文件的路径,可以使用相对路径和绝对路径,不带参数则使用默认配置初始化。 + > 参数说明: + > -filepath:指定初始化配置文件config.yaml的路径,可以使用相对路径和绝对路径,不带参数则使用默认配置初始化。 2. 单包查询。 - 用户可查询具体源码包(packagename)在指定数据库表(tablename)中的信息。 - > 使用场景:用户可查询具体源码包在指定数据库中的信息,packagename,tablename为必选参数。 + 用户可查询源码包或者二进制包(packagename)在指定数据库表(database)中的具体信息。 + + > 使用场景:用户可查询源码包或者二进制包在指定数据库中的具体信息,packagename,database为必选参数,-s为可选参数。 - ```bash - pkgship single packagename tablename - ``` + ``` + pkgship pkginfo $packageName $database [-s] + ``` - > 参数说明: - > packagename:指定要查询的源码包名。 - > tablename:指定具体的数据库名称。 + > 参数说明: + > packagename:指定要查询的软件包名。 + > database:指定具体的数据库名称。 + > + > -s: 指定`-s`将查询的是`src`源码包信息;若未指定 默认查询`bin`二进制包信息 3. 所有包查询。 - 查询数据库下包含的所有包的信息。 - > 使用场景:用户可查询指定数据库下包含的所有软件包信息。其中tablename为必选参数,[-packagename],[-maintainer]为可选参数。 + 查询数据库下包含的所有包的信息。 - ```bash - pkgship list tablename [-packagename pkgName] [-maintainer maintainer] - ``` + > 使用场景:用户可查询指定数据库下包含的所有软件包信息。其中tablename为必选参数,-s为可选参数。 - > 参数说明: - > tablename:指定具体的数据库名称。 - > -packagename:可以匹配到包名中包含参数字符串的包。 - > -maintainer:可以匹配到maintainer为参数的包。 + ``` + pkgship list $database [-s] + ``` + + > 参数说明: + > database:指定具体的数据库名称。 + > -s: 指定`-s`将查询的是`src`源码包信息;若未指定 默认查询`bin`二进制包信息 4. 安装依赖查询。 - 查询二进制包(binaryName)的安装依赖。 - > 使用场景:用户需要安装某个二进制包A时,需要将该二进制包A的安装依赖B,及B的安装依赖C等等,直至所有的安装依赖全部安装到系统才能成功安装二进制包A。因此,在用户安装二进制包A之前,可能会需要查询二进制包A的所有安装依赖。该命令提供了此功能,允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。 + 查询二进制包(binaryName)的安装依赖。 + + > 使用场景:用户需要安装某个二进制包A时,需要将该二进制包A的安装依赖B,及B的安装依赖C等等,直至所有的安装依赖全部安装到系统才能成功安装二进制包A。因此,在用户安装二进制包A之前,可能会需要查询二进制包A的所有安装依赖。该命令提供了此功能,允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。 - ```bash - pkgship installdep binaryName [-dbs dbName1 dbName2...] - ``` + ``` + pkgship installdep [$binaryName $binaryName1 $binaryName2...] [-dbs] [db1 db2...] [-level] $level + ``` - > 参数说明: - > -dbs:具体指定查询数据库的顺序优先级,dbName为具体的数据库名称。 + > 参数说明: + > binaryName:需要查询安装的依赖的二进制包名字,支持传多个;必传参数。 + > + > -dbs: 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。 + > + > -level:指定需要查询的依赖层级,不传默认为0,查询所有层级;可选参数。 5. 编译依赖查询。 - 查询源码包(sourceName)的所有编译依赖。 - > 使用场景:用户要编译某个源码包A的时候,需要安装源码包A的编译依赖B, 要成功安装编译依赖B需要获取B的所有安装依赖。因此,在用户编译源码包A之前,可能会需要查询源码包的编译依赖以及这些编译依赖的所有安装依赖。该命令提供了此功能,允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。 + 查询源码包(sourceName)的所有编译依赖。 - ```bash - pkgship builddep sourceName [-dbs dbName1 dbName2...] - ``` + > 使用场景:用户要编译某个源码包A的时候,需要安装源码包A的编译依赖B, 要成功安装编译依赖B需要获取B的所有安装依赖。因此,在用户编译源码包A之前,可能会需要查询源码包的编译依赖以及这些编译依赖的所有安装依赖。该命令提供了此功能,允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。 - > 参数说明: - > -dbs:具体指定查询数据库的顺序优先级,dbName为具体的数据库名称。 + ``` + pkgship builddep [$sourceName $sourceName1 $sourceName2..] -dbs [db1 db2 ..] [-level] $level + ``` + + > 参数说明: + > sourceName:需要查询编译依赖的源码包名字,支持多个查询;必传参数。 + > + > -dbs: 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。 + > + > -level:指定需要查询的依赖层级,不传默认为0,查询所有层级;可选参数。 6. 自编译自安装依赖查询。 - 查询指定二进制包(binaryName)或源码包(sourceName )的安装及编译依赖,其中[pkgName]为查询的二进制包或者源码包的名称。当查询二进制包时,可以查询到该二进制包的所有安装依赖以及该二进制包对应的源码包的编译依赖,及这些编译依赖的所有安装依赖;当查询源码包时,可以查询该源码包的编译依赖,及这些编译依赖的所有安装依赖,并且查询该源码包生成的所有二进制包的所有安装依赖。同时,配合对应参数使用,该命令也支持查询软件包的自编译依赖查询,和包含子包的依赖查询。 - - > 使用场景:如果开发者想在现有的版本库的基础上引入新的软件包,应同时引入该软件包的所有编译、安装依赖。该命令提供开发者一个同时查询这两种依赖关系的功能,能让开发者知晓该软件包会引入哪些其他的包,该命令支持查询二进制包和源码包。 - - ```bash - pkgship selfbuild [pkgName] [-dbs dbName1 dbName2 ] [-t source] [-s 1] [-w 1] - ``` - - > 参数说明: - > -dbs 指定数据库优先级,dbName为具体的数据库名称,使用示例如下。 - - > ``` bash - > pkgship selfbuild pkgName -dbs dbName1 dbName2 - > ``` - - > -t source/binary 指定查询包名pkgName为源码包还是二进制包,不加-t时,默认为二进制包。 - > -s 增加该参数表示查询软件包的所有安装依赖和所有编译依赖(即编译依赖的源码包的编译依赖),以及所有编译依赖的安装依赖。其中-s参数后面的0表示不查询自编译依赖,1表示查询自编译依赖,默认为0,可以指定1。如果不增加-s参数表示只查询软件包的所有安装依赖和一层编译依赖,以及一层编译依赖的所有安装依赖,查询自编译使用示例如下。 - - > ```bash - > pkgship selfbuild pkgName -t source -s 1 - > ``` - - > -w 增加该参数表示引入某个二进制包的时候,查询结果会显示出该二进制包对应的源码包以及该源码包生成的所有二进制包。其中-w参数后面的0表示不查询对应子包,1表示查询对应子包,默认为0,可以指定1。如果不增加-w参数表示引入某个二进制包的时候,查询结果只显示对应的源码包,查询子包使用示例如下。 - - > ```bash - > pkgship selfbuild pkgName -w 1 - > ``` - -7. 被依赖查询。 - 查询源码包(sourceName)在某数据库(dbName)中被哪些包所依赖。 - > 使用场景:针对软件源码包A,在升级或删除的情况下会影响哪些软件包,可通过该命令查询。该命令会显示源码包A生成的所有二进制包被哪些源码包(比如B)编译依赖,被哪些二进制包(比如C1)安装依赖;以及B生成的二进制包及C1被哪些源码包(比如D)编译依赖,被哪些二进制包(比如E1)安装依赖,以此类推,遍历这些二进制包的被依赖,[-w 0/1]为可选参数,使用示例如下。 - ```bash - pkgship bedepend sourceName dbName [-w 1] - ``` - - > 参数说明: - > -w (0/1):当命令后不带配置参数或者[-w 0] 时,查询结果默认不包含对应二进制包的子包;当命令后带配置参数[-w 1] 时,不仅会查询二进制包C1的被依赖关系,还会进一步去查询C1对应的源码包C生成的其他二进制包(比如:C2,C3)的被依赖关系。 - -8. 包信息记录修改。 - > 使用场景: 用户可以修改指定源码包的维护人和维护级别。[-packagename],[-maintainer],[-maintainlevel],[-filefolder],[--batch]为可选参数。 - - 当前有两种修改方式: - 第一种,通过指定源码包名(packagename),修改源码包的维护人(Newmaintainer)和维护级别(Newmaintainlevel),示例如下。 - ```bash - pkgship updatepkg [-packagename packagename] [-maintainer Newmaintainer] [-maintainlevel Newmaintainlevel] - ``` - > 参数说明: - > -packagename:指定需要维护的包名。 - > -maintainer:指定更新包的维护人。 - > -maintainlevel:指定更新包的维护级别,值在1~4之间,默认为1。 - - 第二种,通过指定文件路径(path),批量更新包的维护人和维护级别, 该命令必须指定添加--batch参数,示例如下。 - ```bash - pkgship updatepkg [--batch] [-filefolder path] - ``` - > 参数说明: - > -filefolder: 指定存放包信息的yaml文件,指定的目录仅能包含更新的yaml文件。 - > --batch:指定批量更新,需要和[-filefolder]参数项一起使用。 - - 用户可以通过创建文件名A.yaml指定包名为A,指定yaml内容来修改包信息。 - 包信息的yaml格式如下: - ``` - maintainer:Newmaintainlevel - maintainlevel: Newmaintainlevel - ``` - -9. 数据库删除。 - > 使用场景: 删除指定数据库(dbName)。 - - ```bash - pkgship rm dbName - ``` - -10. 表信息查询。 - > 使用场景: 查看当前生命周期数据库中存在的所有数据表。 - - ```bash - pkgship tables - ``` - -11. issue查询。 - > 使用场景: 查看所有的源码包下的所有issue的信息。可选参数[-packagename],[-issue_type],[-issue_status],[-maintainer],[-page N],[-pagesize pageSize]。 - - ```bash - pkgship issue [-packagename pkgName],[-issue_type issueType],[-issue_status issueStatus],[-maintainer maintainer],[-page N],[-pagesize pageSize] - ``` - - > 参数说明: - > -packagename: 指定包名进行模糊查询。 - > -issue_type: 指定issue类型进行查询。 - > -issue_status: 指定issue状态进行查询。 - > -maintainer: 指定维护人进行查询。 - > -page: 指定查询第N页的数据。 - > -pagesize: 指定每页显示的数据条目数pageSize。 - - ```bash - 指定包名进行模糊查询示例: - pkgship issue -packagename pkgName - ``` - - ```bash - 指定issue类型进行查询示例: - pkgship issue -issue_type issueType - ``` - - ```bash - 指定issue状态进行查询示例: - pkgship issue -issue_status issueStatus - ``` - - ```bash - 指定维护人进行查询示例: - pkgship issue -maintainer maintainer - ``` - - ```bash - 指定查询第N页的数据示例: - pkgship issue -page N - ``` - - ```bash - 指定每页显示的数据条目数pageSize示例: - pkgship issue -pagesize pageSize - ``` - -12. 更新软件包的生命周期。 - - > 使用场景: 用户可指定更新生命周期表中所有软件包的issue信息,维护人和维护级别。可选参数[--issue],[--package]。 - - ```bash - pkgship update [--issue] [--package] - ``` - - > 参数说明: - > --issue: 指定更新生命周期表中所有软件包的issue信息,根据生命周期中表的软件包名去gitee爬取软件包对应的issue信息。 - > --package: 指定更新生命周期表中所有软件包的生命周期,维护人和维护级别。 - - ```bash - 更新生命周期表中所有软件包的issue信息示例: - pkgship update --issue - ``` - - ```bash - 更新生命周期表中所有软件包的生命周期,维护人和维护级别示例: - pkgship update --package - ``` + 查询指定二进制包(binaryName)或源码包(sourceName )的安装及编译依赖,其中[pkgName]为查询的二进制包或者源码包的名称。当查询二进制包时,可以查询到该二进制包的所有安装依赖以及该二进制包对应的源码包的编译依赖,及这些编译依赖的所有安装依赖;当查询源码包时,可以查询该源码包的编译依赖,及这些编译依赖的所有安装依赖,并且查询该源码包生成的所有二进制包的所有安装依赖。同时,配合对应参数使用,该命令也支持查询软件包的自编译依赖查询,和包含子包的依赖查询。 + + > 使用场景:如果开发者想在现有的版本库的基础上引入新的软件包,应同时引入该软件包的所有编译、安装依赖。该命令提供开发者一个同时查询这两种依赖关系的功能,能让开发者知晓该软件包会引入哪些其他的包,该命令支持查询二进制包和源码包。 + + ``` + pkgship selfdepend [$pkgName1 $pkgName2 $pkgName3 ..] [-dbs] [db1 db2..] [-b] [-s] [-w] + ``` + + > 参数说明: + > + > pkgName:需要查询安装的依赖的二进制包名字,支持传多个;必传参数。 + > + > -dbs: 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。 + > + > -b:指定`-b`表示查询的包是二进制,不指定默认查询源码包;可选参数。 + > + > -s: 指定-s表示查询软件包的所有安装依赖和所有编译依赖(即编译依赖的源码包的编译依赖),以及所有编译依赖的安装依赖;如果不增加-s参数表示只查询软件包的所有安装依赖和一层编译依赖,以及一层编译依赖的所有安装依赖;可选参数。 + > + > -w:指定-s表示引入某个二进制包的时候,查询结果会显示出该二进制包对应的源码包以及该源码包生成的所有二进制包;如果不指定-w参数表示引入某个二进制包的时候,查询结果只显示对应的源码包;可选参数。 + +7. 被依赖查询。 + 查询源码包(sourceName)在某数据库(dbName)中被哪些包所依赖。 + + > 使用场景:针对软件源码包A,在升级或删除的情况下会影响哪些软件包,可通过该命令查询。该命令会显示源码包A生成的所有二进制包被哪些源码包(比如B)编译依赖,被哪些二进制包(比如C1)安装依赖;以及B生成的二进制包及C1被哪些源码包(比如D)编译依赖,被哪些二进制包(比如E1)安装依赖,以此类推,遍历这些二进制包的被依赖。 + + ``` + pkgship bedepend dbName [$pkgName1 $pkgName2 $pkgName3] [-w] [-b] [-install/build] + ``` + + > 参数说明: + > + > dbName:需要查询依赖关系的仓库,不支持多个;必选参数。 + > + > -w :当不指定-w 时,查询结果默认不包含对应二进制包的子包;当命令后指定配置参数[-w] 时,不仅会查询二进制包C1的被依赖关系,还会进一步去查询C1对应的源码包C生成的其他二进制包(比如:C2,C3)的被依赖关系;可选参数。 + > + > -b:指定`-b`表示查询的包是二进制,默认查询源码包;可选参数。 + > + > -install/build:指定`-install`表示查询的是安装被依赖,指定`-build`表示查询的是编译被依赖,默认查全部, 不能`-install`和`-build`同时存在;可选参数。 + +8. 数据库信息。 + + > 使用场景,查看Elasticsearch中初始化了哪些数据库,该功能会按照优先级顺序返回已经初始化的数据库列表。 + + `pkgship db` + +9. 获取版本号。 + + > 使用场景:获取pkgship软件的版本号。 + + `pkgship -v` \ No newline at end of file -- Gitee