Edytuj 2014.10.30: Możliwe jest przekazywanie argumentów do npm run
npm 2.0.0
Składnia jest następująca:
npm run <command> [-- <args>]
Zwróć uwagę na konieczne --
. Konieczne jest oddzielenie parametrów przekazywanych do npm
samego polecenia i parametrów przekazywanych do skryptu.
Więc jeśli masz package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
Wtedy następujące polecenia byłyby równoważne:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
Aby uzyskać wartość parametru, zobacz to pytanie . Do odczytu nazwanych parametrów najlepiej użyć biblioteki parsującej, takiej jak yargs lub minimalist ; nodejs udostępnia process.argv
globalnie, zawierający wartości parametrów wiersza poleceń, ale jest to interfejs API niskiego poziomu (tablica ciągów znaków oddzielona spacjami, dostarczana przez system operacyjny do pliku wykonywalnego węzła).
Edytuj 2013.10.03: Obecnie nie jest to możliwe bezpośrednio. Ale jest otwartynpm
powiązany problem GitHub, aby zaimplementować zachowanie, o które prosisz. Wydaje się, że konsensus polega na wdrożeniu tego, ale zależy to od rozwiązania innego problemu wcześniej.
Oryginalna odpowiedź: W celu obejścia (choć niezbyt przydatnego) możesz wykonać następujące czynności:
Powiedz, że nazwa twojego pakietu package.json
to myPackage
i ty też
"scripts": {
"start": "node ./script.js server"
}
Następnie dodaj package.json
:
"config": {
"myPort": "8080"
}
A w twoim script.js
:
// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080
W ten sposób domyślnie npm start
użyje 8080. Możesz jednak go skonfigurować (wartość zostanie zapisana npm
w pamięci wewnętrznej):
npm config set myPackage:myPort 9090
Następnie podczas wywoływania npm start
zostanie użyte 9090 (domyślna wartość z package.json
zostanie zastąpiona).
yargs
; wszystkie parametry po--
znaku można idealnie przeanalizować w skrypcie.-- --args
cholera, to dziwne, ale w porządkuPoprosiłeś o możliwość uruchomienia czegoś takiego
npm start 8080
. Jest to możliwe bez potrzeby modyfikowaniascript.js
lub konfigurowania plików w następujący sposób.Na przykład w
"scripts"
wartości JSON uwzględnij--A następnie z wiersza poleceń:
Potwierdziłem, że działa to przy użyciu bash i npm 1.4.23. Zauważ, że to obejście nie wymaga rozwiązania problemu 3494 GitHub npm .
źródło
node ./script.js server ${PORT:-8080}
aby uczynić to opcjonalnym.NODE_PORT=${PORT=8080}
(zauważ równość), ale nie: - składnianode ./script.js server %PORT%
. Rozważ użycie cross-var i cross-env .Możesz także to zrobić:
W
package.json
:W
cool.js
:W CLI:
Powinien generować:
Aktualizacja: Używając npm 3.10.3, wydaje się, że obniża wielkość
process.env.npm_config_
zmiennych? Używam równieżbetter-npm-run
, więc nie jestem pewien, czy to zachowanie domyślne waniliowy lub nie, ale ta odpowiedź jest praca. Zamiast tegoprocess.env.npm_config_myVar
spróbujprocess.env.npm_config_myvar
źródło
process.env.npm_config_myVar
zwraca true, a nie wartość.odpowiedź jakub.g jest poprawna, jednak przykład użycia chrząknięcia wydaje się nieco skomplikowany.
Więc moja prostsza odpowiedź:
- Wysłanie argumentu wiersza poleceń do skryptu npm
Składnia wysyłania argumentów wiersza poleceń do skryptu npm:
Wyobraź sobie, że w naszym pakiecie.json mamy zadanie uruchamiania npm, aby uruchomić serwer deweloperski webpack:
Uruchamiamy to z wiersza poleceń za pomocą
npm start
Teraz jeśli chcemy przekazać port do skryptu npm:
uruchomienie tego i przekazanie portu np. 5000 za pomocą wiersza poleceń wyglądałoby następująco:
- Korzystanie z konfiguracji package.json:
Jak wspomniano jakub.g , możesz alternatywnie ustawić parametry w konfiguracji pliku package.json
npm start
użyje portu określonego w konfiguracji lub możesz go zastąpić- Ustawienie parametru w skrypcie npm
Przykład odczytu zestawu zmiennych w skrypcie npm. W tym przykładzie
NODE_ENV
czytaj NODE_ENV w server.js obu prod lub dev
źródło
"start:prod": "NODE_ENV=prod node server.js"
inpackage.json
nie będzie działać w systemie Windows, chyba że użyjesz cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
powinna być"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
zgodna z moim zastosowaniem wyjaśnionym w tym samouczku . Numer referencyjny procesu może być najwyraźniej używany w javascript.npm 2.x obsługuje argumenty cli
Komenda
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
źródło
Użyj
process.argv
w kodzie, a następnie podaj końcowe$*
wartości wpisu skryptu.Na przykład wypróbuj go za pomocą prostego skryptu, który po prostu loguje dostarczone argumenty do standardowego wyjścia
echoargs.js
:package.json:
Przykłady:
process.argv[0]
jest plikiem wykonywalnym (węzłem),process.argv[1]
jest twoim skryptem.Testowane z npm v5.3.0 i węzłem v8.4.0
źródło
--
argumentów, np. -npm run demo.js --skip
działa, jeśli dodano dodatkowy--
, np. -npm run demo.js -- --skip
echoargs.js
pliku skryptu?adb
do wypychania.db
pliku do emulatora Androida i akceptuje parametr lokalnej ścieżki.db
pliku do wypychania go, co jest pierwszym parametrem parametruadb push
. Coś w tym stylu:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
i chcę to nazwaćnpm run db:push /Users/joshuapinter/Downloads/updated.db
. jakieś pomysły?Jeśli chcesz przekazać argumenty na środek skryptu npm, a nie tylko dołączać je na końcu, to wbudowane zmienne środowiskowe wydają się działać dobrze:
Tutaj
npm run dev
przekazuje-w
flagę zegarka babelowi, alenpm run start
raz uruchamia zwykłą kompilację.źródło
npm run dev
,npm start
W przeszłości korzystałem z tego linera i po pewnym czasie z dala od Node.js musiałem ostatnio spróbować go odkryć. Podobnie do rozwiązania wspomnianego przez @francoisrv, wykorzystuje
node_config_*
zmienne.Utwórz następujący minimalny
package.json
plik:Uruchom następujące polecenie:
Obserwuj następujące dane wyjściowe:
Wszystko to jest dobrze udokumentowane w oficjalnej dokumentacji npm:
Uwaga: W Zmienne środowiskowe pozycją wyjaśnia, że zmienne wewnątrz skryptach zachowują się inaczej niż to, co jest określone w dokumentacji. Dotyczy to rozróżniania wielkości liter , a także tego, czy argument jest zdefiniowany spacją czy znakiem równości .
Uwaga: Jeśli używasz argumentu z łącznikami, zostaną one zastąpione znakami podkreślenia w odpowiedniej zmiennej środowiskowej. Na przykład
npm run example --foo-bar=baz
odpowiada${npm_config_foo_bar}
.Uwaga: dla użytkowników bez WSL Windows zobaczyć komentarze @Doctor niebieski jest poniżej ... TL; DR zastąpić
${npm_config_foo}
z%npm_config_foo%
.źródło
npm run argument --foo=bar
), ale zmienna nie otrzymuje:"The value of --foo is '${npm_config_foo}'"
. Działa w systemie Windows 10, jeśli to ma znaczenie, w wersji 6.9.0 programu NPM.%npm_config_foo%
Zamiast tego musiałem użyć . Czysta linia poleceń Windows / PowerShell tutaj. (Nie mam też wyboru.)To tak naprawdę nie odpowiada na twoje pytanie, ale zawsze możesz zamiast tego użyć zmiennych środowiskowych:
Następnie w pliku server.js:
źródło
Większość powyższych odpowiedzi obejmuje tylko przekazywanie argumentów do skryptu NodeJS, wywoływanego przez npm. Moje rozwiązanie jest do ogólnego użytku.
Wystarczy owinąć skrypt npm
sh
wywołaniem interpretera powłoki (np. ) I przekazać argumenty jak zwykle. Jedynym wyjątkiem jest to, że pierwszy numer argumentu to0
.Na przykład, chcesz dodać skrypt npm
someprogram --env=<argument_1>
, w którymsomeprogram
po prostu wypisuje wartośćenv
argumentu:pakiet.json
Po uruchomieniu:
źródło
Z tego, co widzę, ludzie używają skryptów package.json, kiedy chcieliby uruchomić skrypt w prostszy sposób. Na przykład, aby użyć
nodemon
tego zainstalowanego w lokalnym module_węzła, nie możemy wywoływaćnodemon
bezpośrednio z cli, ale możemy to wywoływać za pomocą./node_modules/nodemon/nodemon.js
. Aby uprościć to długie pisanie, możemy umieścić to ...... następnie wywołaj,
npm start
aby użyć „nodemon”, który ma app.js jako pierwszy argument.Co próbuję powiedzieć, jeśli chcesz po prostu uruchomić serwer za pomocą
node
polecenia, nie sądzę, że musisz go używaćscripts
. Pisanie na klawiaturzenpm start
lubnode app.js
ma taki sam wysiłek.Ale jeśli chcesz użyć
nodemon
i chcesz przekazać argument dynamiczny, nie używajscript
żadnego z nich. Zamiast tego spróbuj użyć dowiązania symbolicznego.Na przykład za pomocą migracji z
sequelize
. Tworzę dowiązanie symboliczne ...ln -s node_modules/sequelize/bin/sequelize sequelize
... I mogę przekazać wszelkie argumenty, gdy je nazywam ...
itp...
W tym momencie użycie dowiązania symbolicznego to najlepszy sposób, jaki mógłbym wymyślić, ale tak naprawdę nie sądzę, że jest to najlepsza praktyka.
Mam również nadzieję na twoją opinię do mojej odpowiedzi.
źródło
Uwaga: To podejście modyfikuje Twoje
package.json
w locie, użyj go, jeśli nie masz alternatywy.Musiałem przekazać argumenty wiersza poleceń do moich skryptów, które były jak:
Oznacza to, że uruchamiam aplikację
npm run start
.Jeśli chcę przekazać jakieś argumenty, zacznę od:
Co to robi to:
npm run build && npm run watch -- --config=someConfig
. Problem w tym, że zawsze dołącza argumenty na końcu skryptu. Oznacza to, że wszystkie powiązane łańcuchy skryptów nie otrzymują tych argumentów (Argumenty mogą, ale nie muszą być wymagane przez wszystkich, ale to inna historia). Ponadto po wywołaniu połączonych skryptów te skrypty nie otrzymają przekazanych argumentów. tj.watch
Skrypt nie otrzyma przekazanych argumentów.Wykorzystanie produkcyjne mojej aplikacji jest takie
.exe
, więc przekazywanie argumentów w exe działa dobrze, ale jeśli chcesz to zrobić podczas programowania, staje się problamatyczne.Nie mogłem znaleźć odpowiedniego sposobu, aby to osiągnąć, więc właśnie tego próbowałem.
Utworzyłem plik javascript:
start-script.js
na poziomie nadrzędnym aplikacji mam „default.package.json” i zamiast utrzymywać „package.json”, utrzymuję „default.package.json”. Celemstart-script.json
jest odczytaniedefault.package.json
, wyodrębnieniescripts
i poszukiwanie,npm run scriptname
a następnie dołączenie przekazanych argumentów do tych skryptów. Następnie utworzy nowypackage.json
i skopiuje dane z pliku default.package.json ze zmodyfikowanymi skryptami, a następnie wywołanpm run start
.Teraz, zamiast robić
npm run start
, robięnode start-script.js --c=somethis --r=somethingElse
Początkowy przebieg wygląda dobrze, ale nie został dokładnie przetestowany. Skorzystaj z niego, jeśli chcesz tworzyć aplikacje.
źródło
Znalazłem to pytanie, gdy próbowałem rozwiązać mój problem z uruchomieniem sekwencjonowania seed: generuj polecenie cli:
Przejdźmy do sedna. Chciałem mieć krótkie polecenie skryptu w moim pliku package.json i jednocześnie podać argument --name
Odpowiedź nadeszła po kilku eksperymentach. Oto moje polecenie w pakiecie.json
... a oto przykład uruchomienia go w terminalu w celu wygenerowania pliku źródłowego dla użytkownika
Do Twojej wiadomości
źródło
-- --arg1, ...
?npm run script_target - <argument> Zasadniczo jest to sposób przekazywania argumentów wiersza poleceń, ale będzie działał tylko w przypadku, gdy skrypt ma tylko jedno polecenie uruchomione, tak jak uruchamiam polecenie, tj. npm run start - 4200
Będzie to działać w celu przekazania parametrów wiersza poleceń, ale co jeśli uruchomimy więcej niż jedno polecenie razem, np. Npm uruchom build c: / workspace / file
ale interpretuje to w ten sposób podczas uruchamiania kopii c: / file && ng build c: / work space / file i spodziewamy się czegoś takiego jak ta kopia c: / file c: / work space / file && ng build
Uwaga: - więc oczekiwany parametr wiersza polecenia działa tylko w przypadku jednego polecenia w skrypcie.
Przeczytałem kilka odpowiedzi powyżej, w których niektóre z nich piszą, że można uzyskać dostęp do parametru wiersza polecenia za pomocą symbolu $, ale to nie zadziała
źródło
Wiem, że jest już zatwierdzona odpowiedź, ale podoba mi się to podejście JSON.
Zazwyczaj potrzebuję 1 var, którego potrzebuję, na przykład nazwy projektu, więc uważam to za szybkie i proste.
Często też mam coś takiego w pakiecie.json
Będąc chciwym, chcę „wszystkiego”, NODE_ENV i argumentów z linii CMD.
Po prostu uzyskujesz dostęp do takich rzeczy w swoim pliku (w moim przypadku local.js)
Musisz tylko mieć ten bit powyżej (korzystam z wersji 10.16.0 btw)
Anyhoo, pytanie już odpowiedział. Myślałem, że podzielę się, ponieważ często używam tej metody.
źródło