NodeJS 如何在package.json中使用环境变量

kx5bkwkv  于 2023-01-25  发布在  Node.js
关注(0)|答案(9)|浏览(450)

因为我们不希望在项目代码中包含敏感数据,包括package.json文件,所以在我看来,使用环境变量将是一个合乎逻辑的选择。
示例包. json:

"dependencies": {
    "accounting": "~0.4.0",
    "async": "~1.4.2",
    "my-private-module":"git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"

这可能吗?
问题是 * 不是 * 如果这是 * 明智 * 或 * 不好 *,只是如果它是可能的

qnakjoqk

qnakjoqk1#

如果您使用.env文件,让我们使用grepeval从.env文件中获取一个值环境变量。
按照@Paul的建议更新了start2

"scripts": {
    "start": "NODE_ENV=$(grep NODE_ENV .env | cut -d '=' -f2) some_script",
    "start2": "eval $(grep '^NODE_ENV' .env) && some_script"
}
wixjitnu

wixjitnu2#

我有相似但不同的需求。对我来说,我想在脚本中使用环境变量。
我没有直接在package.json中使用环境变量,而是:

"some-script": "./scripts/some-script.sh",

在www.example.com网站上some-script.sh:

#!/bin/sh

npm run some-other-script -- --prop=$SOME_ENV_VAR
tvmytwxo

tvmytwxo3#

下面是我如何设法围绕package.json实现相同目的的方法:它使用一个脚本从package.json的自定义部分读取URL模块,在其中插入环境变量,并将它们与npm install --no-save一起安装(--no-save可以省略,具体取决于用例)。
另外:它尝试从.env.json中读取env变量,可以忽略该变量,这对开发非常有用。
1.创建将从package.json的自定义部分读取的脚本
env-dependencies.js

const execSync = require('child_process').execSync
const pkg = require('./package.json')

if (!pkg.envDependencies) {
  return process.exit(0)
}

let env = Object.assign({}, process.env)

if (typeof pkg.envDependencies.localJSON === 'string') {
  try {
    Object.assign(env, require(pkg.envDependencies.localJSON))
  } catch (err) {
    console.log(`Could not read or parse pkg.envDependencies.localJSON. Processing with env only.`)
  }
}

if (typeof pkg.envDependencies.urls === 'undefined') {
  console.log(`pkg.envDependencies.urls not found or empty. Passing.`)
  process.exit(0)
}

if (
  !Array.isArray(pkg.envDependencies.urls) ||
  !(pkg.envDependencies.urls.every(url => typeof url === 'string'))
) {
  throw new Error(`pkg.envDependencies.urls should have a signature of String[]`)
}

const parsed = pkg.envDependencies.urls
  .map(url => url.replace(/\${([0-9a-zA-Z_]*)}/g, (_, varName) => {
    if (typeof env[varName] === 'string') {
      return env[varName]
    } else {
      throw new Error(`Could not read env variable ${varName} in url ${url}`)
    }
  }))
  .join(' ')

try {
  execSync('npm install --no-save ' + parsed, { stdio: [0, 1, 2] })
  process.exit(0)
} catch (err) {
  throw new Error('Could not install pkg.envDependencies. Are you sure the remote URLs all have a package.json?')
}

1.向您的package.json添加一个"postinstall": "node env-dependencies.js",这样它将在每个npm install上运行
1.使用你想要的URL将你的私人git repos添加到package.json(注意:它们的根目录都必须有package.json!):

"envDependencies": {
  "localJSON": "./.env.json",
  "urls": [
    "git+https://${GITHUB_PERSONAL_ACCESS_TOKEN}@github.com/user/repo#semver:^2.0.0"
  ]
},

(the semver说明符#semver:^2.0.0可以省略,但引用git标记,这非常有用,因为它使git服务器成为一个成熟的包管理器)

  1. npm install
ncecgwcz

ncecgwcz4#

不,这是不可能的。您应该使用git+ssh访问存储库,并在~/.ssh中存储私钥。
然后,您的行看起来如下所示:

"my-private-module":"git+ssh://git@bitbucket.org/foo/bar.git"

里面没有任何敏感信息。

unguejic

unguejic5#

不,这是不可能的,因为npm不把任何字符串值当作任何类型的模板。
最好只将git+ssh(如果您的提供商支持它)与ssh代理一起使用。

ifsvaxew

ifsvaxew6#

您可以使用环境值注入package.json,如下所示:
任何以npm_config_开头的环境变量都将被解释为配置参数。例如,将npm_config_foo=bar放入环境中将把foo配置参数设置为bar。任何未指定值的环境配置都将被指定为true值。配置值不区分大小写,因此NPM_CONFIG_FOO=bar的作用相同。
https://docs.npmjs.com/misc/config#environment-variables

67up9zun

67up9zun7#

我也有同样的需求,我的解决方案基于@Long Nguyen的response,这样,我只能依赖于. env文件中定义的内容。
.环境

...
SKIP_PREFLIGHT_CHECK=true
...

package.json

...
"scripts": {
  "test": "yarn cross-env $(grep SKIP_PREFLIGHT_CHECK ../../.env) react-app-rewired test --watchAll=false"
}
...
inb24sb2

inb24sb28#

对于复杂的环境变量,可以使用https://stedolan.github.io/jq/访问JSON文件(您的情况下是env文件)JSON文件可能类似于

{
    "env" :
     {  
            "username" : "1345345",
            "Groups" :  [],
            "arraytest" : [
               {
                  "yes" : "1",
                  "no" : "0"
               }
             ]
     }
}

因此,脚本可以类似于以下内容来访问yes值

"scripts": {
    "yes": "jq [].arraytest[0].yes?"
}
6ljaweal

6ljaweal9#

您可以安装包https://www.npmjs.com/package/env-cmd和所有您的envs从.env文件将是可见的,即:
./.环境:

ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

Package.json:

"scripts": {
    "test": "env-cmd pact-broker can-i-deploy --broker-token=${ENV1}"
  }

或者你问题中的另一个例子

"my-private-module":"env-cmd git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"

相关问题