环境准备

  • 安装依赖包
rpmdevtools  rpm-build
yum install -y rpm-build rpmdevtools
  • 初始化rpm pacakge 项目
    主要是rpm 打包的目录结构
使用rpmdev-setuptree 工具

效果如下:

── rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

创建简单pg extension 扩展

具体实现的功能很简单,可以参考github 项目https://github.com/rongfengliang/nvl-pg-extension

  • 代码说明
扩展开发主要是control 以及函数定义
nvlfunc.control
# nvlfunc extension
comment = 'Oracle compatible nvl function'
default_version = '1.0'
module_pathname = '$libdir/nvlfunc'
relocatable = false
sql 函数定义
nvlfunc--1.0.sql
/* nvlfunc--1.0.sql */ -- complain if script is sourced in psql, rather than via ALTER EXTENSION
\echo Use "CREATE EXTENSION nvlfunc" to load this file. \quit CREATE OR REPLACE FUNCTION public.NVL(SMALLINT,SMALLINT)
RETURNS SMALLINT AS $$
SELECT COALESCE($1,$2);
$$ LANGUAGE SQL IMMUTABLE;
Makefile 定义,方便安装(注意pg 版本,可能需要配置path 路径,同时安装pg devel 包)
EXTENSION = nvlfunc
DATA = nvlfunc--1.0.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

rpm spec 编写

/~rpmbuild/SPECS 路径

  • 代码
Name: nvl-pg-extension
Version: 1.0
Release: 1%{?dist}
Summary: this is a postgresql extension nvl function just like oracle
License: APACHE
URL: https://github.com/rongfengliang/postgres-extension-demo
// 使用源码打包rpm 包
Source: https://github.com/rongfengliang/nvl-pg-extension/archive/v1.0.zip %prep
%setup -q %description
this is a postgresql extension nvl function just like oracle %install
%{make_install} PREFIX=%{_prefix} %files
/usr/pgsql-10/share/extension/nvlfunc--1.0.sql
/usr/pgsql-10/share/extension/nvlfunc.control

打包rpm 包

  • 下载source
spectool -g -R ~/rpmbuild/SPECS/nvl-pg-extension.spec
  • 打包rpm 包
rpmbuild -bb ~/rpmbuild/SPECS/nvl-pg-extension.spec
  • 效果
spectool -g -R ~/rpmbuild/SPECS/nvl-pg-extension.spec
Getting https://github.com/rongfengliang/nvl-pg-extension/archive/v1.0.zip to /root/rpmbuild/SOURCES/v1.0.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 133 0 133 0 0 72 0 --:--:-- 0:00:01 --:--:-- 72
0 0 0 1119 0 0 174 0 --:--:-- 0:00:06 --:--:-- 306
rpmbuild -bb ~/rpmbuild/SPECS/nvl-pg-extension.spec
执行(%prep): /bin/sh -e /var/tmp/rpm-tmp.uCoCHD
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf nvl-pg-extension-1.0
+ /usr/bin/unzip -qq /root/rpmbuild/SOURCES/v1.0.zip
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd nvl-pg-extension-1.0
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
执行(%install): /bin/sh -e /var/tmp/rpm-tmp.YBV39p
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64
+ cd nvl-pg-extension-1.0
+ /usr/bin/make install DESTDIR=/root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64 PREFIX=/usr
/usr/bin/mkdir -p '/root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64/usr/pgsql-10/share/extension'
/usr/bin/mkdir -p '/root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64/usr/pgsql-10/share/extension'
/usr/bin/install -c -m 644 .//nvlfunc.control '/root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64/usr/pgsql-10/share/extension/'
/usr/bin/install -c -m 644 .//nvlfunc--1.0.sql '/root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64/usr/pgsql-10/share/extension/'
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/nvl-pg-extension-1.0
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 0 CRC32s did match.
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
处理文件:nvl-pg-extension-1.0-1.el7.x86_64
Provides: nvl-pg-extension = 1.0-1.el7 nvl-pg-extension(x86-64) = 1.0-1.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
处理文件:nvl-pg-extension-debuginfo-1.0-1.el7.x86_64
Provides: nvl-pg-extension-debuginfo = 1.0-1.el7 nvl-pg-extension-debuginfo(x86-64) = 1.0-1.el7
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64
写道:/root/rpmbuild/RPMS/x86_64/nvl-pg-extension-1.0-1.el7.x86_64.rpm
写道:/root/rpmbuild/RPMS/x86_64/nvl-pg-extension-debuginfo-1.0-1.el7.x86_64.rpm
执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.Ya1lDM
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd nvl-pg-extension-1.0
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/nvl-pg-extension-1.0-1.el7.x86_64
+ exit 0
── BUILD
│ └── nvl-pg-extension-1.0
│ ├── debugfiles.list
│ ├── debuglinks.list
│ ├── debugsources.list
│ ├── elfbins.list
│ ├── Makefile
│ ├── nvlfunc--1.0.sql
│ └── nvlfunc.control
├── BUILDROOT
├── RPMS
│ └── x86_64
│ ├── nvl-pg-extension-1.0-1.el7.x86_64.rpm
│ └── nvl-pg-extension-debuginfo-1.0-1.el7.x86_64.rpm
├── SOURCES
│ └── v1.0.zip
├── SPECS
│ └── nvl-pg-extension.spec
└── SRPMS

安装&&使用rpm 包

  • 安装rpm包
yum install -y  nvl-pg-extension-1.0-1.el7.x86_64.rpm

效果

