环境准备

  • 安装依赖包
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. vue-路由懒加载

    将import ... from..改为 const Foo = resolve => require(['./Foo.vue'], resolve)

  2. MDK C++编程说明

    1.汇编启动文件的[WEAK]声明仅对C文件符号有效,所以我们编写外设中断服务方法时应该写在C文件中,或者在CPP文件中使用exetrn "C" { }修饰符. 2.C编译器不能直 ...

  3. spoj1433 KPSUM

    题意:略: 首先知道10,20,......100,200,1000的前面的符号都是负号. 举具体例子:221时,计算过程为 000-009,     010-019,   020-029...... ...

  4. edu30F. Forbidden Indices

    题意:给你一个字符串s有一些位置被ban了,字符串t的价值是|t|*t在s中出现次数而且终点没有被ban.问你最大的价值是多少 题解:很明显t是s子串,建个sam,对于sam中每个位置,我们需要删除中 ...

  5. django内置的认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  6. Win10系列:C#应用控件基础11

    RichEditBox控件 富文本格式是一种跨平台的文档格式,在这种格式的文档中可以编辑文本.图片.链接等内容.通过RichEditBox控件可以对富文本格式的文档进行编辑. 在XAML文件中,Ric ...

  7. angularjs checkbox

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. php解析Excel表格并且导入MySQL数据库

    最近根据客户需求,需要增加一个导入Excel表格的功能,Excel中存放的是知识库中医知识的分类体系目录.是在thinkphp框架下编写的代码,用的是phpexcel第三方包.测试环境用的是xampp ...

  9. neutron之neutron_openvswitch_agent占用100%CPU资源问题

    基于kolla-ansible部署的queens版本,基于docker stats查看openstack的资源占用,发现neutron_openvswitch_agent一直占用100%CPU资源,这 ...

  10. Linux下的5种I/O模型(转)

    Linux下的五种I/O模型: l         阻塞I/O l         非阻塞I/O l         I/O复用(select.poll.epoll) l         信号驱动I/ ...