当我用pip install .
安装python包时,我希望运行命令pre-commit install
以及安装文件中的所有其他内容。
这是我尝试执行以下操作的setup.py文件:
from distutils.core import setup
from distutils.command.build import build as _build
from setuptools import find_packages, Command
import subprocess
class InstallPreCommit(Command):
def run(self):
subprocess.run(['pre-commit', 'install'])
# This class handles the pip install mechanism.
class build(_build):
sub_commands = _build.sub_commands
setup(
name="my-pkg",
version="0.0.1",
packages=find_packages(),
install_requires=['pre-commit'],
py_modules=["pkg"],
cmdclass={
'build': build,
'install-pre-commit': InstallPreCommit
}
)
但是,当我运行此程序时,pre-commit install
不会运行。我主要从这篇SO文章和ApacheBeam中的setup.py文件中获得灵感。
有人知道如何确保我调用包的设置以及调用运行pre-commit install
命令的自定义命令吗?
您实际上并不想这样做,并且打包系统非常努力地阻止您这样做
主要障碍:
- pip通常只运行
setup.py
一次,然后将结果缓存为轮子 - pip有时会在与git存储库无关的目录中构建包
- 有时库或工具在安装时不可用(订购(
最后,这样做颠覆了python社区的期望——安装除了使包可用之外不应该有副作用
忽略所有这些,你可以艰难前行,绕过那些试图阻止你的比特
其大致阶段为:
- 防止您的包被推送——在尝试推送的过程中,请确保退出,pip将通常回退到只安装而不推送
- 尝试查找原始工作目录(
$PWD
或通过运行的可执行文件的假设 - 尝试查找正在运行的git存储库
- 最后,确保工具可用
我已经为你做了所有的脏活,我强烈建议不要这样做——https://github.com/pre-commit/pre-commit-installed
免责声明,我创建了预提交,我也创建了安装的预提交,但纯粹是一个笑话/概念验证