1 Star 0 Fork 48

薄皮小笼包 / pkgship

forked from openEuler / pkgship 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

pkgship

介绍

pkgship是一款管理OS软件包依赖关系,提供依赖和被依赖关系完整图谱的查询工具,pkgship提供软件包依赖查询、生命周期管理、补丁查询等功能。

  1. 软件包依赖查询:方便社区人员在软件包引入、更新和删除的时候了解软件的影响范围。
  2. 补丁查询:方便社区人员了解openEuler软件包的补丁情况以及提取补丁内容,详细内容请参见patch-tracking

架构

系统采用flask-restful开发

avatar

软件下载

运行环境

  • 硬件配置:
配置项 推荐规格
CPU 8核
内存 32G,最小4G
网络带宽 300M
I/O 375MB/sec
  • 软件配置:
软件名 版本和规格
Elasticsearch 版本7.10.1;单机部署可用;有能力可部署集群
Redis 建议5.0.4及以上;建议大小配置为内存的3/4
Python 版本 3.8及以上

安装工具

说明:该软件支持在docker下运行。目前在openEuler21.09版本下,由于环境条件限制,创建docker时请使用--privileged参数,不使用--privileged参数将会导致软件启动失败,后续适配后将更新该文档。

1、pkgship工具安装

工具安装可通过以下两种方式中的任意一种实现。

  • 方法一,通过dnf挂载repo源实现。
    先使用dnf挂载pkgship软件在所在repo源(具体方法可参考应用开发指南),然后执行如下指令下载以及安装pkgship及其依赖。

    dnf install pkgship
  • 方法二,通过安装rpm包实现。 先下载pkgship的rpm包,然后执行如下命令进行安装(其中“x.x-x”表示版本号,请用实际情况代替)。

    rpm -ivh pkgship-x.x-x.oe1.noarch.rpm

    或者

    dnf install pkgship-x.x-x.oe1.noarch.rpm

2、Elasticsearch和Redis安装

如果环境没有安装Elasticsearch或者Redis,可以在pkgship安装之后执行自动化安装脚本。

脚本路径默认为:

/etc/pkgship/auto_install_pkgship_requires.sh

执行方法为

/bin/bash auto_install_pkgship_requires.sh elasticsearch

目前由于rpm包方式安装Elasticsearch默认为无密码模式,且pkgship需使用无密码设置的Elasticsearch,所以建议Elasticsearch和pkgship安装在同一服务器,以通过网络隔离提高安全性。后续将支持Elasticsearch设置用户名密码。

或者

 /bin/bash auto_install_pkgship_requires.sh redis

3、安装后添加用户

在安装pkgship软件后,会自动创建名为pkgshipuser的用户和名为pkgshipuser的用户组,无需手动创建,后续服务启动和运行时,都会以该用户角色操作。

配置参数

1.在配置文件中对相应参数进行配置,系统的默认配置文件存放在 /etc/pkgship/packge.ini,请根据实际情况进行配置更改。

vim /etc/pkgship/package.ini
[SYSTEM-系统配置]
; 初始化数据库时导入的yaml文件存放位置,该yaml中记录导入的sqlite文件位置。
init_conf_path=/etc/pkgship/conf.yaml

; 若部署为客户端-服务端方式,服务端需保证query_ip_addr为本机ip或者0.0.0.0,
; 并且客户端可通过query_ip_addr加query_port访问服务端,或者通过设置映射的remote_host访问服务端。
; 服务查询端口。
query_port=8090

; 服务查询ip。
query_ip_addr=127.0.0.1

; 远程服务的地址,命令行可以直接调用远程服务来完成数据请求。
remote_host=https://api.openeuler.org/pkgmanage

; 初始化和下载临时文件存放目录,不会长时间占用,建议可用空间至少1G。
temporary_directory=/opt/pkgship/tmp/

[LOG-日志]
; 业务日志存放路径。
log_path=/var/log/pkgship/

; 打印日志级别,支持如下:
; INFO DEBUG WARNING ERROR CRITICAL
log_level=INFO

; 单个业务日志文件最大容量,超过该值会自动压缩转储,默认为30M
max_bytes=31457280

; 备份日志保留的最大数量,默认为30
backup_count=30

[UWSGI-Web服务器配置]
; 操作日志路径。
daemonize=/var/log/pkgship-operation/uwsgi.log
; 前后端传输数据大小。
buffer-size=65536
; 网络连接超时时间。
http-timeout=600
; 服务响应时间。
harakiri=600

[REDIS-缓存配置]
; Redis缓存服务器的地址可以是已发布的可以正常访问的域或IP地址。
;链接地址默认为127.0.0.1
redis_host=127.0.0.1

;Redis缓存服务器的端口,默认为6379
redis_port=6379

;Redis服务器一次允许的最大连接数
redis_max_connections=10

[DATABASE-数据库]
;数据库访问地址,建议设置为本机地址
database_host=127.0.0.1

;数据库访问端口,默认为9200
database_port=9200

2.创建初始化数据库的yaml配置文件: conf.yaml 文件默认存放在 /etc/pkgship/ 路径下,pkgship会通过该配置读取要建立的数据库名称以及需要导入的sqlite文件,也支持配置sqlite文件所在的repo地址。conf.yaml 示例如下所示。

dbname: oe20.03   #数据库名称
src_db_file: file:///etc/pkgship/repo/openEuler-20.09/src  #源码包所在的本地路径
bin_db_file: file:///etc/pkgship/repo/openEuler-20.09/bin  #二进制包所在的本地路径
priority: 1 #数据库优先级

dbname: oe20.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

如需更改存放路径,请更改package.ini下的 init_conf_path 选项。

sqlite文件配置规格:

  • 为节省空间,不支持直接使用sqlite文件,请使用包含sqlite文件的压缩包,支持压缩格式为:.bz .gz .tar .zip
  • sqlite压缩包命名格式为xxx.primary.sqlite.xx,二进制包所在路径下还需使用filelists类型的sqlite压缩文件,命名格式为xxx.filelists.sqlite.xx,一般网络地址下的sqlite压缩包都符合该格式。
  • 本地路径请使用file://前缀。
  • 本地路径和网络地址路径都要满足sqlite压缩包位于:配置路径/repodata/xxx.primary.sqlite.xx

dbname请使用小写字母或者数字,不支持大写字母。

服务启动和停止

pkgship启动和停止方式有两种,systemctl方式和pkgshipd方式,其中systemctl方式启动可以有异常停止自启动的机制。两种方式的执行命令为:

systemctl start pkgship.service 启动服务

systemctl stop pkgship.service 停止服务

systemctl restart pkgship.service 重启服务
pkgshipd start 启动服务

pkgshipd stop 停止服务

每次起停周期内仅支持一种方式,不允许两种操作同时使用。

pkgshipd启动方式只允许在pkgshipuser用户下操作。

docker环境下如果不支持systemctl命令,请使用pkgshipd启停方式。

