在 setup.py 文件中安装包安装预提交

Install pre-commit on package install in setup.py file

我想,当我用 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没有得到运行。我的灵感主要来自 and this setup.py file in Apache Beam.

有没有人知道如何确保我正在调用我的包的设置以及调用我的自定义命令,运行是 pre-commit install 命令?

你实际上并不想这样做,打包系统非常努力地阻止你这样做。

主要障碍:

  • pip 通常只运行 setup.py 一次 然后将结果缓存为一个 wheel
  • pip 有时会在与您的 git 存储库无关的目录中构建您的包
  • 有时库或工具在安装时不可用(订购)

最后,这样做会颠覆 python 社区的期望——安装不应该 side-effects 除了使包可用

忽略所有这些,您可以继续前进并破解那些试图阻止您的位

粗略的阶段是:

  1. 防止你的包被转移——在尝试转移期间确保退出,pip 将通常退回到只安装而不转移
  2. 尝试找到原始工作目录($PWD 或通过假设 运行 可执行文件
  3. 尝试找到您运行在
  4. 中的git存储库
  5. 最后,确保工具可用

我已经为你完成了所有肮脏的工作,我会强烈建议不要这样做 -- https://github.com/pre-commit/pre-commit-installed


免责声明,我创建了 pre-commit,我还创建了 pre-commit-installed ,但纯粹是为了开玩笑/概念验证