Können Sie in einem Makefile $ (Platzhalter% / ** / *. C) verwenden?

Als Follow-up zudiese FrageEs gibt noch einen Fall, den ich in ein paar Stunden des Bastelns nicht herausfinden konnte.

So sieht das Makefile derzeit aus:

output = $(shell find lib -type f -name '*build.js' -or -name '*build.css')
myth = ./node_modules/.bin/myth
duo = ./node_modules/.bin/duo

build: $(output)

%/build/build.js: %/index.js %/lib/*.js node_modules component.json
  @mkdir -p '$(@D)'
  @$(duo) '$*'/index.js > '$@'

%/build/build.css: %/index.css %/lib/*.css node_modules component.json
  @mkdir -p '$(@D)'
  @$(duo) '$*'/index.css | $(myth) > '$@'

node_modules: package.json
  @n 0.11.13
  @npm install
  @touch node_modules # make sure folder is updated later than package.json

Das Stück, das ich zusätzlich zu der großartigen Antwort in dieser anderen Frage hinzugefügt habe, ist das%/lib/*.js und%/lib/*.css genau hier:

%/build/build.js: %/index.js %/lib/*.js node_modules component.json

Das scheint gut zu funktionieren, wenn Sie alle erforderlichen Dateien haben, was bedeutet, dass die Verzeichnisstruktur so aussieht:

component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/page/lib/
lib/page/lib/a.js
lib/page/lib/b.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json

Mit dieser aktuellen make-Aufgabe wird das richtige Unterprojekt / der richtige Ordner (page / popup / etc.) Neu erstellt, wenn Sie eine Datei in diesem Ordner ändern. Wie auch immer, esnicht Wiederaufbau, wenn Sie sindeine der Abhängigkeiten fehlt.

In der folgenden Ordnerstruktur wird beispielsweise das Unterprojekt "popup" einwandfrei erstellt (da es weiterhin alle erforderlichen Zielabhängigkeiten aufweist). Das Unterprojekt "page" wird jedoch niemals erstellt, da es keines enthält%/lib/*.js Dateien:

component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json

In dieser Situation können Sie also nur dann eine erstellen, wenn Sie über beides verfügen%/index.js und ein paar passende Dateien%/lib/*.js.

Meine Frage ist, wie schaffen Sie es, dass es in beiden Fällen funktioniert?

Im Wesentlichen möchte ich nur ein Teilprojekt neu erstellen, wenn eine der Dateien vorhanden istaußer denen in build / build.js Veränderung. Das heißt, wenn eine Datei dies geändert hatstimmt nicht mit dem Zielnamen übereinFühren Sie dann die Task aus.

Wie machst Du das?

Ich habe das versucht:

%/build/build.js: %/**/*.js node_modules component.json

Aber der Fehler raus damit:

make: Circular lib/page/build/build.js <- lib/page/build/build.js dependency dropped.

Weil es mit dem Zielnamen übereinstimmt.

Es scheint auch möglich zu sein$(filter pattern, text) oder$(filter-out, pattern, text)Aber damit war ich nicht erfolgreich.

%/build/build.js: $(filter-out %/build/build.js, %/**/*.js) node_modules component.json

Das schien so, als würde es alle passenden Dateien beinhalten%/**/*.js (damitlib/page/index.js, undlib/page/lib/a.js wenn das vorhanden war) und einfach ausschließenlib/page/build/build.js. Aber ich hatte kein Glück damit, vielleicht verwende ich es einfach falsch.

Wie bringen Sie das zum Laufen?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage