3

パイプラインでファイルを読み取り、データを変換して sqlite3 データベースを作成および設定するために使用する一連の Python スクリプトがあります。

これを行うにはメイクファイルを使用します。私の入力ファイルのいくつかはかなり大きく、例えば 5GB であり、そのため処理にかなりの時間がかかるため、1 つのファイルだけを編集するときに makefile がパイプライン全体を再実行することは望ましくありません。

しかし、それらはすべて同じファイル、つまりデータベース ファイルを編集するため、事実上すべて偽のターゲットです。ファイルが編集されたターゲットのみを make が再実行するようにする方法はありますか?

私が使用しているメイクファイルは次のとおりです。

.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
4

2 に答える 2

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...
于 2012-07-12T05:09:26.727 に答える
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
于 2012-07-12T11:13:36.330 に答える