【问题标题】:Maintain Same Python Environment through different Makefile goals通过不同的 Makefile 目标维护相同的 Python 环境
【发布时间】:2021-10-13 04:48:58
【问题描述】:

我正在通过 Makefile 运行一些命令,我​​必须创建一个新的 python virtualenv,激活它并在一个 Make recipe/goal 中安装要求,然后在运行其他 recipe/goal 之前重用它,但问题是,我必须像这样在每个后续的 Make Goal 中激活该环境

    SHELL := bash
# For Lack of a better mechanism will have to activate the venv on every Make recipe because every step is in its own shell

.ONESHELL:
install:
    python -m venv .venv
    source .venv/bin/activate
    pip install -r requirements.txt

test:   install
    source .venv/bin/activate
    pytest

synth:  install
    source .venv/bin/activate
    cdk synth --no-color

diff:   install
    source .venv/bin/activate
    cdk diff --no-color

bootstrap:  install
    source .venv/bin/activate
    cdk bootstrap --no-color

deploy: install
    source .venv/bin/activate
    cdk deploy --no-color


.PHONY: install test    synth   diff    bootstrap   deploy

有没有更好的方法来做到这一点,即让我不必在每个目标上都做source .venv/bin/activate? 换句话说,我基本上可以在同一个 SHELL 中的 Makefile 中运行所有 make 目标吗?

【问题讨论】:

    标签: python makefile gnu-make


    【解决方案1】:

    你不能在同一个 shell 中运行所有目标(这是行不通的,因为 shell 必须在每个配方完成后退出,否则 make 无法知道配方中的命令是否成功,因此规则是否成功或不是)。

    您当然可以将采购放在一个变量中,这样您就不必输入它。你也可以把整个东西放在一个函数中,像这样:

    run = . .venv/bin/activate && $1
    

    然后:

    install:
            python -m venv .venv
            $(call run,pip install -r requirements.txt)
    
    test:   install
            $(call run,pytest)
    

    等等

    如果您不想这样做,您唯一的选择是使用递归 make 调用。但是,这会很棘手,因为您只想在创建 install 规则之后执行此操作。不确定它实际上会导致更易于理解的生成文件。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多