工具使用

  1. 数据库初始化。

    使用场景:服务启动后,为了能查询对应的数据库(比如oe20.03,oe20.09)中的包信息及包依赖关系,需要将这些数据库通过createrepo生成的sqlite(分为源码库和二进制库)导入进服务内,生成对应的包信息json体然后插入Elasticsearch对应的数据库中。数据库名为根据config.yaml中配置的dbname生成的dbname-source/binary。

    pkgship init [-filepath path]

    参数说明:
    -filepath:指定初始化配置文件config.yaml的路径,可以使用相对路径和绝对路径,不带参数则使用默认配置初始化,可选参数。

  2. 单包查询。

    用户可查询源码包或者二进制包(packagename)在指定数据库表(database)中的具体信息。

    使用场景:用户可查询源码包或者二进制包在指定数据库中的具体信息。

    pkgship pkginfo $packageName $database [-s]

    参数说明:
    packagename:指定要查询的软件包名,必传参数。
    database:指定具体的数据库名称,必传参数。

    -s: 指定-s将查询的是src源码包信息;若未指定 默认查询bin二进制包信息,可选参数。

  3. 所有包查询。

    查询数据库下包含的所有包的信息。

    使用场景:用户可查询指定数据库下包含的所有软件包信息。

    pkgship list $database [-s]

    参数说明:
    database:指定具体的数据库名称,必传参数。
    -s: 指定-s将查询的是src源码包信息;若未指定 默认查询bin二进制包信息,可选参数。

  4. 安装依赖查询。

    查询二进制包(binaryName)的安装依赖。

    使用场景:用户需要安装某个二进制包A时,需要将该二进制包A的安装依赖B,及B的安装依赖C等等,直至所有的安装依赖全部安装到系统才能成功安装二进制包A。因此,在用户安装二进制包A之前,可能会需要查询二进制包A的所有安装依赖。该命令提供了此功能,允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。

    pkgship installdep [$binaryName $binaryName1 $binaryName2...] [-dbs] [db1 db2...] [-level] $level

    参数说明:
    binaryName:需要查询安装的依赖的二进制包名字,支持传多个;必传参数。

    -dbs: 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。

    -level:指定需要查询的依赖层级,不传默认为0,查询所有层级;可选参数。

  5. 编译依赖查询。

    查询源码包(sourceName)的所有编译依赖。

    使用场景:用户要编译某个源码包A的时候,需要安装源码包A的编译依赖B, 要成功安装编译依赖B需要获取B的所有安装依赖。因此,在用户编译源码包A之前,可能会需要查询源码包的编译依赖以及这些编译依赖的所有安装依赖。该命令提供了此功能,允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。

    pkgship builddep [$sourceName $sourceName1 $sourceName2..] -dbs [db1 db2 ..] [-level] $level

    参数说明:
    sourceName:需要查询编译依赖的源码包名字,支持多个查询;必传参数。

    -dbs: 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。

    -level:指定需要查询的依赖层级,不传默认为0,查询所有层级;可选参数。

  6. 自编译自安装依赖查询。

    查询指定二进制包(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. 被依赖查询。
    查询软件包(pkgName)在某数据库(dbName)中被哪些包所依赖。

    使用场景:针对软件包A,在升级或删除的情况下会影响哪些软件包,可通过该命令查询。该命令会显示源码包A(若为源码包)生成的所有二进制包(若输入为二进制包,那此处即为输入的二进制包)被哪些源码包(比如B)编译依赖,被哪些二进制包(比如C1)安装依赖;以及B生成的二进制包及C1被哪些源码包(比如D)编译依赖,被哪些二进制包(比如E1)安装依赖,以此类推,遍历这些二进制包的被依赖。

     pkgship bedepend dbName [$pkgName1 $pkgName2 $pkgName3] [-w] [-b] [-install/build]

    参数说明:

    dbName:需要查询依赖关系的仓库,不支持多个;必选参数。

    pkgName:待查询的软件包名称,支持多个;必选参数。

    -w :当不指定-w 时,查询结果默认不包含对应源码包的子包;当命令后指定配置参数[-w] 时,不仅会查询二进制包C1的被依赖关系,还会进一步去查询C1对应的源码包C生成的其他二进制包(比如:C2,C3)的被依赖关系;可选参数。

    -b:指定-b表示查询的包是二进制,默认查询源码包;可选参数。

    -install/build:指定-install表示查询的是安装被依赖,指定-build表示查询的是编译被依赖,默认查全部, 不能-install-build同时存在;可选参数。

  8. 数据库信息。

    使用场景,查看Elasticsearch中初始化了哪些数据库,该功能会按照优先级顺序返回已经初始化的数据库列表。

    pkgship dbs

  9. 获取版本号。

    使用场景:获取pkgship软件的版本号。

    pkgship -v

  10. 比较不同数据库的包信息的依赖关系。

查询输入数据库各自的所有源码包/二进制包信息,以及他们的一层编译依赖/安装依赖,然后以第一个数据库包信息为基准对比各个数据库依赖信息的差异并记录到csv文件中。

使用场景:比较各个系统依赖关系的差异,分析软件包依赖关系优化点。

pkgship compare -t build/install -dbs [database1 database2..] [-o out_path]

参数说明:

-t: 查询的依赖类型,目前只支持编译依赖-build和安装依赖-install。

-dbs: 查询的数据库列表,数据库之间用空格分隔。为了控制执行时间,目前最多支持4个数据库,对比时以第一个数据库的软件包作为对比基准包集合。

-o: csv文件的保存路径。不填默认为/opt/pkgship/compare ,需要指定时要确保执行用户pkgshipuser有写入权限。最后csv文件保存在“${out_path}/时间戳” 路径下。csv文件为各个数据库的包依赖关系信息(以数据库名称命名)以及所有数据库的包依赖关系对比信息(compare.csv)。

日志查看和转储

日志查看

pkgship服务在运行时会产生两种日志,业务日志和操作日志。

1、业务日志:

路径:/var/log/pkgship/log_info.log(支持在conf.yaml中通过log_path字段自定义路径)。

功能:主要记录代码内部运行的日志,方便问题定位。

权限:路径权限755,日志文件权限644,普通用户可以查看。

2、操作日志:

路径:/var/log/pkgship-operation/uwsgi.log (支持在conf.yaml中通过daemonize字段自定义路径)。

功能:记录使用者操作信息,包括ip,访问时间,访问url,访问结果等,方便后续查阅以及记录攻击者信息。

权限:路径权限700,日志文件权限644,只有root和pkgshipuser可以查看。

日志转储

1、业务日志转储:

  • 转储机制

    使用python自带的logging内置函数的转储机制,按照日志大小来备份。

配置项,package.ini中配置每个日志的容量和备份数量

; Maximum capacity of each file, the unit is byte, default is 30M
max_bytes=31457280

; Number of old logs to keep;default is 30
backup_count=30
  • 转储过程

    当某次日志写入后,日志文件大小超过配置的日志容量时,会自动压缩转储,压缩后文件名为log_info.log.x.gz, x是数字,数字越小为越新的备份。

    当备份日志数量到达配置的备份数量之后,最早的备份日志会被删除掉,然后备份一个最新的压缩日志文件。

2、操作日志转储:

  • 转储机制

    使用脚本进行转储,按照时间转储,每日转储一次,共保留30天,不支持自定义配置。

    脚本位置:/etc/pkgship/uwsgi_logrotate.sh

  • 转储过程

    pkgship启动时转储脚本后台运行,从启动时,每隔1天进行转储压缩,共保留30份压缩文件,压缩文件名称为uwsgi.log-20201010x.zip, x为压缩时的小时数。

    pkgship停止后转储脚本停止,不再进行转储,再次启动时,转储脚本重新执行。

木兰宽松许可证, 第2版 木兰宽松许可证, 第2版 2020年1月 http://license.coscl.org.cn/MulanPSL2 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 6. 语言 “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 条款结束 如何将木兰宽松许可证,第2版,应用到您的软件 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. Mulan Permissive Software License,Version 2 Mulan Permissive Software License,Version 2 (Mulan PSL v2) January 2020 http://license.coscl.org.cn/MulanPSL2 Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: 0. Definition Software means the program and related documents which are licensed under this License and comprise all Contribution(s). Contribution means the copyrightable work licensed by a particular Contributor under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 6. Language THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. END OF THE TERMS AND CONDITIONS How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details.

简介

A package dependency query tool 展开 收起
MulanPSL-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/ruebb/pkgship.git
git@gitee.com:ruebb/pkgship.git
ruebb
pkgship
pkgship
master

搜索帮助

14c37bed 8189591 565d56ea 8189591