问题
我编写了一个Mag文件,将所有的类型化文件编译成JavaScript,但也通过LITER(TSLILT)运行它们。我编写了以下makefile:
#binaries
SASS=./node_modules/node-sass/bin/node-sass
TSC=tsc
TSLINT=tslint
#source dirs
SASS_DIRS=./apps ./lib
TS_DIRS=./apps ./lib ./library
#source files
SASS_SRC ::= $(shell find $(SASS_DIRS) -name '*.scss')
TS_SRC ::= $(shell find $(TS_DIRS) -name '*.ts')
APPS_SASS_SRC ::= $(shell find ./apps -name 'app.scss')
MAIN_SASS_SRC=./library/incode/incode.scss
MAIN_SASS_DEST=./library/incode/incode.css
#compilation options/binary flags
SASS_FLAGS = --output-style compressed -q
TSC_FLAGS = --sourceMap -t ES5 --noEmitOnError
.PHONY: clean
all: tsc sass
sass scss: $(patsubst %.scss, %.css, $(SASS_SRC))
%.css: %.scss
$(SASS) $(SASS_FLAGS) $< > $@
tsc: $(patsubst %.ts, %.js, $(TS_SRC))
$(TSC) $(TSC_FLAGS) $(TS_SRC)
%.js: %.ts
$(TSLINT) $<
incodesass: $(MAIN_SASS_SRC)
touch $(APPS_SASS_SRC); $(SASS) $(SASS_FLAGS) $< > $(MAIN_SASS_DEST); make sass
clean:
$(shell for i in $(shell find -name '*.rej'); do rm $i; done; for i in $(shell find -name '*.orig'); do rm $i; done;)
问题是,每当运行
make
(或等价地make all
)时,SCSS和TSLLT规则只在适当的情况下运行在更改的文件上,但是即使我没有改变类型文件,TSC配方也会运行它的命令($(TSC) $(TSC_FLAGS) $(TS_SRC)
)。我做错了什么?注意
根据我对typescript的理解,即使只有一个文件被更改,所有的文件都需要重新编译,这样它就可以理解它们之间的引用,我想这是公平的。考虑到这一点,这个makefile需要在每个单独的typescript源文件上运行
tslint
,但也必须在所有源typescript文件上运行tsc
,即使其中一个文件被更改。(目前它做到了这一点,问题是即使没有任何改变,tsc
也会运行)奖金
你可能想知道我为什么把sass/scss文件放在里面,因为每个
%.scss
./apps/
文件都是我的主scss文件(@import
),我想让它运行一些东西,首先检查这个文件是否被更改了,如果是这样的话$(MAIN_SASS_SRC)
会删除所有的应用程序scuzzy文件,这样它们就可以导入它,但不管在完成之后运行sass/scss配方。我想不出一个没有比赛条件(因为我使用的是touch
)的方法来做到这一点,不需要跑两次make或者没有潜艇。一般来说,我对此很陌生,所以我很乐意接受评论中的任何一部分的批评,以及对具体问题的解决方案。 最佳答案
你已经告诉make你正在创建文件tsc
,但是配方没有创建它。
将输出文件本身用作依赖项
SASS_CSS := $(SASS_SRC:=.scss=.css)
TS_JS := $(TS_SRC:.ts=.js)
.PHONY: all js.stub
all: $(SASS_CSS) $(TS_JS)
%.css: %.scss
$(SASS) $(SASS_FLAGS) $< > $@
$(TS_JS): %.js: %.ts js.stub
$(TSLINT) $<
js.stub: $(TS_SRC)
$(TSC) $(TSC_FLAGS) $^
@touch $@
关于typescript - Makefile编译所有tsc,无论更改如何,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39237306/