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

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

👨‍🎓博主简介

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


文章目录

  • 前言
  • 说明 -- fpm参数及解析
  • 一、安装fpm命令
    • 1.1 安装 ruby 环境
    • 1.2 更换 gem 源为阿里源
    • 1.3 安装 fpm
  • 二、将文件打成rpm包
  • 三、安装、卸载rpm包
    • 3.1 安装rpm包
    • 3.2 查找刚刚安装rpm包
    • 3.3 卸载刚刚安装的rpm包
  • 四、错误整理
    • 2.1 ERROR: Error installing fpm: rexml requires Ruby version >= 2.5.0.
    • 2.2 /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- json (LoadError)

前言

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

本文已docker离线包目录为例子,将其打成rpm包,并在新的服务器上安装;

操作系统为:Centos 7.6

说明 – fpm参数及解析

  • fpm的功能就是将一种类型的包转换成另一种类型

  • fpm支持的源类型包:

原类型包解析
dir将目录打包成所需要的类型用于源码编译安装的软件包
rpm对rpm进行转换
gem对rubygem包进行转换;
python将python模块打包成相应的类型
  • fpm支持的目标类型包:
目标类型包解析
rpm转换为rpm包
deb转换为deb包
solari转换为solaris包
puppet转换成pupper包
  • fpm常用参数:
参数参数解析
-s指定源类型
-t指定目标类型,即想要制作什么包
-n指定包的名字
-v指定包的版本号
-c指定打包的相对路径
-d指定依赖于哪些包
-f第二次包时目录下如果有同名安装包存在,则覆盖它
-p制作的rpm安装包存放路径,不指定就在当前目录下
–post-install软件包安装完成之后所要运行的脚本
–post-uninstall软件包卸载完成之后所要运行的脚本
–pre-install软件包安装完成之前所要运行的脚本
–pre-uninstall软件包卸载完成之前所要运行的脚本
–prefix制作好的rpm包默认安装路径

一、安装fpm命令

1.1 安装 ruby 环境

fpm 是 ruby语法写的一种定制 rpm 包的工具,所以安装 fpm 之前,需要安装 ruby 环境。

官方地址:Download RubyGems | RubyGems.org | your community gem host

阿里源地址:rubygems镜像_rubygems下载地址_rubygems安装教程-阿里巴巴开源镜像站

yum -y install ruby rubygems ruby-devel  rpm-build rpmdevtools git rubygem-json

1.2 更换 gem 源为阿里源

# 查看默认源
[root@localhost ~]# gem sources
*** CURRENT SOURCES ***https://rubygems.org/# 移除默认源
[root@localhost ~]# gem sources --remove https://rubygems.org/
https://rubygems.org/ removed from sources# 添加阿里源
[root@localhost ~]# gem sources -a https://mirrors.aliyun.com/rubygems/
https://mirrors.aliyun.com/rubygems/ added to sources# 再次查看是否更换成功
[root@localhost ~]# gem sources
*** CURRENT SOURCES ***https://mirrors.aliyun.com/rubygems/#可以看到已经更新成阿里源了

1.3 安装 fpm

gem install fpm

如下截图,及安装成功;

在这里插入图片描述

安装成功。

二、将文件打成rpm包

fpm -s dir -t rpm -n 软件名称 -v 版本号 --prefix=rpm安装的路径 ./打包文件名

注:执行fpm打包命令前,进入打包目标的上一级目录。

[root@localhost ~]# fpm -s dir -t rpm -n docker -v 1.0 --prefix=/root/docker/ nvidia-docker
Created package {:path=>"docker-1.0-1.x86_64.rpm"}

-s:指定要打成rpm包的源类型,目录:-s dir

-t:知道要将目录制作成什么类型的文件,-t rpm

-n: 指定软件、包的名称

-v: 指定该包的版本号

–prefix:指定制作好的rpm包的安装路径,在新的服务器上安装会直接安装到此目录;

./:最后就是指定要打包的目录。

三、安装、卸载rpm包

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

3.1 安装rpm包

rpm -ivh docker-1.0-1.x86_64.rpm

3.2 查找刚刚安装rpm包

rpm -qa | grep docker-1.0-1.x86_64

3.3 卸载刚刚安装的rpm包

rpm -e docker-1.0-1.x86_64

四、错误整理

2.1 ERROR: Error installing fpm: rexml requires Ruby version >= 2.5.0.

  • 报错信息:
# 安装fpm时报错
[root@localhost ~]# gem install fpm
ERROR:  Error installing fpm:rexml requires Ruby version >= 2.5.0.
  • 问题分析:

此问题报错说的是ruby 的版本必须>=2.5.0,我们可以先看看我们的ruby版本

[root@localhost ~]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

可以看到是2.0.0版本,所以,需要升级一下ruby版本

  • 问题解决:
