环境准备

  • 安装依赖包
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. 字体转换网站——Font Squirrel

    转载自:http://www.5imoban.net/jiaocheng/CSS3_HTML5/2016/0714/1735.html html5之前,只要稍微特殊点的字体,都必须做成图片,以免客户端 ...

  2. Spring.Net —IOC详解

    一. Spring.net中IOC介绍 1. 什么是IOC,控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中 ...

  3. Flask离线文档 --技术文档

    1.预览 2.文档下载 链接:Flask离线文档下载(v1.0.10)提取码:0x0x 

  4. js禁止页面滚动

    开发移动端页面的时候有一个很比较常见的需求,在出现弹窗时,禁止滑动弹窗后面的主体页面.如何实现呢,往下看 js实现整个页面禁止滚动: document.body.addEventListener('t ...

  5. zzw原创_解决Could not chdir to home directory /test/bdctool: Permission denied一例

    1.用命令新建一用户 adduser -d /test/bdctool  -m bdctool 2.用新用户登录,报错:Could not chdir to home directory /test/ ...

  6. asp.net core2.1 bundleconfig.json合并压缩资源文件

    在asp.net core中则可以使用BuildBundlerMinifier来进行css,js的压缩合并 1.使用NuGet安装 BuildBundlerMinifier(也可以在vs中下载安装扩展 ...

  7. vmware 安装 centos7 记录笔记

    1, 安装centos 7, 到阿里云镜像下载centos 7 1.虚拟机的创建: 打开安装好的VMware (如果大家安装的VMware是英文版的也没关系,对号入座即可),选择“文件--->新 ...

  8. rest_framework 之视图

    1. 继承ModelSerilizer,直接指定要序列化的表模型 MySerializers.py from app import models # 继承ModelSerilizer,直接指定要序列化 ...

  9. css 常用布局

    「前端那些事儿」③ CSS 布局方案 我们在日常开发中经常遇到布局问题,下面罗列几种常用的css布局方案 话不多说,上代码! 居中布局 以下居中布局均以不定宽为前提,定宽情况包含其中 1.水平居中 a ...

  10. 显卡、GPU和CUDA简介

    http://blog.csdn.net/wu_nan_nan/article/details/45603299 声明: 本文部分内容来自网络.由于知识有限,有错误的地方还请指正.本帖为自己学习过程的 ...