RPM .spec如何逃避preun和postun?

时间:2018-03-02 08:52:50

标签: rpm rpmbuild rpm-spec

我已经构建了一个package_version_1.rpm。现在我试图建立一个package_version_2.rpm。 RPM的默认行为将从package_version_1.rpm中删除未从package_version_2.rpm升级的package_version_1.rpm中的任何文件。要实现我想要的东西,我必须安装这样的包:

sudo rpm -i --nopreun --nopostun package_version_2.rpm

但这不是我想要的。我正在寻找一个解决方案来逃避.spec文件中的preun和postun。

经过一些研究之后(以及ofc几乎所有关于stackoverflow的帖子都有关键字“RPM .spec preun postun”):

http://meinit.nl/rpm-spec-prepostpreunpostun-argument-values https://www.ibm.com/developerworks/library/l-rpm2/

我发现使用该命令:rpm --showrc打印出所有宏。我将它们导出到txt文件以便于搜索,我尝试进行实验。我在preun和postun创建案例,我试图找到一个解决方案,以便在升级时禁用preun和postun。我尝试了所有可能的想法,但我没有运气。

在案例部分,您可以看到我的一些尝试...

%define debug_package %{nil}
%global _python_bytecompile_errors_terminate_build 0
%define _binaries_in_noarch_packages_terminate_build 0

%preun
# this runs before remove the package
echo '###################################################################'
echo 'Run preun package_version_1.rpm'
case "$1" in
  0)
    echo 'case 0 preun'
    # This is an uninstallation.
  ;;
  1)
    # %systemd_postun %{nil}
    # systemd_user_preun %{nil}
    echo 'case 1 preun'
    # systemctl --nopreun
    exit 0
  ;;
esac
echo '###################################################################'

%postun
# this runs after the package has be removed
echo '###################################################################'
echo 'Run postun package_version_1.rpm'
case "$1" in
  0)
    echo 'case 0 postun'
    # This is an uninstallation.
  ;;
  1)
    # %systemd_postun %{nil}
    # systemd_user_postun   %{nil}
    echo 'case 1 postun'
    # systemctl --nopostun
    exit 0
  ;;
esac
echo '###################################################################'

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

尝试的一种超级hackish方式:

  • from config import config import sqlalchemy from sqlalchemy import create_engine from sqlalchemy_utils import database_exists, create_database import pandas as pd # useful info for psycopg2: # https://stackoverflow.com/questions/34484066/create-a-postgres-database-using-python class MyDB(object): def __init__(self): self.params = config() def create_new_db(self, newdb): user, host, port = self.params['user'], self.params['host'], self.params['port'] pw = self.params['password'] url = 'postgresql://{}:{}@{}:{}/{}' url = url.format(user, pw, host, port, newdb) self.engine = create_engine(url, client_encoding='utf8') if not database_exists(self.engine.url): create_database(self.engine.url) # print(database_exists(engine.url)) def df2postgres(engine, df): con = engine.connect() df.to_sql(name='records', con=con, if_exists='replace', index=True, chunksize=10) return con if __name__ == '__main__': testdb = MyDB() testdb.create_new_db('testdb') engn = testdb.engine df = pd.read_csv('100_recs.csv', delimiter=';', quotechar='"', encoding='utf-8') con = df2postgres(engine=engn, df=df) dta = con.execute('SELECT * FROM records LIMIT 5;') print(dta.fetchall()) :mypackage = 1.0
  • Requires(pre) scriptlet中:
    • prehere
    • 复制您想要“保持”1.0的文件
  • mkdir -p %{_localstatedir}/lib/rpm-state/mypackage scriptlet中:
    • 将您想要的文件移回原来的位置
    • posttrans临时文件夹

注意:这是不好的并且会破坏一些内容(主要是验证和文件包所有权),因为您实际上是将文件放在rmdir数据库之外的位置。您还需要在两个单独的事务中安装两个软件包版本,而无法从全新的操作系统安装直接进入版本2.