当前位置: 首页 > news >正文

Linux如何将文件或目录打成rpm包?-- rpmbuild打包详解

👨‍🎓博主简介

  🏅CSDN博客专家
  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 前言
  • 一、使用rpmbuild将python环境及依赖包打成rpm包
    • 1.1 准备打包环境
    • 1.2 创建 Python 环境的 SPEC 文件
    • 1.3 准备 Python 环境
    • 1.4 构建 RPM 包
    • 1.5 安装、卸载 RPM 包
      • 1.5.1 安装rpm包
      • 1.5.2 查找刚刚安装rpm包
      • 1.5.3 卸载刚刚安装的rpm包
  • 二、使用rpmbuild将docker离线安装包打成rpm包
    • 2.1 准备打包环境
    • 2.2 创建 docker 安装包的 SPEC 文件
    • 2.3 准备 docker安装包 环境
    • 2.4 构建 RPM 包
    • 2.5 安装、卸载 RPM 包
      • 2.5.1 安装rpm包
      • 2.5.2 查找刚刚安装rpm包
      • 2.5.3 卸载刚刚安装的rpm包
  • 三、相关文章

前言

  最近因为遇到一个服务器受系统限制,只能上传rpm包才能使用,而我们的服务都是文件,那么怎么将文件都打成rpm包呢???我也是找了好几个,终于找到了一个简单好用的打包方式,下面来给大家讲解一下部署及打包、安装;

rpm是什么呢?

  rpm是一种安装包的格式。就像在Windows系统上我们常见的安装包格式是exe和msi一样,在linux上常见的安装包格式是deb和rpm。一般在红帽系列的系统上,不支持deb,所以我们需要将程序打包成rpm安装。

本文已docker离线安装包python环境两种类型文件打包为例子,将其打成rpm包,并在新的服务器上安装;

操作系统为:Centos 7.6、中科方德开发版系统

一、使用rpmbuild将python环境及依赖包打成rpm包

在使用 rpmbuild 将 Python 环境打包成 RPM 包之前,需要确保已经安装 rpmbuild 工具,并配置好相关的 RPM 打包环境。以下是具体的步骤和说明:

1.1 准备打包环境

首先,确保安装了 rpmbuild,可以通过以下命令安装:

sudo yum install rpm-build -y
# 安装 rpmdevtools
yum install rpmdevtools

rpmdevtools为开发者提供了极大的便利,用于制作RPM包,涵盖了从创建rpmbuild开发树、MD5验证、spec文件的生成,到解压归档文件、归档文件前后版本对比diff等一系列功能。

创建打包文件夹

创建打包文件夹有两种方法:

方法一:使用命令 rpmdev-setuptree 来创建,但是创建的文件夹是在用户主目录(home)如果是root就是在(root)下,我们可以将rpmbuild整个文件夹拷贝到项目文件夹,这样可以方便我们项目管理。

方法二:手动的去创建文件夹,具体文件夹结构可以参考下面的目录树

# 方法一:使用命令创建
rpmdev-setuptree# 方法二:手动创建文件夹
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}# 目录树
rpmbuild- BUILD           // 编译时用到的暂存目录- RPMS            // 打包后生成的 rpm 包会放在这里- SOURCES         // 源码压缩包- SPECS           // 放 xx.spec 文件- SRPMS           // 打包后生成的 srpm 包会放在这里 

1.2 创建 Python 环境的 SPEC 文件

~/rpmbuild/SPECS 目录中创建一个 .spec 文件,用于定义 RPM 包的相关信息,例如 python_env.spec。以下是一个基本的 spec 文件模板:

或者使用rpmdev-newspec python_env.spec命令创建*.spec模板

