经过一些试验和错误,与我在@Yann 的回答中评论的相反,似乎poetry
忽略了VIRTUAL_ENV
传递的变量nox
.
受 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 包。
不幸的是,PEP517 通过pip
不支持可编辑(“-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)