2016-04-16 24 views
8

mogę uzyskać wartość od package.json z tym:Czytaj JSON i przypisać do listy sprawiają zmiennych

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

ale co jeśli trzeba kilka wartości? Na przykład:

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") 

Czy to jedyny sposób? Może istnieje sposób na stworzenie rodzaju listy.

+2

Jak długo 'node' inwokacja wziąć? Czy warto skorzystać z mikrooptymalizacji? Wygląda na to, że jest całkiem czytelny - właściwość, której nie poświęciłbym dla zaciemnionego zoptymalizowanego "make" hackery. – Jens

+0

@Jens Rzeczywiście, nie ma to żadnego wpływu na wydajność, może pozwól na to tak jak jest. –

+0

Jeśli pojedyncze wywołanie 'węzeł' może wydrukować wszystkie cztery elementy, będziesz miał problem z ich oddzieleniem. Ponieważ 'make' by nature używa list rozdzielonych spacjami, oczekiwałbym, że element" description "będzie problematyczny, ponieważ opis prawdopodobnie zawiera spacje. Będziesz musiał utworzyć wyjście ze specjalnym ogranicznikiem (przecinek? Średnik?), Z wszystkimi problemami, które się z tym wiążą. – Jens

Odpowiedz

8

Na końcu wpadłem na to:

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

Warto zauważyć, że _make_ nie usuwa spacji z parametrów w '$ (call ...)'. Unikasz tutaj, ponieważ 'node -p 'require (' ./ package.json '). Nazwa" 'jest nadal poprawna. ('$ (wywołanie GetFromPkg, nazwa)' jest prawdopodobnie bardziej w idmem_make_ IMHO). – bobbogo

+0

@bobbogo dzięki za wskazanie tego. –