Name: python_env
Version: 1.0
Release: 1%{?dist}
Summary: Python Environment PackageLicense: YourLicense
Source0: %{name}-%{version}.tar.gz%description
This package provides a Python environment including dependencies.%prep
# 静默模式解压,并进入解压后的目录,常用:%setup -q%build
# 编译过程%install
# 安装过程
# 假设你已经将Python环境打包为.tar.gz文件,将其解压到 /opt/
tar -xzvf %{SOURCE0} -C %{buildroot}/opt/%files
/opt/python_env/*%changelog
* Tue Nov 12 2024 Your Name <youremail@example.com> - 1.0-1
- Initial package for Python environment

以下是这个 RPM SPEC 文件的配置内容的详细解析:


基本配置信息

  • Name: python_env

    • 定义了 RPM 包的名称,这里指定为 python_env
  • Version: 1.0

    • 指定了 RPM 包的版本号。在后续版本更新中,可以根据需要调整这个数字。
  • Release: 1%{?dist}

    • 定义了 RPM 包的发布版本,1 表示初次发布,%{?dist} 会自动添加当前的发布版本分发标记(如 .el7 表示适用于 CentOS 7)。
  • Summary: Python Environment Package

    • 这是一个简短的描述,用于概括 RPM 包的内容。
  • License: YourLicense

    • 指定了软件包的许可证。这里应替换为实际的许可证名称(如 MITGPL 等)。
  • Source0: %{name}-%{version}.tar.gz

    • 定义了源代码文件的名称,通常与 SPEC 文件同名,格式为 Name-Version.tar.gz%{name}%{version} 会分别替换为 python_env1.0,因此实际值为 python_env-1.0.tar.gz

包的详细描述

  • %description
    • 该字段提供了包的详细描述,将会显示在 RPM 的信息中。这里说明此包包含了 Python 环境及其依赖项。

构建和安装过程

  • %prep

    • 这个部分用于准备构建环境,通常会执行一些解压缩或预处理操作。此例中,注释提到可以在此处解压环境包,但没有实际命令。
  • %build

    • 定义了构建过程中需要执行的操作,例如编译代码。但对于不需要编译的包,这部分可以为空。
  • %install

    • 在安装阶段中,指定了将内容安装到目标目录的操作。
    • tar -xzvf %{SOURCE0} -C %{buildroot}/opt/python/:将 Source0(即 python_env-1.0.tar.gz)解压到安装路径中,以便包含完整的 Python 环境。

包含的文件

  • %files
    • 指定在安装包中包含哪些文件。
    • /opt/python_env/*:将 /opt/python_env/ 中的所有内容添加到最终生成的 RPM 包中。

变更日志

  • %changelog
    • 记录包的变更历史。每条日志包括日期、作者、版本及更新说明。在此例中:
      • 日期是 2024 年 11 月 12 日
      • 作者是 Your Name <youremail@example.com>
      • 更新描述是 “Initial package for Python environment”,表示首次打包。

这个 SPEC 文件的作用是将 Python 环境打包为一个 RPM,安装时会解压到指定目录,并可方便安装在其他系统上。

1.3 准备 Python 环境

可以使用 virtualenvvenv 来创建 Python 虚拟环境,并安装所需的库,然后将整个环境打包为 .tar.gz 文件,例如:

# 创建python3虚拟环境
python3 -m venv python_env【要创建的虚拟环境名称(也就是到时候打包的名称)】
# 激活python3虚拟环境
source python_env/bin/activate
# 然后就可以在虚拟环境里安装需要的东西了。

安装完之后,就可以退出虚拟环境打包了;

# 打包python虚拟环境格式为:包名-版本.tar.gz(版本为spec文件里写的版本)
tar -czvf python_env-1.0.tar.gz python_env
# 将打好的包移动到rpmbuild/SOURCES/下,用于打包rpm文件
mv python_env-1.0.tar.gz ~/rpmbuild/SOURCES/

1.4 构建 RPM 包

使用以下命令在 rpmbuild 环境中创建 RPM 包:

rpmbuild -ba ~/rpmbuild/SPECS/python_env.spec

执行后,生成的 RPM 包会保存在 ~/rpmbuild/RPMS/noarch/ 目录中。

noarch是根据你系统生成的,x86的就是x86_64

1.5 安装、卸载 RPM 包

首先要将打的rpm包上传到服务器上;

1.5.1 安装rpm包

默认安装路径是你写的SPEC文件里的路径【本文是/opt/】

rpm -ivh python_env-1.0-1.noarch.rpm
# 强制安装
rpm -ivh python_env-1.0-1.noarch.rpm --nodeps

1.5.2 查找刚刚安装rpm包

rpm -qa | grep python_env-1.0

1.5.3 卸载刚刚安装的rpm包

rpm -e python_env-1.0-1.x86_64
# 强制卸载
rpm -e python_env-1.0-1.x86_64 --nodeps

二、使用rpmbuild将docker离线安装包打成rpm包

在使用 rpmbuilddocker离线安装包打包成 RPM 文件之前,需要确保已经安装 rpmbuild 工具,并配置好相关的 RPM 打包环境。以下是具体的步骤和说明:

2.1 准备打包环境

首先,确保安装了 rpmbuild,可以通过以下命令安装:

sudo yum install rpm-build -y
# 安装 rpmdevtools
yum install rpmdevtools

rpmdevtools为开发者提供了极大的便利,用于制作RPM包,涵盖了从创建rpmbuild开发树、MD5验证、spec文件的生成,到解压归档文件、归档文件前后版本对比diff等一系列功能。

创建打包文件夹

创建打包文件夹有两种方法:

方法一:使用命令 rpmdev-setuptree 来创建,但是创建的文件夹是在用户主目录(home)如果是root就是在(root)下,我们可以将rpmbuild整个文件夹拷贝到项目文件夹,这样可以方便我们项目管理。

方法二:手动的去创建文件夹,具体文件夹结构可以参考下面的目录树

# 方法一:使用命令创建
rpmdev-setuptree# 方法二:手动创建文件夹
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}# 目录树
rpmbuild- BUILD           // 编译时用到的暂存目录- RPMS            // 打包后生成的 rpm 包会放在这里- SOURCES         // 源码压缩包- SPECS           // 放 xx.spec 文件- SRPMS           // 打包后生成的 srpm 包会放在这里 

2.2 创建 docker 安装包的 SPEC 文件

~/rpmbuild/SPECS 目录中创建一个 .spec 文件,用于定义 RPM 包的相关信息,例如 docker.spec。以下是一个基本的 spec 文件模板:

或者使用rpmdev-newspec docker.spec命令创建*.spec模板

Name: docker
Version: 24.0.5
Release: 1%{?dist}
Summary: docker install PackageLicense: MIT
# 尽量不要使用中文名
Source0: %{name}%{version}.zip%description
This install docker package.%prep
# 这里可以解压环境包%build
# 打包需要的构建操作可以在这里定义%install
# 假设你已经将把docker安装包已经打好了为.zip文件,将其解压到 /opt/
unzip  %{SOURCE0} -d %{buildroot}/opt/%files
/opt/docker24.0.5/*%changelog
* Tue Nov 14 2024 Your Name <youremail@example.com> - 1.0-1
- Initial package for Python environment

2.3 准备 docker安装包 环境

将docker的安装包放到rpmbuild/SOURCES/

# 复制过去
cp -ar docker24.0.5.zip ~/rpmbuild/SOURCES/
# 或者移动过去
mv docker24.0.5.zip ~/rpmbuild/SOURCES/

2.4 构建 RPM 包

使用以下命令在 rpmbuild 环境中创建 RPM 包:

rpmbuild -ba ~/rpmbuild/SPECS/docker.spec

执行后,生成的 RPM 包会保存在 ~/rpmbuild/RPMS/noarch/ 目录中。

noarch是根据你系统生成的,x86的就是x86_64

2.5 安装、卸载 RPM 包

首先要将打的rpm包上传到服务器上;

2.5.1 安装rpm包

默认安装路径是你写的SPEC文件里的路径【本文是/opt/】

rpm -ivh docker-24.0.5-1.nfs.x86_64.rpm
# 强制安装
rpm -ivh docker-24.0.5-1.nfs.x86_64.rpm --nodeps

2.5.2 查找刚刚安装rpm包

rpm -qa | grep docker-24.0.5

2.5.3 卸载刚刚安装的rpm包

rpm -e docker-24.0.5-1.nfs.x86_64
# 强制卸载
rpm -e docker-24.0.5-1.nfs.x86_64 --nodeps

三、相关文章

文章标题文章链接
Linux如何将文件或目录打成rpm包? – fpm打包详解https://blog.csdn.net/liu_chen_yang/article/details/134270559
Linux如何将文件或目录打成rpm包?-- rpmbuild打包详解https://blog.csdn.net/liu_chen_yang/article/details/143715019

🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗

相关文章:

Linux如何将文件或目录打成rpm包?-- rpmbuild打包详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…...

RabbitMQ-死信队列(golang)

1、概念 死信&#xff08;Dead Letter&#xff09;&#xff0c;字面上可以理解为未被消费者成功消费的信息&#xff0c;正常来说&#xff0c;生产者将消息放入到队列中&#xff0c;消费者从队列获取消息&#xff0c;并进行处理&#xff0c;但是由于某种原因&#xff0c;队列中的…...

爬虫开发工具与环境搭建——环境配置

第二章&#xff1a;爬虫开发工具与环境搭建 第二节&#xff1a;环境配置 在进行爬虫开发之前&#xff0c;首先需要配置好开发环境。一个良好的开发环境不仅能提高开发效率&#xff0c;还能避免因环境不一致带来的问题。以下是环境配置的详细步骤&#xff0c;涵盖了Python开发…...

15.UE5等级、经验、血条,魔法恢复和消耗制作

2-17 等级、经验、血条、魔法消耗_哔哩哔哩_bilibili 目录 1.制作UI&#xff0c;等级&#xff0c;经验&#xff0c;血条 ​2.为属性面板绑定角色真实的属性&#xff0c;实现动态更新 3.魔法的消耗和恢复 1.制作UI&#xff0c;等级&#xff0c;经验&#xff0c;血条 创建控…...

【Homework】【5】Learning resources for DQ Robotics in MATLAB

Lesson 5 代码-TwoDofPlanarRobot.m 表示一个 2 自由度平面机器人。该类包含构造函数、计算正向运动学模型的函数、计算平移雅可比矩阵的函数&#xff0c;以及在二维空间中绘制机器人的函数。 classdef TwoDofPlanarRobot%TwoDofPlanarRobot - 表示一个 2 自由度平面机器人类…...

vue3中 ref和reactive的区别

ref的主要作用 ref 函数接受的参数数据类型可以是原始数据类型也可以是引用数据类型。在模板中使用 ref 时&#xff0c;我们不需要加 .value&#xff0c;因为当 ref 在模板中作为顶层属性被访问时&#xff0c;它们会被自动解包&#xff0c; <p>count: {{ count }}</…...

第十四章 Spring之假如让你来写AOP——雏形篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

群控系统服务端开发模式-应用开发-前端个人资料开发

一、总结 其实程序开发到现在&#xff0c;简单的后端框架就只剩下获取登录账号信息及获取登录账号菜单这两个功能咯。详细见下图&#xff1a; 1、未登录时总业务流程图 2、登录后总业务流程图 二、获取登录账号信息对接 在根目录下src文件夹下store文件夹下modules文件夹下的us…...

动态规划技巧点

动规五部曲&#xff08;来自b站卡哥&#xff09;&#xff1a;1、确定DP数组中i、j…的含义。2、确定DP推导式。3、DP数组初始化。4、DP数组遍历顺序。5、DP数组打印校验。 父问题、子问题有些许区别&#xff1a;LeetCode343.整数拆分 今天在哔哩哔哩上刷到了一个非常有意思的l…...

深度学习之pytorch常见的学习率绘制

文章目录 0. Scope1. StepLR2. MultiStepLR3. ExponentialLR4. CosineAnnealingLR5. ReduceLROnPlateau6. CyclicLR7. OneCycleLR小结参考文献 https://blog.csdn.net/coldasice342/article/details/143435848 0. Scope 在深度学习中&#xff0c;学习率&#xff08;Learning R…...

Spring Boot集成SQL Server快速入门Demo

1.什么是SQL Server&#xff1f; SQL Server是由Microsoft开发和推广的以客户/服务器&#xff08;c/s&#xff09;模式访问、使用Transact-SQL语言的关系数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的&…...

低代码牵手 AI 接口:开启智能化开发新征程

一、低代码与 AI 接口的结合趋势 低代码开发平台近年来在软件开发领域迅速崛起。随着企业数字化转型的需求不断增长&#xff0c;低代码开发平台以其快速构建应用程序的优势&#xff0c;满足了企业对高效开发的需求。例如&#xff0c;启效云低代码平台通过范式化和高颗粒度的可配…...

【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题

问题描述&#xff1a; 在实操中&#xff0c;git push代码到github上一直提示输入用户名及密码&#xff0c;并且跳出的输入框输入用户名和密码后&#xff0c;报错找不到远程仓库 实际解决中&#xff0c;发现我环境有两个问题解决&#xff1a; git push一直提示输入用户名及密码…...

python语言基础-4 常用模块-4.13 其他模块

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 4.13 其他模块 除此之外python中还有大量的功能模块&#xff0c;如&#xff1a; pill…...

微信小程序=》基础=》常见问题=》性能总结

文章目录 微信小程序开发应用 实例小程序生命周期 以及 各生命周期应用实例小程序图片 展示方案 小程序打包应用方案技术细节&#xff08;分包应用实例&#xff09;技术细节&#xff08;压缩处理&#xff09;一、准备工作二、JavaScript 代码压缩三、WXML 文件优化&#xff08…...

JWT深度解析:Java Web中的安全传输与身份验证

标题&#xff1a;JWT深度解析&#xff1a;Java Web中的安全传输与身份验证 引言 JSON Web Token&#xff08;JWT&#xff09;是一种轻量级的身份验证和授权标准&#xff0c;它允许在各方之间安全地传输信息。在Java Web开发中&#xff0c;JWT因其无状态、可扩展性和跨域支持而…...

使用Java爬虫获取商品订单详情:从API到数据存储

在电子商务日益发展的今天&#xff0c;获取商品订单详情成为了许多开发者和数据分析师的需求。无论是为了分析用户行为&#xff0c;还是为了优化库存管理&#xff0c;订单数据的获取都是至关重要的。本文将详细介绍如何使用Java编写爬虫&#xff0c;通过API获取商品订单详情&am…...

Mybatis中批量插入foreach优化

数据库批量入库方常见方式&#xff1a;Java中foreach和xml中使用foreach 两者的区别&#xff1a; 通过Java的foreach循环批量插入&#xff1a; 当我们在Java通过foreach循环插入的时候&#xff0c;是一条一条sql执行然后将事物统一交给spring的事物来管理&#xff08;Transa…...

Word VBA如何间隔选中多个(非连续)段落

实例需求&#xff1a;Word文档中的有多个段落&#xff0c;段落总数量不确定&#xff0c;现在需要先选中所有基数段落&#xff0c;即&#xff1a;段落1&#xff0c;段落3 … &#xff0c;然后一次性设置粗体格式。 也许有的读者会认为这个无厘头的需求&#xff0c;循环遍历遍历文…...

Linux系统常用操作与命令指南

一、快捷分类 1、移动光标 h&#xff0c; j&#xff0c; k&#xff0c; l 左&#xff0c; 下&#xff0c; 上&#xff0c; 右 Ctrl-F:下翻一页 Ctrl-B:上翻一页 Ctrl-U:上翻半页 Ctrl-d:下翻半页 0:跳至行首&#xff0c;不管有无缩进&#xff0c;就是跳到第0个字…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...