如何防止两次运行相同的make命令?

时间:2016-03-29 21:33:30

标签: makefile gnu-make

我有两个/* You need to allow the drag to enter the widget/view. */ /* This is a must. */ void TargetView::dragEnterEvent( QDragEnterEvent *deEvent ) { deEvent->acceptProposedAction(); }; /* This is optional. Use this to check if the data can be */ /* dropped at the current mouse position. Example: In a */ /* FileSystem View, it makes no sense to drop a bunch of */ /* files on top of a file, but makes sense it you drop it */ /* in an empty space or on a folder */ void TargetView::dragMoveEvent( QDragMoveEvent *dmEvent ) { /* You can do something like this */ if ( indexAt( dmEvent->pos() ).isValid() ) { /* You cannot drop it on an existing index */ /* If you ignore it, the cursor changes to */ /* 'don't drop' image */ dmEvent->ignore(); } else { /* Empty space. Tell the user to feel free */ /* to perform the drop. We accept the event */ /* Cursor shows the drag+drop icon */ dmEvent->accept(); } }; void TargetView::dropEvent( QDropEvent *dpEvent ) { /* Here is where you call canDropMimeData and dropMimeData */ QMimeData *mData = dpEvent->mimeData(); if ( model->canDropMimeData( mData, ..., ..., ..., ... ) ) { /* Add the data to the model */ bool updated = model->dropMimeData( mData, ..., ..., ..., ... ); if ( updated ) { /* Intimate the view to update itself */ update(); } } }; 目标:

make

NPM_OUT = node_modules/npm.sfv NPM_BIN = $(shell command -v npm || command -v /usr/bin/npm || echo "npm") HASH_CMD = $(shell command -v md5 || command -v md5sum) $(NPM_OUT): npm-shrinkwrap.json $(NPM_BIN) install --loglevel=error @$(HASH_CMD) npm-shrinkwrap.json > $(NPM_OUT) npm-shrinkwrap.json: $(NPM_BIN) install --loglevel=error $(NPM_BIN) prune $(NPM_BIN) dedupe $(NPM_BIN) shrinkwrap --dev 基本上是一个伪造的文件,我只是用来确定NPM_OUT是否已经运行过。我不知道如何在没有虚假文件的情况下执行此操作,因为该命令会生成许多输出文件,而不仅仅是您在c / c ++中看到的一个目标文件。

我遇到的问题是,如果npm install不存在,那么npm-shrinkwrap.json会被运行两次。

如您所见,它存在于两个目标中。如果npm install --loglevel=error不存在,那么我需要运行npm-shrinkwrap.json才能创建shrinkwrap文件。但是,如果我这样做,那么我需要再次为npm install运行它。它$(NPM_OUT)中的原因是我每次$(NPM_OUT)更改时都需要运行它。

我想也许我可以创建npm-shrinkwrap.json的第3个目标,其他2个目标可以依赖它,但除非我也指定了依赖文件,否则它将始终运行。

我该如何处理?

2 个答案:

答案 0 :(得分:2)

npm install是最新的是你想要的事态 代理NPM_OUT

您希望 npm install是最新的依赖于npm-shrinkwrap.json当且仅当 npm-shrinkwrap.json存在时。如果您手动修改npm-shrinkwrap.json, 例如,那意味着npm安装不再是最新的 必须使用npm-shrinkwrap.json

但如果npm-shrinkwrap.json不存在,那么实际上依赖是 其他方式,因为你需要使npm安装最新 为了npm-shrinkwrap.json ab initio

因此,根据是否npm-shrinkwrap.json,您有不同的依赖关系 存在:

NPM_BIRTH_CERT = node_modules/.npm_installed.timestamp
NPM_BIN = $(shell command -v npm || command -v /usr/bin/npm || echo "npm")
NPM_SHRINKWRAP := $(wildcard npm-shrinkwrap.json)

.PHONY: all clean really-clean

all: npm-shrinkwrap.json $(NPM_BIRTH_CERT)

$(NPM_BIRTH_CERT): $(NPM_SHRINKWRAP)
    $(NPM_BIN) install --loglevel=error
    touch $@

ifndef NPM_SHRINKWRAP
npm-shrinkwrap.json: $(NPM_BIRTH_CERT)
    $(NPM_BIN) prune
    $(NPM_BIN) dedupe
    $(NPM_BIN) shrinkwrap --dev
    touch $<
endif

clean:
    rm -fr node_modules

really-clean: clean
    rm -f npm-shrinkwrap.json

这里的规则是:

$(NPM_BIRTH_CERT): $(NPM_SHRINKWRAP)

是:

$(NPM_BIRTH_CERT): npm-shrinkwrap.json

如果存在npm-shrinkwrap.json,则只需:

$(NPM_BIRTH_CERT):

每当npm-shrinkwrap.json存在时,它根本就不是目标。

我没有看到需要让$(NPM_BIRTH_CERT)解析为MD5 npm-shrinkwrap.json的哈希值,而不仅仅是一个文件 承担npm install上次完成的时间戳或 npm-shrinkwrap.json npm install的最后一代,以最新者为准。

答案 1 :(得分:1)

使用Mike's answer中的想法,我想我可以按照我想要的方式行事:

NPM_SHRINKWRAP := $(wildcard npm-shrinkwrap.json)

ifdef NPM_SHRINKWRAP
$(NPM_OUT): npm-shrinkwrap.json
    $(NPM_BIN) install --loglevel=error
    touch $(NPM_OUT)
else
$(NPM_OUT): npm-shrinkwrap.json
endif

npm-shrinkwrap.json: package.json
    $(NPM_BIN) install --loglevel=error --no-shrinkwrap
    $(NPM_BIN) prune
    $(NPM_BIN) dedupe
    $(NPM_BIN) shrinkwrap --dev
    touch $(NPM_OUT)

基本上,如果收缩包装文件存在,那么make $(NPM_OUT)将运行npm install iff收缩包装文件已更新。

如果shrinkwrap文件不存在,并且由于npm-shrinkwrap.json仍然是依赖项,npm-shrinkwrap.json目标将执行安装。

但是,我在这里引入了一个新问题:如果npm-shrinkwrap.json 存在 package.json(原始问题中没有)已更新,那么双重安装将再次发生。我不知道这是否可以修复,或者是否值得修复。