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

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

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

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


当前回答

我过去一直在使用这个一行程序,在离开Node.js一段时间后,最近不得不尝试重新发现它。类似于@francoisrv提到的解决方案,它利用了npm_config_*变量。

创建以下最小包。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官方文档中有很好的记录:

https://docs.npmjs.com/using-npm/config

注意:“环境变量”标题解释了脚本中的变量与文档中定义的变量的行为不同。当涉及到大小写敏感性时,这是正确的,以及参数是否定义为空格或等号。

注意:如果使用带有连字符的参数,这些参数将在相应的环境变量中替换为下划线。例如,npm运行示例——foo-bar=baz对应于${npm_config_foo_bar}。

注意:对于非wsl Windows用户,请参阅下面@Doctor Blue的评论…将${npm_config_foo}替换为%npm_config_foo%。

其他回答

你也可以这样做:

在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

在我看来,人们使用包装。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 */

等等……

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

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

我知道已经有了一个认可的答案,但我有点喜欢这种JSON方法。

npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';

通常我需要1个变量,比如项目名称,所以我发现这个快速n'简单。

我的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]);

总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。

我发现这个问题,当我试图解决我的问题运行sequelize seed:generate cli命令:

node_modules/.bin/sequelize seed:generate --name=user

让我言归正传。我想在我的包中有一个简短的脚本命令。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

FYI

yarn -v
1.6.0

npm -v
5.6.0

我满足于这样的东西,看看测试观察脚本:

"scripts": {
    "dev": "tsc-watch --onSuccess \"node ./dist/server.js\"",
    "test": "tsc && cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest",
    "test-watch": "cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 tsc-watch --onSuccess",
  },

你像这样调用test-watch脚本:

// Run all tests with odata in their name
npm run test-watch "jest odata"