2016-04-16 67 views
8

posso ottenere un valore da package.json con questo:Leggi JSON e assegnare ad un elenco di rendere variabili

LAST_VERSION := $(shell node -p "require('./package.json').version") 

Ma cosa succede se ho bisogno di più valori? Come:

PROJECT  := $(shell node -p "require('./package.json').name") 
LAST_VERSION:= $(shell node -p "require('./package.json').version") 
DESCRIPTION := $(shell node -p "require('./package.json').description") 
PROJECT_URL := $(shell node -p "require('./package.json').repository.url") 

È questo l'unico modo? Forse c'è un modo per creare una sorta di elenco.

+2

Quanto dura un 'invocazione node' prendere? Vale la micro-ottimizzazione? Così com'è, sembra abbastanza leggibile, una proprietà che non vorrei sacrificare per uno hackery ottimizzato e offuscato. – Jens

+0

@Jens In effetti, non influisce affatto sulle prestazioni, forse lasciatelo così com'è. –

+0

Se una singola chiamata 'node' potrebbe stampare tutti e quattro gli elementi, avresti il ​​problema di separarli. Poiché 'make' per natura utilizza liste separate da spazi, mi aspetterei che il membro" description "sia problematico poiché la descrizione probabilmente contiene spazi. Dovresti creare un output con un delimitatore speciale (virgola? Punto e virgola?), Con tutti i problemi di escape che ciò comporta. – Jens

risposta

8

Alla fine, mi si avvicinò con questo:

define GetFromPkg 
$(shell node -p "require('./package.json').$(1)") 
endef 

PROJECT  := $(call GetFromPkg,name) 
LAST_VERSION := $(call GetFromPkg,version) 
DESCRIPTION := $(call GetFromPkg,description) 
PROJECT_URL := $(call GetFromPkg,repository.url) 
+1

Vale la pena sottolineare che _make_ non elimina gli spazi dai parametri in un '$ (call ...)'. Si ottiene qui perché 'nodo -p 'richiede (' ./ package.json '). Nome" 'è ancora valido. ('$ (chiama GetFromPkg, name)' probabilmente è più nell'idioma _make_ IMHO). – bobbogo

+0

@bobbogo grazie per aver indicato questo. –

Problemi correlati