我有一个围绕mocha的Makefile,可以由npm test
调用。 Makefile中有几个目标,类似于:
COMPILERS = --compilers coffee:coffee-script/register
REPORTER = --reporter dot
TEST_DIR = test
SRC = -name test_*.coffee
RUNNER = ${TEST_DIR}/runner.coffee
MOCHA = NODE_ENV=test ./node_modules/mocha/bin/mocha ${COMPILERS} ${REPORTER} ${RUNNER} ${TEST_DIR}
all:
$(MOCHA) $(shell find ${TEST_DIR} ${SRC})
subtest1:
$(MOCHA) $(shell find ${TEST_DIR}/subtest1 ${SRC})
...
现在,从package.json
调用此npm test
,其中npm test subtest1
仅运行subtest1
。但是,允许附加任意mocha
标志会非常好,例如:
make subtest1 -g "some test I want to run"
这可以通过定义ARGS
变量来完成,因此输入:
make subtest1 ARGS="-g 'some test I want to run'"
但那很冗长。
因此,将参数传递给Mocha会非常好。
我最接近的是在ARGS
顶部定义Makefile
:
ARGS = $(filter-out all subtest1, $(MAKECMDGOALS))
并将ARGS
附加到MOCHA
变量。然后可以将其称为make subtest1 -- -g "some test I want to run"
。这样做,它会运行测试,但make
会随make: *** No rule to make target
- g'停止。 Stop.`
在执行make -- -g "some test I want to run"
时会显示相同的错误消息。
那么,是否有任何方法可以继续关闭此ARGS
路径并以某种方式阻止make尝试运行ARGS
中找到的任何目标,从而允许all
运行,并且那个错误信息没有出现?或者我应该完全改变策略,还有其他方法可以做到这一点吗?
答案 0 :(得分:0)
您可以通过为每个参数添加一个虚拟规则来逃避这一点,例如:
Release
但是你不应该从$(ARGS):
读取你的论点,这会引起各种各样的问题。
您可以改为使用脚本或在shell中定义别名。这是一条可以帮助实现这一目标的规则:
MAKECMDGOALS
像这样使用:
shortcut-%:
@echo '$* () { make -C "$(CURDIR)" -f $(abspath $(firstword $(MAKEFILE_LIST))) $* ARGS="$$(printf "%q " "$$@")"; }'