小能豆

如何在 python 虚拟环境中使用本地 flake8 插件?

py

我正在尝试将一个项目与我编写的flake8插件集成为本地插件(例如不是 PyPI 包),如此处所述该项目使用虚拟环境,既在本地使用,也作为 github 工作流使用。由于 flake8 是从虚拟环境中调用的,因此它找不到该插件,该插件位于项目根目录下的文件夹中。当我手动将插件代码添加到虚拟环境文件夹时,它可以很好地集成,并且 flake8 能够找到并执行它。

该解决方案有点像某种 github pre-commit-config/hook,但我在文档中找不到此用例的任何参考。目前 flake8 在 pre-commit-config 中的配置如下:

  repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.2.0
    hooks:
      - id: debug-statements
  - repo: https://github.com/PyCQA/flake8
    rev: 4.0.1
    hooks:
      - id: flake8
        additional_dependencies: ['dlint']

有没有办法在本地/github 工作流中将我的未打包的 flake8 插件与虚拟环境一起使用?


阅读 23

收藏
2025-01-06

共1个答案

小能豆

要在本地和 GitHub 工作流中将未打包的 Flake8 插件与虚拟环境一起使用,你可以通过以下方法解决这个问题:


解决方法:将未打包插件用作本地插件

Flake8 支持通过配置文件引用本地插件,这不需要将插件打包到 PyPI,也不需要手动将代码复制到虚拟环境。

1. 为插件创建入口点

Flake8 使用 setuptoolsentry_points 来注册插件,即使是本地插件也需要一个入口点。

在项目中添加一个 setup.cfgpyproject.toml 文件(如果没有的话),并定义 Flake8 插件的入口点:

示例 setup.cfg
[flake8:local-plugins]
extension =
    MY001 = my_plugin_module:MyPluginClass
  • MY001: 插件的错误代码前缀。
  • my_plugin_module: 插件代码所在的模块路径(相对于项目根目录)。
  • MyPluginClass: 插件的类或函数名。

注意:此文件应位于插件代码所在的项目根目录。

2. 在虚拟环境中安装项目

通过 pip install -e . 将项目安装为“可编辑”模式,插件就会被自动注册到 Flake8。

pip install -e .

这样,Flake8 就会找到本地插件,而无需手动将其复制到虚拟环境。


在 GitHub Actions 中使用

1. 添加安装步骤

在 GitHub Actions 的工作流配置中,确保插件代码被安装到虚拟环境中。例如:

steps:
  - uses: actions/checkout@v3
  - name: Set up Python
    uses: actions/setup-python@v4
    with:
      python-version: '3.10'
  - name: Install dependencies
    run: |
      python -m venv .venv
      source .venv/bin/activate
      pip install flake8
      pip install -e .
  - name: Run Flake8
    run: |
      source .venv/bin/activate
      flake8 .

pre-commit 配置中使用

如果你使用的是 pre-commit,可以通过 additional_dependencies 引用本地插件。

更新 .pre-commit-config.yaml

  repos:
    - repo: https://github.com/PyCQA/flake8
      rev: 4.0.1
      hooks:
        - id: flake8
          additional_dependencies:
            - .
  • . 表示项目根目录,pre-commit 会运行 pip install .,从而注册本地插件。

总结

  1. 在项目中添加 setup.cfg 文件,定义插件的 Flake8 入口点。
  2. 通过 pip install -e . 安装插件,使 Flake8 可以发现插件。
  3. 在 GitHub Actions 中确保安装步骤包含 pip install -e .
  4. pre-commit 配置中使用 additional_dependencies 引用项目根目录。

这种方法无需打包插件到 PyPI,也无需手动将代码复制到虚拟环境。

2025-01-06