gpt4 book ai didi

node.js - 在 npm 脚本中使用空格*设置环境变量的跨平台方法

转载 作者:行者123 更新时间:2023-12-04 09:07:16 28 4
gpt4 key购买 nike

我正在开发一个无服务器 NodeJS 应用程序,需要在离线模式下对其进行测试。我有一个 npm package.json 中的脚本看起来像这样的文件:

  "scripts": {
"serve": "cross-env AUTHORIZER='{\\\"claims\\\":{\\\"permissions\\\":\\\"[view:accounts manage:accounts]\\\",\\\"sub\\\":\\\"auth0|5cfe0adce3c4c50ea072ea9f\\\"}}' AWS_PROFILE=elit_nonprd serverless offline start -s dev --noAuth",
...
注意有两个权限需要 用空格分隔 .运行 npm run serve在 Windows 上会出现以下错误:
> @mypackage@1.0.0 serve C:\path
> cross-env AUTHORIZER='{\"claims\":{\"permissions\":\"[view:accounts manage:accounts]\",\"sub\":\"auth0|5cfe0adce3c4c50ea072ea9f\"}}' AWS_PROFILE=elit_nonprd serverless offline start -s dev --noAuth

The filename, directory name, or volume label syntax is incorrect.
events.js:288
throw er; // Unhandled 'error' event
^

Error: spawn manage:accounts]","sub":"auth0|5cfe0adce3c4c50ea072ea9f"}} ENOENT
at notFoundError (C:\path\node_modules\cross-spawn\lib\enoent.js:6:26)
at verifyENOENT (C:\path\node_modules\cross-spawn\lib\enoent.js:40:16)
at ChildProcess.cp.emit (C:\path\node_modules\cross-spawn\lib\enoent.js:27:25)
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
Emitted 'error' event on ChildProcess instance at:
at ChildProcess.cp.emit (C:\path\node_modules\cross-spawn\lib\enoent.js:30:37)
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12) {
code: 'ENOENT',
errno: 'ENOENT',
syscall: 'spawn manage:accounts]","sub":"auth0|5cfe0adce3c4c50ea072ea9f"}}',
path: 'manage:accounts]","sub":"auth0|5cfe0adce3c4c50ea072ea9f"}}',
spawnargs: [
'AWS_PROFILE=elit_nonprd',
'serverless',
'offline',
'start',
'-s',
'dev',
'--noAuth'
]
}
如果我替换 cross-env 也会发生这种情况与 cross-env-shell ,虽然没有显示堆栈跟踪。
当值包含空格时,是否有一种通用的跨平台方法来设置环境变量?
更新 : 我希望的结果是设置 AUTHORIZER到以下值(感谢@RobC 要求澄清):
{
"claims":
{
"permissions": "[view:accounts manage:accounts]",
"sub": "auth0|5cfe0adce3c4c50ea072ea9f"
}
}

最佳答案

实现跨平台兼容性是多么的难题。在几次失败的尝试之后,似乎不可能使用带有 cross-env 的单一语法。 :
Windows ( cmd ) 与 worksOnWin 一起成功运行下面的示例,*Nix ( sh ) 与 worksOnNix 一起成功工作下面的例子。

{
"scripts": {
"worksOnWin": "cross-env AUTHORIZER={\\\"claims\\\":{\\\"permissions\\\":\\\"\"[view:accounts manage:accounts]\"\\\",\\\"sub\\\":\\\"auth0|5cfe0adce3c4c50ea072ea9f\\\"}} AWS_PROFILE=elit_nonprd serverless offline start -s dev --noAuth",
"worksOnNix": "cross-env AUTHORIZER=\"{\\\"claims\\\":{\\\"permissions\\\":\\\"[view:accounts manage:accounts]\\\",\\\"sub\\\":\\\"auth0|5cfe0adce3c4c50ea072ea9f\\\"}}\" AWS_PROFILE=elit_nonprd serverless offline start -s dev --noAuth",
}
}
解决方案
为了满足您对单一语法跨平台的需求,我会考虑使用 node.js 脚本来代替。
  • 保存 serve.js项目目录根目录中的脚本(如下),即将它保存在 package.json 所在的同一级别。
    服务.js
    const spawn = require('child_process').spawn;

    const processEnv = process.env;

    processEnv.AUTHORIZER = '{"claims":{"permissions":"[view:accounts manage:accounts]","sub":"auth0|5cfe0adce3c4c50ea072ea9f"}}';
    processEnv.AWS_PROFILE = 'elit_nonprd';

    spawn('serverless', ['offline', 'start', '-s', 'dev', '--noAuth'], {
    env: processEnv,
    stdio: 'inherit',
    shell: true
    });
  • scripts你的 package.json 部分重新定义你的 serve脚本如下:
    包.json
    {
    ...
    "scripts": {
    "serve": "node serve"
    }
    ...
    }
  • 运行以下命令:
    npm run serve

  • 解释
    下面解释了 serve.js 中发生的事情:
  • 首先我们需要 child_process 模块的 spawn() 方法。
  • 读取的部分;
    const processEnv = process.env;

    processEnv.AUTHORIZER = '{"claims":{"permissions":"[view:accounts manage:accounts]","sub":"auth0|5cfe0adce3c4c50ea072ea9f"}}';
    processEnv.AWS_PROFILE = 'elit_nonprd';
    获取现有环境变量,使用 process.env , 并将它们分配给 processEnv多变的。
    随后,我们增加了 processEnv带有 AUTHORIZER 的对象和 AWS_PROFILE属性及其必要的值。这实质上定义了两个新的环境变量。
  • 最后我们“掏出”serverless offline start -s dev --noAuth通过 child_process.spawn() 命令.
  • { env: processEnv }零件组 child_process.spawn env processEnv 的选项对象,即它为子进程设置环境变量。
  • stdio 选项为子进程中的标准输入、标准输出、标准错误配置管道。这可确保您在控制台中获得任何日志记录。
  • shell选项设置为 true .


  • 注: cross-env使用此解决方案,包变得多余。

    关于node.js - 在 npm 脚本中使用空格*设置环境变量的跨平台方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63420128/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com