【问题标题】:Make `pipenv run` run multiple commands让 `pipenv run` 运行多个命令
【发布时间】:2020-12-30 18:41:48
【问题描述】:

我正在使用 Docker 容器进行本地 Web 开发。我有一个 bash 脚本,用于运行 Django 的 manage.py testflake8coverage html,所有这些都在 Docker 容器内的 pipenv 环境中。

一个简单的版本是:

#!/bin/bash
set -e

docker exec hines_web /bin/sh -c "pipenv run coverage run --source=. manage.py test ; pipenv run flake8 ; pipenv run coverage html"

这行得通。但是,因为每个命令都必须单独使用pipenv run,所以它比它需要的要慢。

有没有办法在单个pipenv run 之后将多个命令链接在一起,或者将多个命令发送到pipenv shell 以供它们运行?

(任何关于改进一般方法的想法表示赞赏!)

【问题讨论】:

  • 您应该可以使用pipenv 来设置基于非Docker 主机的虚拟环境。这通常会更快,并且不需要管理员等效权限即可使用。
  • 我不是 100% 确定你的意思。你的意思是直接在我的 Mac 上而不是在 Docker 容器中运行 pipenv 吗?这就是我之前一直在做的事情,现在我正在尝试使用 Docker,以便我拥有一个更容易复制的环境,除了 pipenv 方面。
  • 你需要在 docker 容器中使用 pipenv 吗?你可以直接将包安装到docker容器pipenv install --deploy --system然后正常运行python3 filename.py
  • @Ishan 这很好,我一开始就是这样,但我读到不再推荐在 Docker 映像中使用 --systemstackoverflow.com/questions/46503947/…

标签: docker pipenv


【解决方案1】:

这是我的解决方法,它足够费力,让我认为我完全错误地处理了这个问题,但它确实有效。三个步骤:

1. 将运行我们的命令的 shell 脚本。这被设计为在 pipenv 环境运行。这是scripts/pipenv-run-tests.sh

#!/bin/sh
set -e

# Runs the Django test suite, flake8, and generates HTML coverage reports.

# This script is called by using the shortcut defined in Pipfile:
#   pipenv run tests

# You can optionally pass in a test, or test module or class, as an argument, e.g.
# ./pipenv-run-tests.sh tests.appname.test_models.TestClass.test_a_thing
TESTS_TO_RUN=${1:-tests}

coverage run --source=. ./manage.py test $TESTS_TO_RUN
flake8
coverage html

2.我们在Pipfile中定义了一个Custom Script Shortcut

[scripts]
tests = "./scripts/pipenv-run-tests.sh"

这意味着如果我们登录到 Docker 容器上的 shell,我们可以:pipenv run tests 和我们的scripts/pipenv-run-tests.sh 将在 pipenv 环境中运行。在pipenv run tests 之后包含的任何参数都将传递给脚本。

3. 最后,我们设计了一个从主机运行的脚本,它在 Docker 中运行我们的自定义脚本快捷方式。这是scripts/run-tests.sh

#!/bin/bash
set -e

# Call this from the host machine.
# It will call the `tests` shortcut defined in Pipfile, which will run
# a script within the pipenv environment.

# You can optionally pass in a test, or test module or class, as an argument, e.g.
# ./run-tests.sh tests.appname.test_models.TestClass.test_a_thing
TESTS_TO_RUN=${1:-tests}

docker exec hines_web /bin/sh -c "pipenv run tests $TESTS_TO_RUN"

所以现在,在主机上,我们可以这样做:./scripts/run-tests.sh,这将在 Docker 容器中调用 pipenv 快捷方式,它将运行 scripts/pipenv-run-tests.sh 脚本。提供的任何参数都会传递给最终脚本。

(注意上面的hines_web是我的docker-compose.yml中定义的我的Docker容器的名字。)

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2021-05-04
    • 2021-11-27
    • 2020-02-02
    相关资源
    最近更新 更多