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?