Javascript: pobierz dane package.json w pliku gulpfile.js

101

Nie jest to pytanie specyficzne dla gulp per se, ale jak można uzyskać informacje z pliku package.json w pliku gulpfile.js; Na przykład chcę uzyskać stronę główną lub nazwę i użyć jej w zadaniu.

Pas ruchu
źródło

Odpowiedzi:

116

Nie używaj require('./package.json')do oglądania. Użycie requirerozwiąże moduł jako wynik pierwszego żądania. Więc jeśli edytujesz plik package.json, te zmiany nie będą działać, dopóki nie zatrzymasz procesu oglądania i nie uruchomisz go ponownie. W przypadku procesu obserwacyjnego najlepiej byłoby użyć metody bitlinguist, ponieważ ponownie odczyta plik i przeanalizuje go za każdym razem, gdy zadanie zostanie wykonane.

var fs = require('fs');

var json = JSON.parse(fs.readFileSync('./package.json'));
hapticdata
źródło
4
Uzgodniono, że „wymóg” nie buforuje wyniku (co czyni go nieodpowiednim, jeśli zamierzasz czytać / modyfikować / ponownie odczytywać). Nie oznacza to jednak, że jest to złe rozwiązanie we wszystkich przypadkach. PO wyraźnie wspomniał, że chce odczytać z niego informacje.
Mangled Deutz
2
Możliwe jest użycie requirei usunięcie pamięci podręcznej za pomocądelete require.cache[require.resolve(FILEPATH)];
curly_brackets
@KennethB Dlaczego nie jako oddzielna odpowiedź? Zdobyłoby więcej głosów za.
kaiser
138

To nie jest specyficzne dla łyka.

var p = require('./package.json')
p.homepage

AKTUALIZACJA:

Należy pamiętać, że polecenie „require” zapisze wyniki odczytu w pamięci podręcznej - co oznacza, że ​​nie można wymagać, zapisywać do pliku, a następnie wymagać ponownie i oczekiwać, że wyniki zostaną zaktualizowane.

Mangled Deutz
źródło
7
Zdecydowanie poczułem się jak idiota, szukając tego, kiedy zobaczyłem twoją odpowiedź. Oczywiście!
spikeheap
1
Pracował dla mnie: P. I +1 dla komentarza dotyczącego buforowania, później przełączyłem się na używanie 'fs.readFileSync ()', jak wskazano poniżej.
Bart
@spikeheap Nie wiem, czy kiedykolwiek śmiałem się głośno przed przeczytaniem komentarza na StackOverflow, ale MAM RÓWNĄ TOWARĘ! Dzięki za wiwaty. Ha ha.
nieco mniej
6

To dobre rozwiązanie @Mangled Deutz. Sam najpierw to zrobiłem, ale nie zadziałało (wróć do tego za sekundę), potem wypróbowałem to rozwiązanie:

# Gulpfile.coffee
requireJSON = (file) ->
    fs = require "fs"
    JSON.parse fs.readFileSync file

Teraz powinieneś zobaczyć, że jest to trochę rozwlekłe (mimo że zadziałało). require('./package.json')to najlepsze rozwiązanie:

Wskazówka

-pamiętaj, aby dodać „./” przed nazwą pliku. Wiem, że jest to proste, ale jest to różnica między działaniem wymaganej metody a niedziałaniem.

dewwwald
źródło
Dzięki! to ogromnie pomogło.
Adam Grant
1
dzięki za upvotes, wreszcie mam komentarze. :) Cieszę się, że ci pomogło.
dewwwald
0

Jeśli wyzwalasz łyka z NPM, na przykład używając " npm run build " lub czegoś podobnego

(Działa to tylko w przypadku wyzwalaczy uruchamiania łykiem przez NPM)

process.env.npm_package_ Object

w przypadku głębszych obiektów powinno to być oddzielone podkreśleniem.

jeśli chcesz przeczytać określoną konfigurację w package.json, tak jak chcesz odczytać obiekt konfiguracyjny, który utworzyłeś w package.json

scripts : {
   build: gulp 
},
config : {
   isClient: false.
}

wtedy możesz użyć

process.env.npm_package_**config_isClient**
Manasvi Sareen
źródło