#1. 离线安装 rvm:
# rvm 是用来管理 ruby 的,而 ruby 的其中一个“程序”叫 rubygems,也就是我们用它装 fpm 的,手动装各种库用 gem。
[root@localhost ~]# curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz#2. 解压 rvm 包:
[root@localhost ~]# tar -xzvf rvm-stable.tar.gz#3. 进入解压目录,安装 rvm:
[root@localhost ~]# cd rvm-rvm-6bfc921/
[root@localhost rvm-rvm-6bfc921]# ./install --auto-dotfiles#4. 重新加载 rvm:
[root@localhost rvm-rvm-6bfc921]# source /usr/local/rvm/scripts/rvm#5. 查看 rvm 可安装版本:
[root@localhost rvm-rvm-6bfc921]# rvm list known#6. 选择安装 ruby 2.6.3:
# 下载安装过程比较慢,请耐心等待
[root@localhost rvm-rvm-6bfc921]# rvm install 2.6.3#7. 设置默认使用 ruby 版本:
[root@localhost rvm-rvm-6bfc921]# rvm use 2.6.3 --default
Using /usr/local/rvm/gems/ruby-2.6.3
[root@nginx01 rvm-rvm-6bfc921]# ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

​ 可以看到 ruby 已升级至 2.6.3。再次执行 gem install fpm -v 1.3.3,就不会再报这个错误了,一会就安装完成了。

2.2 /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:54:in `require’: cannot load such file – json (LoadError)

  • 报错信息:
[root@localhost ~]# gem install fpm
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- json (LoadError)
  • 问题分析:

这个错误通常表示你的 Ruby 环境缺少一个名为 “json” 的 gem(Ruby库)。要解决这个问题,你可以按照以下步骤来修复:

  1. 确保 Ruby 版本已安装:首先,请确保你的系统上已经安装了 Ruby。你可以在终端中运行以下命令来检查 Ruby 版本:

    ruby -v
    

    如果 Ruby 未安装或者版本较旧,建议更新到较新的版本。

  2. 安装 JSON Gem:要解决这个问题,你需要安装 json gem。在终端中执行以下命令:

    gem install json
    

    这将安装 json gem 到你的 Ruby 环境中。

  3. 检查 Gemfile:如果你的项目使用了 Gemfile 来管理 gem 依赖,确保你在 Gemfile 中有 json gem 的引用,并且运行 bundle install 来安装所需的 gem。

  4. 检查 Ruby 环境:确保你的 Ruby 环境设置正确。有时,可能需要切换到正确的 Ruby 版本或环境。你可以使用工具如 RVM(Ruby Version Manager)或 rbenv 来管理不同的 Ruby 环境。

  5. 检查加载路径:确保 Ruby 可以找到 json gem。有时,你可能需要在代码中添加 require 'json' 来明确指定加载这个 gem。

  • 问题解决:
# 安装json
gem install json

即可解决。

相关文章:

  • docker容器快速安装启动ES
  • Hylicos - MINI2440 - 中断控制
  • kotlin $ (字符串模版)的使用
  • yarn的安装及使用教程
  • C# wpf利用Clip属性实现截屏框
  • C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景
  • 一文(10图)了解Cornerstone3D核心概念(万字总结附导图)
  • 【Emotion】 自动驾驶最近面试总结与反思
  • 【深度学习】BasicSR训练过程记录,如何使用BasicSR训练GAN
  • elastic search入门
  • 为什么 HTTPS 协议能保障数据传输的安全性?
  • 【Unity学习笔记】New Input System 部分源码和测试用例补充
  • 数学建模学习笔记||层次分析法
  • C# 创建多线程的函数
  • LeetCode59 螺旋矩阵 II
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Android系统模拟器绘制实现概述
  • css的样式优先级
  • exports和module.exports
  • iOS编译提示和导航提示
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript 基本功--面试宝典
  • Median of Two Sorted Arrays
  • Redis 懒删除(lazy free)简史
  • TypeScript迭代器
  • TypeScript实现数据结构(一)栈,队列,链表
  • 初探 Vue 生命周期和钩子函数
  • 好的网址,关于.net 4.0 ,vs 2010
  • 经典排序算法及其 Java 实现
  • 数据仓库的几种建模方法
  • 说说动画卡顿的解决方案
  • 我建了一个叫Hello World的项目
  • 赢得Docker挑战最佳实践
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 正则表达式-基础知识Review
  • ​马来语翻译中文去哪比较好?
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (Java)【深基9.例1】选举学生会
  • (zt)最盛行的警世狂言(爆笑)
  • (动态规划)5. 最长回文子串 java解决
  • (二十三)Flask之高频面试点
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET 设计一套高性能的弱事件机制
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET设计模式(11):组合模式(Composite Pattern)
  • [20170705]diff比较执行结果的内容.txt
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [C++]C++入门--引用
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现