回答:
2014.10.30を編集: npm 2.0.0以降、argsを渡すことが可能npm run
構文は次のとおりです。
npm run <command> [-- <args>]
必要なことに注意してください--
。npm
コマンド自体に渡されるパラメーターとスクリプトに渡されるパラメーターを分離する必要があります。
だからあなたが持っている場合 package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
その場合、次のコマンドは同等になります。
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
パラメータ値を取得するには、この質問を参照してください。名前付きパラメータを読み取るには、おそらくyargsやminimistなどの解析ライブラリを使用するのが最善です。nodejsはprocess.argv
コマンドラインパラメータ値を含むグローバルに公開しますが、これは低レベルAPI(オペレーティングシステムがノード実行可能ファイルに提供する、空白で区切られた文字列の配列)です。
2013.10.03を編集:現在のところ、直接行うことはできません。しかし、あなたが求めている振る舞いを実装するために開かれnpm
た、関連するGitHubの問題があります。コンセンサスはこれを実装することですが、それは以前に解決されている別の問題に依存します。
元の回答:ある種の回避策として(あまり便利ではありません)、次のように実行できます。
からのパッケージ名を言うpackage.json
とmyPackage
、あなたも持っています
"scripts": {
"start": "node ./script.js server"
}
次に追加package.json
:
"config": {
"myPort": "8080"
}
そしてあなたの中で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
その方法では、デフォルトでnpm start
8080を使用します。ただし、構成することはできます(値はnpm
内部ストレージに格納されます)。
npm config set myPackage:myPort 9090
次に、を呼び出すとnpm start
、9090が使用されます(デフォルトのpackage.json
はオーバーライドされます)。
-- --args
奇妙ですが大丈夫です
あなたはのような ものを実行できるように頼みましたnpm start 8080
。これはscript.js
、次のようにファイルを変更したり構成ファイルを作成したりすることなく可能です。
たとえば、"scripts"
JSON値に以下を含めます。
"start": "node ./script.js server $PORT"
そして、コマンドラインから:
$ PORT=8080 npm start
これがbashとnpm 1.4.23を使用して動作することを確認しました。この回避策では、GitHub npmの問題#3494を解決する必要がないことに注意してください。
node ./script.js server ${PORT:-8080}
オプションにすることもできます。
NODE_PORT=${PORT=8080}
うまくいきましたが(等しいことに注意してください)、:-構文は
node ./script.js server %PORT%
。cross-varとcross-envの使用を検討してください。
あなたもそれをすることができます:
でpackage.json
:
"scripts": {
"cool": "./cool.js"
}
でcool.js
:
console.log({ myVar: process.env.npm_config_myVar });
CLIの場合:
npm --myVar=something run-script cool
出力する必要があります:
{ myVar: 'something' }
更新:npm 3.10.3を使用すると、process.env.npm_config_
変数が小文字になっているように見えますか?私はも使用better-npm-run
しているので、これがバニラのデフォルトの動作であるかどうかはわかりませんが、この答えは機能しています。の代わりにprocess.env.npm_config_myVar
、process.env.npm_config_myvar
process.env.npm_config_myVar
値ではなく、trueを返します。
jakub.gの答えは正しいですが、gruntを使用した例は少し複雑に見えます。
だから私の簡単な答え:
-コマンドライン引数をnpmスクリプトに送信する
コマンドライン引数をnpmスクリプトに送信する構文:
npm run [command] [-- <args>]
webpack開発サーバーを開始するために、package.jsonにnpm開始タスクがあるとします。
"scripts": {
"start": "webpack-dev-server --port 5000"
},
これをコマンドラインから実行します npm start
ここで、ポートをnpmスクリプトに渡したい場合は、次のようにします。
"scripts": {
"start": "webpack-dev-server --port process.env.port || 8080"
},
これを実行し、コマンドラインを介して5000などのポートを渡すと、次のようになります。
npm start --port:5000
-package.json設定を使用:
jakub.gで言及されているように、package.jsonの設定でパラメータを設定することもできます
"config": {
"myPort": "5000"
}
"scripts": {
"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},
npm start
設定で指定されたポートを使用するか、またはそれを上書きすることができます
npm config set myPackage:myPort 3000
-npmスクリプトでパラメーターを設定する
npmスクリプトで設定された変数を読み取る例。この例ではNODE_ENV
"scripts": {
"start:prod": "NODE_ENV=prod node server.js",
"start:dev": "NODE_ENV=dev node server.js"
},
prodまたはdevのいずれかでserver.jsの NODE_ENVを読み取る
var env = process.env.NODE_ENV || 'prod'
if(env === 'dev'){
var app = require("./serverDev.js");
} else {
var app = require("./serverProd.js");
}
"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
必要があります。プロセスrefは明らかにJavaScript内で使用できます。"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
npm 2.xサポート cli引数
コマンド
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
process.argv
コードで使用し、$*
スクリプトの値エントリの末尾を提供します。
例として、提供された引数を標準出力に記録するだけの簡単なスクリプトで試してくださいechoargs.js
。
console.log('arguments: ' + process.argv.slice(2));
package.json:
"scripts": {
"start": "node echoargs.js $*"
}
例:
> npm start 1 2 3
arguments: 1,2,3
process.argv[0]
は実行可能ファイル(ノード)でprocess.argv[1]
あり、スクリプトです。
npm v5.3.0およびノードv8.4.0でテスト済み
--
例えば、引数に- npm run demo.js --skip
余分を追加した場合、それは動作します--
例えば、 -npm run demo.js -- --skip
echoargs.js
スクリプトファイルがなくてもこの方法を使用できますか?
adb
し.db
てAndroidエミュレーターにファイルをプッシュし、プッシュするファイルのローカルパスの.db
パラメーターを受け入れるスクリプトを作成しようとしていますadb push
。これは、の最初のパラメーターです。このような何か:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
と呼び出したいですnpm run db:push /Users/joshuapinter/Downloads/updated.db
。何かご意見は?
引数を単に末尾に追加するのではなく、npmスクリプトの途中に渡す場合、インライン環境変数は適切に機能するように見えます。
"scripts": {
"dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
"start": "npm run build && node lib/server/index.js",
"build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},
ここでnpm run dev
は、-w
監視フラグをbabel に渡しnpm run start
ますが、通常のビルドを1回だけ実行します。
npm run dev
、npm start
私は過去にこのワンライナーを使用していましたが、少し時間が経過した後、Node.jsは最近それを再発見する必要がありました。@francoisrvで言及されているソリューションと同様に、node_config_*
変数を利用します。
次の最小限のpackage.json
ファイルを作成します。
{
"name": "argument",
"version": "1.0.0",
"scripts": {
"argument": "echo \"The value of --foo is '${npm_config_foo}'\""
}
}
次のコマンドを実行します。
npm run argument --foo=bar
次の出力を確認します。
--fooの値は「bar」です
これらすべてはnpm公式ドキュメントにうまく文書化されています:
注:「環境変数」の見出しは、スクリプト内の変数の動作が、ドキュメントで定義されているものとは異なることを説明しています。これは、大文字と小文字を区別する場合や、引数がスペースまたは等号で定義されている場合にも当てはまります。
注:ハイフンを含む引数を使用している場合、これらは対応する環境変数でアンダースコアに置き換えられます。たとえば、npm run example --foo-bar=baz
に対応し${npm_config_foo_bar}
ます。
注:非WSL Windowsユーザーの場合は、以下の... TL @Doctorブルーのコメントを参照してください。DRは交換してください${npm_config_foo}
と%npm_config_foo%
。
npm run argument --foo=bar
)を実行するために同じことを行いましたが、変数は置き換えられません:"The value of --foo is '${npm_config_foo}'"
。NPMのバージョン6.9.0が必要な場合は、Windows 10で実行します。
%npm_config_foo%
代わりに使用する必要がありました。純粋なWindowsコマンドライン/ Powershellはこちら。(選択肢もありません。)
これは実際にはあなたの質問には答えませんが、代わりに常に環境変数を使用できます:
"scripts": {
"start": "PORT=3000 node server.js"
}
次に、server.jsファイルで:
var port = process.env.PORT || 3000;
上記の答えのほとんどは、npmによって呼び出されるNodeJSスクリプトに引数を渡すだけです。私の解決策は一般的な使用のためのものです。
npmスクリプトをシェルインタープリター(例:) sh
呼び出しでラップし、通常どおり引数を渡します。唯一の例外は、最初の引数番号がであること0
です。
たとえば、NPMのスクリプトを追加したいsomeprogram --env=<argument_1>
、someprogram
ただの値出力しenv
、引数を:
"scripts": {
"command": "sh -c 'someprogram --env=$0'"
}
実行すると:
% npm run -s command my-environment
my-environment
私が見るところによると、人々はスクリプトをより簡単に実行したいときにpackage.jsonスクリプトを使用します。たとえばnodemon
、ローカルのnode_modulesにインストールされているものを使用nodemon
するには、cliから直接呼び出すことはできませんが、を使用して呼び出すことはできます./node_modules/nodemon/nodemon.js
。したがって、この長いタイピングを簡単にするために、これを置くことができます...
... スクリプト:{ 「開始」:「nodemon app.js」 } ...
...次にnpm start
、最初の引数としてapp.jsを持つ「nodemon」を使用するように呼び出します。
私が言おうとしていることは、node
コマンドでサーバーを起動したいだけなら、を使用する必要はないと思いますscripts
。タイピングnpm start
またはnode app.js
同じ努力をしています。
ただし、を使用しnodemon
、動的な引数を渡したい場合は、script
どちらも使用しないでください。代わりにsymlinkを使用してみてください。
たとえば、での移行の使用sequelize
。シンボリックリンクを作成します...
ln -s node_modules/sequelize/bin/sequelize sequelize
...そして、私はそれを呼ぶとき、私はどんな議論も渡すことができます...
./sequlize -h /* show help */
./sequelize -m /* upgrade migration */
./sequelize -m -u /* downgrade migration */
等...
現時点では、symlinkを使用するのが最善の方法ですが、それがベストプラクティスであるとは思えません。
私の回答に対するあなたの意見も期待しています。
注:このアプローチはpackage.json
オンザフライで変更します。代替手段がない場合は、この方法を使用します。
コマンドライン引数をスクリプトに渡さなければなりませんでした。
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
つまり、これはアプリをで起動することを意味しnpm run start
ます。
ここで、引数を渡したい場合は、多分次のように始めます。
npm run start -- --config=someConfig
これは次のことを行いnpm run build && npm run watch -- --config=someConfig
ます。これの問題は、スクリプトの最後に常に引数を追加することです。これは、すべてのチェーンされたスクリプトがこれらの引数を取得しないことを意味します(Argsは、すべてまたは必要ではないかもしれませんが、それは別の話です)。さらに、リンクされたスクリプトが呼び出されると、それらのスクリプトは渡された引数を取得しません。つまり、watch
スクリプトは渡された引数を取得しません。
私のアプリの本番使用はとして行われる.exe
ため、exeで引数を渡すと正常に機能しますが、開発中にこれを実行したい場合、問題が発生します。
これを達成するための適切な方法を見つけることができなかったので、これは私が試したものです。
私はjavascriptファイルを作成しました。start-script.js
アプリケーションの親レベルに「default.package.json」があり、「package.json」を維持する代わりに「default.package.json」を維持しています。の目的start-script.json
は、を読み取ってdefault.package.json
抽出しscripts
、検索してnpm run scriptname
、渡された引数をこれらのスクリプトに追加することです。この後、新しいpackage.json
スクリプトを作成し、変更されたスクリプトでdefault.package.jsonからデータをコピーして、を呼び出しますnpm run start
。
const fs = require('fs');
const { spawn } = require('child_process');
// open default.package.json
const defaultPackage = fs.readFileSync('./default.package.json');
try {
const packageOb = JSON.parse(defaultPackage);
// loop over the scripts present in this object, edit them with flags
if ('scripts' in packageOb && process.argv.length > 2) {
const passedFlags = ` -- ${process.argv.slice(2).join(' ')}`;
// assuming the script names have words, : or -, modify the regex if required.
const regexPattern = /(npm run [\w:-]*)/g;
const scriptsWithFlags = Object.entries(packageOb.scripts).reduce((acc, [key, value]) => {
const patternMatches = value.match(regexPattern);
// loop over all the matched strings and attach the desired flags.
if (patternMatches) {
for (let eachMatchedPattern of patternMatches) {
const startIndex = value.indexOf(eachMatchedPattern);
const endIndex = startIndex + eachMatchedPattern.length;
// save the string which doen't fall in this matched pattern range.
value = value.slice(0, startIndex) + eachMatchedPattern + passedFlags + value.slice(endIndex);
}
}
acc[key] = value;
return acc;
}, {});
packageOb.scripts = scriptsWithFlags;
}
const modifiedJSON = JSON.stringify(packageOb, null, 4);
fs.writeFileSync('./package.json', modifiedJSON);
// now run your npm start script
let cmd = 'npm';
// check if this works in your OS
if (process.platform === 'win32') {
cmd = 'npm.cmd'; // https://github.com/nodejs/node/issues/3675
}
spawn(cmd, ['run', 'start'], { stdio: 'inherit' });
} catch(e) {
console.log('Error while parsing default.package.json', e);
}
今、代わりにnpm run start
、私はnode start-script.js --c=somethis --r=somethingElse
最初の実行は問題ないように見えますが、完全にはテストされていません。アプリの開発に使用したい場合は、それを使用してください。
sequelize seed:generate cliコマンドを実行して問題を解決しようとしたときに、この質問を見つけました。
node_modules/.bin/sequelize seed:generate --name=user
要点を述べましょう。package.jsonファイルに短いスクリプトコマンドを含めると同時に--name引数を指定したかった
答えはいくつかの実験の後に来ました。これがpackage.jsonの私のコマンドです
"scripts: {
"seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}
...そして、これはターミナルで実行してユーザーのシードファイルを生成する例です
> yarn seed:generate --name=user
> npm run seed:generate -- --name=user
ご参考までに
yarn -v
1.6.0
npm -v
5.6.0
-- --arg1, ...
ですか。
npm run script_target-<argument>基本的にこれはコマンドライン引数を渡す方法ですが、コマンドを実行しているようにスクリプトが1つのコマンドしか実行していない場合にのみ機能します。つまり、npm run start-4200
"script":{
"start" : "ng serve --port="
}
これはコマンドラインパラメーターを渡すために実行されますが、npm run build c:/ workspace / fileのように複数のコマンドを一緒に実行するとどうなるでしょうか。
"script":{
"build" : "copy c:/file <arg> && ng build"
}
しかし、copy c:/ file && ng build c:/ work space / fileを実行している間は、このように解釈 され、このcopy c:/ file c:/ work space / file && ng buildのようなものが期待され ます
注:-コマンドラインパラメータは、スクリプト内のコマンドが1つだけの場合にのみ機能します。
上記のいくつかの回答を読みましたが、$記号を使用してコマンドラインパラメータにアクセスできると書かれているものもありますが、これは機能しません
すでに承認済みの回答があることは知っていますが、私はこのJSONアプローチが好きです。
npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';
通常、プロジェクト名など、必要な変数が1つあるので、これは簡単なことです。
また、私はしばしばpackage.jsonにこのようなものを持っています
"scripts": {
"start": "NODE_ENV=development node local.js"
}
そして、貪欲な私は「すべて」、NODE_ENV 、および CMD行の引数を必要としています。
あなたは単にあなたのファイル(私の場合はlocal.js)でこれらのようなものにアクセスします
console.log(process.env.NODE_ENV, starter_obj.CRAZY_ARR, starter_obj.PROJECT_NAME_STR, starter_obj.MAGICAL_NUMBER_INT, starter_obj.THING_BOO);
あなたはちょうどこのビットを上に置く必要があります(私はv10.16.0 btwを実行しています)
var starter_obj = JSON.parse(JSON.parse(process.env.npm_config_argv).remain[0]);
Anyhoo、質問はすでに回答済みです。この方法をよく使うので、共有したいと思いました。
yargs
。の後のすべてのパラメータ--
は、スクリプトで完全に解析できます。