如何在诗歌中使用nox?

2024-10-04 09:22:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在用poetry管理的项目中使用nox

不顺利的是在nox会话中安装dev依赖项

我的noxfile.py如下所示:

import nox
from nox.sessions import Session
from pathlib import Path

__dir__ = Path(__file__).parent.absolute()


@nox.session(python=PYTHON)
def test(session: Session):
    session.install(str(__dir__))  # I want to use dev dependency here
    session.run("pytest")

如何在nox会话中安装dev依赖项


Tags: path项目frompydevimportpoetrysession
3条回答

经过一些尝试和错误,与我在@Yann的回答中的评论相反,似乎poetry忽略了nox传递的VIRTUAL_ENV变量

受Claudio Jolowicz的精彩系列Hypermodern Python的启发,我用以下方法解决了这个问题:

@nox.session(python=PYTHON)
def test(session: Session) -> None:
    """
    Run unit tests.

    Arguments:
        session: The Session object.
    """
    args = session.posargs or [" cov"]
    session.install(".")
    install_with_constraints(
        session,
        "coverage[toml]",
        "pytest",
        "pytest-cov",
        "pytest-mock",
        "pytest-flask",
    )
    session.run("pytest", *args)

在这里,我只是使用pip来安装一个PEP517包

不幸的是,通过pip安装的PEP517不支持可编辑(“-e”)开关

仅供参考:install_with_constraints是我从Claudio借用的函数,经过编辑后可在Windows上工作:

def install_with_constraints(
    session: Session, *args: str, **kwargs: Any
) -> None:
    """
    Install packages constrained by Poetry's lock file.

    This function is a wrapper for nox.sessions.Session.install. It
    invokes pip to install packages inside of the session's virtualenv.
    Additionally, pip is passed a constraints file generated from
    Poetry's lock file, to ensure that the packages are pinned to the
    versions specified in poetry.lock. This allows you to manage the
    packages as Poetry development dependencies.

    Arguments:
        session: The Session object.
        args: Command-line arguments for pip.
        kwargs: Additional keyword arguments for Session.install.
    """
    req_path = os.path.join(tempfile.gettempdir(), os.urandom(24).hex())
    session.run(
        "poetry",
        "export",
        " dev",
        " format=requirements.txt",
        f" output={req_path}",
        external=True,
    )
    session.install(f" constraint={req_path}", *args, **kwargs)
    os.unlink(req_path)

目前,session.install不支持poetryinstall只支持shell中的runs pip。您可以使用更通用的方法session.run激活poetry

例如:

@nox.session(python=False)
def tests(session):
    session.run('poetry', 'shell')
    session.run('poetry', 'install')
    session.run('pytest')

当您设置会话时,您可以通过自己禁用python virtualenv(python=False)的创建并使用poetry shell激活poetry的一个来完成一切

我想使用没有诗意的nox会话,所以我使用诗意为session.install()生成如下参数:

@nox.session
def tests(session: nox.sessions.Sessio0n):
    """ Run all tests """
    session.install(*requirements_txt, '.', 'pytest')
    session.run('pytest', 'tests/')


# Get requirements.txt from poetry
import tempfile, subprocess
with tempfile.NamedTemporaryFile('w+') as f:
    subprocess.run(f'poetry export  no-interaction  dev  format requirements.txt  without-hashes  output={f.name}', shell=True, check=True)
    f.seek(0)
    requirements_txt = f.readlines()

相关问题 更多 >