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

sma*_*ber 1 makefile npm

生成文件:

node_modules: package.json ## Run npm install
        @npm install
Run Code Online (Sandbox Code Playgroud)

为什么每次运行时都会make node_modules执行收据?npm installmake node_modules

我相信如果我的文件package.json不是比目录更新,则该配方不应该被执行node_modules

Oli*_*rth 7

@IsmailBadawi 在评论中提供的链接是这里的关键。

Make根据目标的上次修改时间 (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. ...永远如此...

您也许可以通过添加touch -m node_modules到您的食谱中来解决此问题。