问题
我编写了一个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/

10-15 13:42