setup.pysetup.py真的很难写。不知道谁能完全掌握那东西的写法,我还不是很了解。说几个常用的配置:指定依赖和可选依赖setup(install_requires=["flask","flask-migrate","sqlalchemy"],extras_require={"mysql":["mysqlclient"],"pgsql":["psycopg2"]})注意这两个key是install_requires和extras_require,不要弄错了。另外,如果需要根据条件增减依赖,不要使用INSTALL_REQUIRES=["flask"]ifsys.platform=="win32":INSTALL_REQUIRES.append("pywin32")setup(install_requires=INSTALL_REQUIRES)而是,使用环境标记INSTALL_REQUIRES=["flask","pywin32;sys_platform=='win32'"]setup(install_requires=INSTALL_REQUIRES)释放可执行程序到/binsetup(entry_points={"console_scripts":["mybin=mypackage.main:cli"]})或inisetup(entry_points="""[console_scripts]mybin=mypackage.main:cli""")选择一个。包含数据文件setup(include_package_data=True#readconfigurationfromMANIFEST.in)orsetup(package_data={"":["*.json"]}#includealljsonfiles)指定源代码结构,如果你使用它是src/storage包源码的项目结构,可以是:setup(package_dir={"":"src"})package,上传安装包。我已经编写了这个邪恶的setup.py,我们将发布它。PyPI启动了。第一步是将它打包成一个可分发的文件:$pythonsetup.pysdistbdist_wheel--universal这个命令会生成一个源代码包(SourceDistribution)和一个二进制包(BinaryDistribution)。当然,大多数Python发行版并不真正包含二进制文件,只是遵循通常的软件工程术语。其中bdist_wheel生成的二进制包是wheel格式的(需要安装wheel来打包),--universal表示这个二进制包适用于所有支持的Python版本和ABI,“一处打包,处处使用”,以及生成的文件名类似于:my_package-0.1.0-py3-none-any.whl。如果你的包里有C扩展,也就是打包的wheel会有一个二进制文件,你不能加这个flag。此时生成的文件名类似:my_package-0.1.0-cp38-cp38-win_amd64.whl。这个文件名不是随机的,而是必须遵循一定的规则。下载者可以直接从该文件名中获取该包的基本信息。可能有旧的上传教程。让你直接用pythonsetup.pysdistbdist_wheelregisterupload来打包上传一步到位,这个方法已经过时了,不推荐。正确的方法应该是使用twine工具:$twineuploaddist/*如果想在CI中自动上传,最好生成一个token来使用,访问https://pypi.org/manage/accou...PressPrompt生成token,使用命令指定用户名和密码即可:twineupload--username__token__--password${{secrets.PYPI_TOKEN}}dist/*install将包上传到PyPI后,pipinstallmy-package它是如何安装的?访问https://pypi.org/simple/my-pa...,分析所有链接是否为whl文件,判断是否兼容当前Python版本、ABI、平台,加入候选列表并从tags-python属性中读取data-requires,判断是否兼容当前Python版本,如果是源码包则添加候选列表,直接添加候选列表,最后选择whl文件作为包先在候选列表中安装,下载包到本地,候选包的选择可以通过pipinstall的--only-binary和--no-binary选项来控制。现在可以安装了。如果要安装whl,就很简单了。直接解压(whl文件是zip格式)放到目标目录下即可。除了代码或者二进制,解压后生成的文件还会包含一个my_package-0.1.0.dist-info/目录,里面包含了这个包的元数据信息,比如有哪些文件,文件哈希值,entry_points等。如果要安装的文件是源码包,需要将压缩包解压到一个临时目录,按照包指定的方法编译构建,生成whl文件,然后使用whl安装同样的方法将其放在目标目录中。而这个指定的编译方式,在PEP517提案之前,就是调用pythonsetup.pyinstall命令。PEP517发布后,由PEP517构建后端控制。setuptools不再是唯一的选择。PEP517的内容简单来说就是项目根目录下的pyproject.toml定义了两个特殊的属性(注意:其实还有第三个属性backend-path,当你的backend是Uselocally时。):[build-system]requires=["setuptools>=40.8.0","wheel"]build-backend="setuptools.build_meta:__legacy__"以上是setuptools的PEP517的配置,所以可以直接用PEP517构建老项目。如果你的项目中没有pyproject.toml文件,pip可以自动填充这个默认配置。其中,requires是后端依赖的包列表,build-backend是后端的具体位置。这个后端需要实现几个约定的接口:get_requires_for_build_wheel,构建wheel所需的依赖列表,没有特殊需求一般为空/fileforthewheel文件夹build_wheel,生成wheel文件build_sdist,生成sdist文件通过这些接口,pip和其他可能的前端可以从源代码构建一个wheel。所以源码包中必须包含pyproject.toml。有了PEP517的协议规范,后端和前端可以自由组合,不再需要setuptools。实现PEP517的后端是:Poetry-coreFlit-corepdm-pep517,所以setup不需要写setup.py。py作为元数据定义格式是有问题的:它必须由Python运行,并且不能被静态解析。因为第一点,存在注入恶意代码的可能,所以需要指定一种元数据配置格式。这种格式规范也是最近确定的。下来,就是PEP621,也是用pyproject.toml定义的。而且,PDM已经支持这种配置格式,而且是唯一的。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
