我有两个/* 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个目标可以依赖它,但除非我也指定了依赖文件,否则它将始终运行。
我该如何处理?
答案 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(原始问题中没有)已更新,那么双重安装将再次发生。我不知道这是否可以修复,或者是否值得修复。