当前位置: 首页 > 知识库问答 >
问题:

向npm脚本发送命令行参数

何章横
2023-03-14

我的package.jsonscripts部分当前如下所示:

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

...这意味着我可以运行npm start来启动服务器。到目前为止还不错。

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

共有3个答案

唐高卓
2023-03-14

您也可以这样做:

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

郝峰
2023-03-14

您要求能够运行类似npm start8080的内容。这是可能的,不需要修改script.js或配置文件,如下所示。

例如,在“scripts”JSON值中,包括--

"start": "node ./script.js server $PORT"

然后从命令行:

$ PORT=8080 npm start

我已经确认使用bash和npm1.4.23可以工作。请注意,此解决方法不需要解决GitHub npm问题#3494。

满博
2023-03-14

自npm 2(2014年)以来,可以将参数传递给npm Run。语法如下:

NPM运行[-- ]

请注意--分隔符,用于分隔传递给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.jsconsole.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全局公开process.argv,包含命令行参数值,但这是一个低级API(由操作系统提供给节点可执行文件的以空格分隔的字符串数组)。

编辑2013.10.03:当前无法直接编辑。但是在 npm上打开了一个相关的GitHub问题,以实现您所要求的行为。似乎大家一致认为应该实现这一目标,但这取决于之前解决的另一个问题。

原答案(2013.01):作为某种变通办法(虽然不是很得心应手),你可以做如下:

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

然后,当调用npmstart时,将使用9090(覆盖package.json中的默认值)。

 类似资料:
  • 问题内容: 我当前的部分看起来像这样: …这意味着我可以运行来启动服务器。到现在为止还挺好。 但是,我希望能够运行类似的东西并将参数传递给(例如=> )。这可能吗? 问题答案: 编辑: 可以将args传递给npm2.0.0 语法如下: 注意必要的。需要将传递给命令本身的参数和传递给脚本的参数分开。 所以如果你有 那么以下命令将是等效的: => => 为了读取命名参数,最好使用yargs或[mini

  • 我一直在试图找到一种方法,从我的PC(Windows 7)向Arduino Uno R3发送串行命令。我一直在做这个简单的程序,你应该通过USB电缆发送一个简单的“1”,以便打开车载LED。我的Arduino代码应该可以工作(我知道的,但我会确保上传它)。我一直在尝试使用Python和pySerial发送此命令,但我似乎无法让pySerial正常工作。我也尝试过使用CMD,但当我输入命令(ECHO

  • 尝试使用Visual Studio Code上的npm start命令运行节点应用程序时收到此错误。非常感谢任何帮助! 这是我包裹里的东西。json文件: 这是我运行代码时终端上的消息:

  • 问题内容: 是否可以通过命令行将参数传递给MySQL脚本? 在此示例中,类似于@start_date的内容: 问题答案: 发现在网络上的答案在这里。 基本上,假设我们要运行以下查询: 我们可以这样传递“ start_date”和“ end_date”:

  • 我正在创建一个java应用程序,通过PC/SC非接触式阅读器和javax.smartcardioAPI与MifeDesFire卡通信。我设法发送常规的ISO 7816 APDU(CLA,INS,P1-P2,Lc,命令数据,Le)。 我在Ridrix的博客上读到,DESFire卡(至少我正在使用的EV1版本)支持APDU和本地命令,其中大多数命令只有1字节长。 例如,“获取版本”命令: 我用Spri

  • 在Linux或Mac上运行带有命令行参数的Node.js脚本的正确语法是什么? 要在没有参数的情况下运行脚本,我只需使用命令node stuff。但是在这种情况下,我想运行一个名为stuff的脚本。js带有参数“blah”、“hee”、“woohoo!” 。