包的脚本部分。Json当前看起来是这样的:

"scripts": {
    "start": "node ./script.js server"
}

...这意味着我可以运行npm start来启动服务器。到目前为止一切顺利。

然而,我希望能够运行类似npm start 8080的东西,并将参数传递给script.js(例如npm start 8080 => node ./script.js服务器8080)。这可能吗?


当前回答

基本上这是传递命令行参数的方式,但它只在脚本只有一个命令运行的情况下才会工作,就像我正在运行一个命令,即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时,它会这样解释 我们期待的是这样的事情 复制c:/file c:/work space/file && ng build

注意:-所以命令行参数只能在脚本中只有一个命令的情况下工作。

我读了上面的一些答案,其中一些人写着你可以使用$ symbol访问命令行参数,但这将不起作用

其他回答

NPM 2和更新版本

从npm 2(2014)开始,可以将参数传递给npm。语法如下:

npm运行<命令> [-- <args>]

注意——separator,用来分隔传递给npm命令本身的参数和传递给脚本的参数。

在package.json的示例中:

"scripts": {
    "grunt": "grunt",
    "server": "node server.js"
}

下面是如何将参数传递给这些脚本:

npm run grunt -- task:target  // invokes `grunt task:target`
npm run server -- --port=1337 // invokes `node server.js --port=1337`

注意:如果你的参数不是以-或——开头,那么显式的——分隔符是不需要的;但为了清晰起见,还是这样做比较好。

npm run grunt task:target     // invokes `grunt task:target`

请注意下面的行为差异(test.js有console.log(process.argv)):以-或——开头的参数被传递给npm而不是脚本,并在那里被无声地吞下。

$ npm run test foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']

$ npm run test -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']

$ npm run test --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']

$ npm run test -- foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']

$ npm run test -- -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '-foobar']

$ npm run test -- --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '--foobar']

当你使用npm实际使用的参数时,区别就更明显了:

$ npm test --help      // this is disguised `npm --help test`
npm test [-- <args>]

aliases: tst, t

要获取参数值,请参见下面的问题。对于读取命名参数,最好使用yargs或minimist这样的解析库;Nodejs公开进程。argv,包含命令行参数值,但这是一个低级API(由空格分隔的字符串数组,由操作系统提供给节点可执行文件)。

我发现这是可能的,只是传递变量完全像你会给Node.js:

// index.js
console.log(process.env.TEST_ENV_VAR)
// package.json
...
"scripts": { "start": "node index.js" },
...
TEST_ENV_VAR=hello npm start

打印出“hello”

上面的大多数答案都只是将参数传递到你的NodeJS脚本中,由npm调用。我的解决办法是通用的。

只需要用shell解释器(例如sh)调用包装npm脚本,并像往常一样传递参数。唯一的例外是第一个参数编号为0。

例如,你想添加npm脚本someprogram——env=<argument_1>,其中someprogram只打印env参数的值:

package.json

"scripts": {
  "command": "sh -c 'someprogram --env=$0'"
}

当你运行它时:

% npm run -s command my-environment
my-environment

在我看来,人们使用包装。Json脚本,当他们想以更简单的方式运行脚本。例如,要使用安装在本地node_modules中的nodemon,我们不能直接从cli调用nodemon,但可以通过./node_modules/nodemon/nodemon.js调用它。所以,为了简化这种冗长的输入,我们可以把这个…


    ...

    scripts: {
      'start': 'nodemon app.js'
    }

    ...

... 然后调用NPM start使用“nodemon”,它的第一个参数是app.js。

我想说的是,如果你只是想用node命令启动你的服务器,我认为你不需要使用脚本。输入npm start或node app.js也有同样的效果。

但如果你确实想使用nodemon,并且想传递一个动态参数,也不要使用script。尝试使用符号链接代替。

例如使用sequelize迁移。我创建了一个符号链接…

Ln -s node_modules/sequelize/bin/sequelize

... 当我调用它时,我可以传递任何参数…

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

./sequelize -m -u /* downgrade migration */

等等……

在这一点上,使用符号链接是我能想出的最好的方法,但我真的不认为这是最好的实践。

我也希望你能对我的回答提出意见。

你也可以这样做:

在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