即使目标比依赖项更新,makefile配方也会每次运行

时间:2017-07-09 11:23:28

标签: makefile npm

生成文件:

node_modules: package.json ## Run npm install
        @npm install

为什么make node_modules每次运行npm install时都会优先获取[{1}}?

我认为如果我的文件make node_modules不是最近的目录package.json,则不应该执行该配方。

1 个答案:

答案 0 :(得分:1)

@IsmailBadawi在评论中提供的link是关键所在。

确定目标是否已过期based on its last-modified time (mtime)。但是,只有在添加/删除/重命名其中一个直接子节点时才会考虑修改目录(至少在类Unix系统上)。

这在你的情况下是不够的。想象一下以下顺序:

  1. 第一次运行make

    • 不跳过规则。
    • mtime(node_modules) > mtime(package.json)
  2. 再次运行make

    • 跳过规则。
  3. 更改package.json中的依赖项版本。

    • mtime(node_modules) < mtime(package.json)
  4. 再次运行make

    • 不跳过规则。
    • 依赖关系在node_modules
    • 中更新
    • mtime(node_modules)未受影响。
  5. 再次运行make

    • 规则跳过。
  6. ......等等......

  7. 您可以通过在食谱中添加touch -m node_modules来解决此问题。