【问题标题】:How Can I Set An Environment Variable Inside "bin" Field of "package.json"如何在“package.json”的“bin”字段中设置环境变量
【发布时间】:2020-09-01 04:00:21
【问题描述】:

我有一个带有 cli 的 npm 包:

  "bin": {
    "myprogram": "./cli.js"
  }

通过运行myprogram --param value 可以毫无问题地执行。 我在npm's docs 中找不到它,但我想知道是否有一种方法可以在运行cli.js 之前设置环境变量

我试过了:

  "bin": {
    "myprogram": "TZ=utc ./cli.js"
  }

但看起来 npm 不处理它:

npm ERR! code ENOENT
npm ERR! syscall chmod
npm ERR! path /usr/local/lib/node_modules/@myprogram/myprogram/TZ=utc ./cli.js
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, chmod '/usr/local/lib/node_modules/@myprogram/myprogram/TZ=utc ./cli.js'

TZ=utc myprogram 我不想这样做。

【问题讨论】:

    标签: node.js shell npm environment-variables npm-install


    【解决方案1】:

    您无法按照您希望的方式设置环境变量,但我可以建议一个替代解决方案。

    在您的 package.json 中,将 scripts 字段设置为:

    "scripts": {
      "start": "TZ=utc ./cli.js"
    }

    然后在与 cli.js 相同的文件夹中创建一个文件,我们称之为 cli-wrapper.js。

    然后您可以使用以下 sn-p 创建 cli-wrapper.js:

    #!/usr/bin/env node
    
    const spawn = require('child_process').spawn;
    const started = spawn('npm', ['run', 'start'], { cwd: __dirname });
    
    started.stdout.on('data', function (data) {
      console.log('stdout:', data.toString());
    });
    
    started.stderr.on('data', function (data) {
      console.log('stderr:', data.toString());
    });
    
    started.on('exit', function (code) {
      console.log('child process exited with code:', code.toString());
    });

    上面的 sn-p 是一小段代码,它只是使用“npm run script”在当前目录中生成一个节点脚本进程。 您可能需要对这个 sn-p 进行一些调整,具体取决于您运行 bin 文件的方式。也许在发出命令之前使用path 解析正确的目录并更改为它。 我认为不再需要调整目录,我已经调整了上面的代码,它似乎按预期运行。

    然后你可以调整你的 package.json 文件的 bin 参数:

    "bin": {
      "myprogram": "./cli-wrapper.js"
    }

    只要 spawn sn-p 在正确的文件夹中运行,它就应该允许您在 package.json 的 scripts.start 字段中指定不同的环境参数。

    【讨论】:

    • 这是一个合理的答案。我目前正在使用其他标准方法来设置环境变量,但无论如何感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 2018-02-23
    • 2016-03-29
    • 1970-01-01
    • 2016-04-11
    • 2018-09-17
    • 2019-07-02
    相关资源
    最近更新 更多