我有一堆Python脚本,我在管道中用来读取文件,并转换数据以创建和填充sqlite3数据库。
我使用makefile来执行此操作;由于我的一些输入文件相当大,即5GB因此需要花费相当长的时间来处理,所以当我只编辑一个文件时,我不希望makefile重新运行整个管道。
但是,因为它们都编辑同一个文件,即数据库文件,所以它们都是虚假目标。有没有办法让make只重新运行已编辑文件的目标?
这是我正在使用的makefile:
.PHONY: all
all: blogs.db
blogs.db: create users posts likes blogs blog_likes
.PHONY: create
create: create.py
$(PYTHON) create.py
.PHONY: users
users: users.py
$(PYTHON) users.py
.PHONY: posts
posts: posts.py
$(PYTHON) posts.py
.PHONY: likes
likes: likes.py
$(PYTHON) likes.py
.PHONY: blogs
blogs: blogs.py
$(PYTHON) blogs.py
.PHONY: blog_likes
blog_likes: blog_likes.py
$(PYTHON) blog_likes.py
答案 0 :(得分:1)
如果目标是虚假的,那么每当有人依赖它们时它们就会重建。相反,每个目标都是一个创建虚拟文件的真实目标,正如@jdi所说,表明它们已经构建完毕。然后,当.py文件仅更改时,它们将重新运行。
blogs.db: create.dummy users.dummy posts.dummy likes.dummy blogs.dummy \
blog_likes.dummy
create.dummy: create.py
$(PYTHON) create.py
touch create.dummy
etc...
答案 1 :(得分:1)
您不需要虚拟文件,除非这些脚本正在修改数据库:
SCRIPTS = create.py users.py posts.py likes.py blogs.py blog_likes.py
.PHONY: all
all: blogs.db
blogs.db: $(SCRIPTS)
@for s in $?; do $(PYTHON) $$s; done