yum install -y nvl-pg-extension-1.0-1.el7.x86_64.rpm
已加载插件:fastestmirror
正在检查 nvl-pg-extension-1.0-1.el7.x86_64.rpm: nvl-pg-extension-1.0-1.el7.x86_64
nvl-pg-extension-1.0-1.el7.x86_64.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 nvl-pg-extension.x86_64.0.1.0-1.el7 将被 安装
--> 解决依赖关系完成 依赖关系解决 =======================================================================================================================
Package 架构 版本 源 大小
=======================================================================================================================
正在安装:
nvl-pg-extension x86_64 1.0-1.el7 /nvl-pg-extension-1.0-1.el7.x86_64 435 事务概要
=======================================================================================================================
安装 1 软件包 总计:435
安装大小:435
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : nvl-pg-extension-1.0-1.el7.x86_64 1/1
验证中 : nvl-pg-extension-1.0-1.el7.x86_64 1/1 已安装:
nvl-pg-extension.x86_64 0:1.0-1.el7 完毕!

pg 扩展目录

find /usr/pgsql-10/share/extension/ -name nvlfunc.control
/usr/pgsql-10/share/extension/nvlfunc.control
  • 使用
CREATE EXTENSION nvlfunc;
SELECT NVL(NULL::SMALLINT, 121::SMALLINT);
nvl
-----
121
(1 row)

说明

就是一个简单的学习测试,实际上基于pg 的扩展模型我们可以开发很多强大的功能

参考资料

https://github.com/rongfengliang/nvl-pg-extension
https://github.com/rongfengliang/postgres-extension-demo
https://github.com/rongfengliang/pg-extension-rpm-package

 
 
 
 

使用rpm 打包开发的postgres extension的更多相关文章

  1. 使用deb 打包开发的postgres extension

    昨天写过一个使用rpm 打包分发pg 扩展的demo,今天使用deb 进行打包分发,同时使用checkinstall 生成我们的deb包 安装deb 依赖 sudo apt-get install c ...

  2. 使用deb 打包开发的postgres extension 另外一种方法

    已经写过一个deb 包打包的方法,我们同时也可以使用dpkg-deb 命令 安装依赖工具包 推荐安装全点的 sudo apt-get install build-essential autoconf ...

  3. 用 RPM 打包软件,第 1 部分

    http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/ RPM(Red Hat Package Manager ...

  4. 【centos7常用技巧】RPM打包

    一.RPM打包的目的 1.当目标机中不存在编译环境时,可以先在本地环境中编译打包,然后直接在目标机中用rpm -ivh *.rpm安装即可. 2.当需要在目标机中安装多个软件或者增加多个文件时,可以将 ...

  5. Centos6_64 rpm打包实践

    安装rpmbuild sudo yum install rpm-build 普通用户的配置 /home/you/rpmbuild/ 假设是要构建rpm的目录 先说说rpmbuild有什么用,给一个例子 ...

  6. rpm打包过程

    [需求] 接触那么久的Linux,还没有试验过怎么打rpm包 [过程] 1.rpm打包准备工作 系统默认的rpmbuild的相关路径

  7. linux 版本控制及rpm打包

    版本控制 subversion:是一个自由/开源的版本控制系统,在subversion管理下,文件和目录可以超越时空subversion允许你数据恢复到早期版本,或者是检查数据修改历史许多人将版本控制 ...

  8. RPM打包原理、示例、详解及备查

    原文地址:https://blog.csdn.net/qq_16542775/article/details/80961213 RPM(Redhat Package Manager)是用于Redhat ...

  9. RPM打包原理、示例、详解及备查( 转)

    RPM(Redhat Package Manager)是用于Redhat.CentOS.Fedora等Linux 分发版(distribution)的常见的软件包管理器.因为它允许分发已编译的软件,所 ...

随机推荐

  1. 《温故而知新》JAVA基础四

    类的封装 定义:将类的一些信息隐藏起来,不允许外部的程序直接的访问,而是通过该类提供的一些方法来获取 好处:只能通过特定的法方法访问数据,保护了数据, 实现封装的步骤: 修改属性的可见性:(一般类属性 ...

  2. Vue:(一)概况

    Vue:https://cn.vuejs.org/ (一)Vue概况 Vue本身并不是一个框架 Vue结合周边生态构成一个灵活的.渐进式框架 声明式渲染 组件系统 客户端路由 状态管理 构建工具 (二 ...

  3. linux 因内存不足而 kill 掉 java 程序

    grep "Out of memory" /var/log/messages Sep 17 16:13:34 xxxaaa kernel: Out of memory: Kill ...

  4. SpingBoot全局异常处理器被覆盖的解决办法

    @controllerAdvice()注解 @ControllerAdvice()注解可以定义一个统一的异常处理类,我们可以定义多个统一异常处理类, 但这里我们需要注意一点,默认的@Controlle ...

  5. 1.6 安全认证与授权(springboot与安全)

    引言:以下文档是学习尚硅谷关于springboot教学视频后整理而来! 一.安全 认证(Authentication):证明你是谁? 授权(Authorization):你能干什么? 参考资料: Sp ...

  6. webpack.optimize.UglifyJsPlugin配置说明

    https://segmentfault.com/a/1190000008995453?utm_source=tuicool&utm_medium=referral

  7. Cassandra集群:一,搭建一个三节点的集群

    环境准备 JDK1.8 http://download.oracle.com/otn/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8 ...

  8. CUDA 例程

    scalar add #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include &l ...

  9. liunx文件操作 文件压缩

    文件备份和压缩命令 在Linux中,常用的文件压缩工具有gzip,bzip2,zip. 'bzip2'是最理想的压缩工具,它提供了最大限度的压缩. 'zip'兼容好,windows也支持. bzip2 ...

  10. ACM-ICPC 2018 南京赛区网络预赛B

    题目链接:https://nanti.jisuanke.com/t/30991 Feeling hungry, a cute hamster decides to order some take-aw ...