使“ make”仅重新运行更改后出现的管道部分

时间:2018-07-05 13:23:19

标签: makefile

我在make上使用GNU Make,我相信在WSL上。我将其用于数据科学,建立在cookiecutter-datascience上。

在我开始使用make之前,我的想法是要跟踪管道的哪些部分已更改,并且仅在管道之后重新运行管道

以下是makefile中的代码段:

## Install Python Dependencies
requirements: test_environment
    pip install -U pip setuptools wheel
    pip install -r requirements.txt

## Make Dataset
data: requirements
    $(PYTHON_INTERPRETER) src/data/make_dataset.py

当我运行make data时,它不仅会重新运行管道和后续阶段中的数据部分,还会重新运行make requirementsmake test_environment。但这是我想要的相反。这些阶段是在之前,而不是之后。如果我的管道昂贵,我显然不想一遍又一遍地重新运行它。

就我而言,我希望这样做:如果原始(未经预处理)的数据文件之一发生更改,我希望它重新运行数据预处理。这不应该包括诸如跟踪库是否已更改之类的事情,因为这些步骤在逻辑上先于数据预处理。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

## Install Python Dependencies
requirements.done: test_environment.done
    pip install -U pip setuptools wheel
    pip install -r requirements.txt
    touch requirements.done

## Make Dataset
data: requirements.done
    $(PYTHON_INTERPRETER) src/data/make_dataset.py

进行比较文件的最后修改日期。您的requirementstest_environment ...不是文件,它们是所谓的“ phony ”目标。由于它们不存在,请尝试在需要时立即构建它们。如果要使发现某些内容是最新的并且不需要重建,则必须使用文件。建议的解决方案使用空的虚拟文件(*.done文件),而不是伪造的目标。这些文件仅用于存储操作的最后修改日期。

当然,您可以根据需要使用名为requirementstest_environment ...的文件。 .done扩展名只是将这些文件标识为虚拟标记的一种方法。