我已经构建了一个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 '###################################################################'
任何帮助将不胜感激
答案 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中:
pre
(here)mkdir -p %{_localstatedir}/lib/rpm-state/mypackage
scriptlet中:
posttrans
临时文件夹注意:这是不好的并且会破坏一些内容(主要是验证和文件包所有权),因为您实际上是将文件放在rmdir
数据库之外的位置。您还需要在两个单独的事务中安装两个软件包版本,而无法从全新的操作系统安装直接进入版本2.