我要实现的压缩版本:从我的source.py源代码创建.rpm和.deb软件包,并确保在将它们安装在基于deb / rpm的linux发行版上时,所有依赖项都得到解析。
更多详细信息:假设我已经创建了一个软件,该软件位于这样的文件夹结构中:
---MyProgram Folder
---MyProgram Folder
---img Folder
---logo.ico File
---media Folder
---head.txt File
---__init__.py File
---source.py File
---a.py File
---LICENSE File
---README.md File
---setup.py File
文件setup.py包含以下内容:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="MyProgram",
version="0.0.1",
author="First Last",
author_email="[email protected]",
description="A tool to create nice things",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://google.com",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.7',
data_files=[
('.../MyProgram/img/logo.ico'),
('.../MyProgram/media/head.txt'),
],
)
我现在跑步
python setup.py sdist bdist_rpm
从'... / MyProgram'下的cmd行。创建了两个文件夹“ dist”和“ build”,以及“ MyProgram.tar.gz”和两个rpm的“ MyProgram-noarch.rpm”和“ MyProgram-src.rpm”。当我尝试在fedora 31下安装'noarch.rpm'时,该过程成功结束,但未创建任何“快捷方式”,并且当我在cmd行中键入MyProgram时,找不到它。
rpm -ql MyFilter
找到它并输出一堆路径:
/usr/lib/python3.7/site-packages/MyProgram/...
/usr/lib/python3.7/site-packages/MyProgram/source.py
/usr/lib/python3.7/site-packages/MyProgram/a.py
....
这告诉我,我的安装至少复制了基本文件系统。但是我也看到所有原始的.py文件仍然是.py文件。
我的问题:
如果解决方案微不足道,而我只是忽略了它,我真的很抱歉打扰您,但是atm我看不到它。具有相关信息并且我已经查看过的网站:
https://docs.python.org/2.0/dist/creating-rpms.html
https://github.com/AppImage/AppImageKit/wiki/Bundling-Python-apps
Python 3.5 create .rpm with pyinstaller generated executable
https://github.com/junaruga/rpm-py-installer
https://packaging.python.org/overview/#python-source-distributions
https://packaging.python.org/overview/
https://pyinstaller.readthedocs.io/en/stable/usage.html
https://pyinstaller.readthedocs.io/en/stable/installation.html
https://python-packaging-tutorial.readthedocs.io/en/latest/setup_py.html
bdist_rpm
选项似乎很简单,但是您几乎无法控制它生成/使用的.spec
文件的逻辑,并且不能执行诸如片段代码之类的奇特的东西。
即,除非采取让它生成.spec
文件并退出的方法(而不是构建最终RPM)。从docs:
如果您愿意,可以将这三个步骤分开。您可以使用--spec-only选项使bdist_rpm仅创建.spec文件并退出;在这种情况下,.spec文件将被写入“分发目录”,通常为dist /,但可以使用--dist-dir选项进行自定义。 (通常,.spec文件在由bdist_rpm创建的临时目录中的“构建树”中深入显示。)
但是,出于偏好和一致性的考虑,我建议遵循发行版特定的Python应用程序打包指南。
这样,您将更适合您要为其构建的发行版。
尽管这不是最简单的方法。您将不得不切换一些docs。基本上,如果您要构建CentOS / RHEL,则应遵守Fedora的包装准则。
您可以找到额外的参考文献here,并带有用于构建同一应用程序的Python 2和3版本的示例.spec
文件。
对于整个“像发行版一样的构建”,您肯定会考虑使用mock
来完成工作,以在chroot中构建您的包。
关于“快捷方式”问题,您必须让setup.py
声明一些控制台脚本,以便它在安装软件包时创建一个。例如。来自lastversion's setup.py:
entry_points={"console_scripts": ["lastversion = lastversion:main"]},
此条目将导致在安装Python软件包时创建/安装“二进制”lastversion
(运行定义的函数)。随后,在规格文件中,宏
%py2_install
将使用setup.py
创建相同的启动程序。然后您就可以通过将启动器放在spec文件的文件部分中来确保打包了启动器:
%files -n python3-myapp %license COPYING %doc README.rst %{python3_sitelib}/%{srcname}/ %{python3_sitelib}/%{srcname}-*.egg-info/ %{_bindir}/myapp