【问题标题】:can i reference shell variables from an npm script?我可以从 npm 脚本中引用 shell 变量吗?
【发布时间】:2016-09-22 00:56:00
【问题描述】:

我有一个 npm 脚本来启动 webpack 开发服务器,但首先,我的环境设置 -

在我的.zshrc - export DEV_SERVER_PORT=8001

echo 返回预期结果

>echo $DEV_SERVER_PORT
8001

这是我通过 npm run 从 package.json 运行的脚本

webpack-dev-server --inline --hot --port 8001

这通过 npm run 正确执行 -

echo $DEV_SERVER_PORT

结果:8001

这会通过 npm run 产生令人失望的结果-

 webpack-dev-server --inline --hot --port $DEV_SERVER_PORT

结果webpack-dev-server --inline --hot --port $DEV_SERVER_PORT

【问题讨论】:

  • 请更详细地展示您尝试过的内容,包括您如何将所需的值导出到环境中。一个 MCVE 将是理想的(也就是说,一个完整且可验证的复制器,根据 stackoverflow.com/help/mcve)。
  • ...顺便说一句,系统和shell使用全大写名称;它是保留给应用程序使用的小写 环境变量名称(或更准确地说,是包含至少一个小写字符的名称)。请参阅pubs.opengroup.org/onlinepubs/009695399/basedefs/… 的相关规范,第四段。
  • ...一般来说,答案介于“是”和“非常是”之间。从 npm 通过 system() 调用的 shell 脚本,它只是像往常一样 "$varname";对于原生 JavaScript 代码,它是 process.env.varname。但是常规 shell 变量和环境变量之间的区别在这里很关键——如果你没有将它导出到环境中,它就不会存在。
  • 主要问题是 webpack cli 似乎并不想本机接受 env vars 作为配置。虽然许多节点 CLI 会这样做,但无论出于何种原因,它们都不会这样做。查看我的“可能重复”链接,看看这是否适合您,如果不适合,请更新您的问题。

标签: node.js shell npm sh


【解决方案1】:

您的问题中报告了来自 zsh 的以下结果:

>declare -p DEV_SERVER_PORT
typeset DEV_SERVER_PORT=8000

...表示您的 shell 变量实际上并未导出,因此在子进程的环境中不可用。


运行以下命令:

export DEV_SERVER_PORT

然后,您应该会看到以下内容:

>declare -p DEV_SERVER_PORT
typeset -x DEV_SERVER_PORT=8000

-x 表示设置了导出标志,并且在调用的任何子流程中设置了此变量(对相同的任何更改)。

【讨论】:

  • 谢谢你,我把自己弄糊涂了。做了一个我忘记的改变。谢谢你克服我的固执。
【解决方案2】:

您需要使用process.env。这是一个包含所有进程环境变量的对象。例如,如果你定义了一个环境变量PORT,它将可以使用:

process.env.PORT

可能需要将值转换为正确的类型。 process.env 始终包含字符串形式的值,因此 - 例如对于端口 - 您可能需要将值转换为数字。

所以你最终会得到这样的结果:

const port = process.env.PORT - 0;

【讨论】:

  • webpack-dev-server --inline --hot --port process.env.DEV_SERVER_PORT 作为package.json 中的脚本会执行webpack-dev-server --inline --hot --port process.env.DEV_SERVER_PORT ...不太正确
猜你喜欢
  • 2015-06-27
  • 2013-05-22
  • 2022-01-13
  • 2010-10-02
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多