Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在package.json中使用环境变量_Node.js_Heroku_Npm_Package.json - Fatal编程技术网

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

Node.js 如何在package.json中使用环境变量,node.js,heroku,npm,package.json,Node.js,Heroku,Npm,Package.json,因为我们不希望在项目代码中包含敏感数据,包括package.json文件,所以在我看来,使用环境变量是一个合乎逻辑的选择 示例package.json: "dependencies": { "accounting": "~0.4.0", "async": "~1.4.2", "my-private-module":"git+https://

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

示例package.json:

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


问题不在于这是明智的还是不明智的,而在于如果可能

不,这是不可能的,因为npm不将任何字符串值视为任何类型的模板


如果您的提供商支持的话,最好只使用
git+ssh
(如果您的提供商支持的话)。

不,这是不可能的。您应该使用
git+ssh
访问repo,并在
~/.ssh
中存储私钥

然后,您的线路看起来像:

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

它不包含任何敏感信息。

您可以使用环境值在包中注入。json如下所示:

任何以npm_config_开头的环境变量都将被解释为配置参数。例如,在环境中放置npm_config_foo=bar将把foo配置参数设置为bar。任何未指定值的环境配置都将指定值true。配置值不区分大小写,因此NPM\u Config\u FOO=bar也可以使用


我有相似但不同的要求。对我来说,我想在脚本中使用环境变量

我没有直接在package.json中使用环境变量,而是:

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

#!/bin/sh

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

下面是我如何设法绕过
package.json
来达到同样的目的。它使用一个脚本,从
package.json
的自定义部分读取URL模块,在其中插入环境变量,并使用
npm install--no save
安装它们(根据使用情况,
--no save
可以省略)

作为奖励:它尝试从
.env.json
读取env变量,这可以忽略,并且对开发非常有用

  • 创建一个脚本,该脚本将从
    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?')
    }
    
  • 包.json
    中添加一个
    “postinstall”:“node env dependencies.js”
    ,这样它将在每次
    npm安装时运行

  • 使用您想要的URL将您的私有git repo添加到
    package.json
    (注意:它们的根目录下都必须有
    package.json
    ):

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

  • npm安装

  • 让我们使用grep从.env文件中获取一个值环境变量

    "scripts": {
        "start": "NODE_ENV=$(grep NODE_ENV .env | cut -d '=' -f2) some_script"
    }
    

    非常简单和直接的解决方案

  • 在package.json所在的同一目录级别创建.env文件
  • 在.env文件中提及个人访问令牌=**************************************
  • 别忘了将“.env”添加到.gitingore列表中,这样可以防止在git提交回购时将密钥暴露给外部世界
  • 现在您可以在package.json中添加依赖项,如下所示
  • Package.json

    “依赖项”:{ ... “我的私人github repo”:“git+https://${ENV.PERSONAL_ACCESS_TOKEN}@github.com/USER/abcd-repo-3.4.0.git”, ... }


    使用“DOTENV”npm包还有其他方法,但当我们试图解决“Github”包依赖性时,它并不能起到多大作用。以上似乎是直截了当的解决方案。

    此外,您甚至可以为此使用不同的ssh密钥和ssh配置,而不是通常的id_rsa。是的,我建议您这样做。(我的意思是“存储私钥”,但可能更清楚。)谢谢!是的,这是Heroku:-s。我想应该是一个定制的构建包。我认为Docker最终将成为终极环境。需要这样做!当做npmrc能够解释环境变量!但是,我认为,它不能组合,不能用于这些目的…这是用于设置npm脚本使用的变量-类似于package.json中的config部分。package.json无法读取这些变量。请告诉我如何在
    其他脚本中访问
    prop
    ?已经有一段时间了。你能按照投票率最高的答案来看看这是否有效吗?任何使用docker进行部署的人都不应该使用此选项method@monothorn-有什么更好的方法可以做到这一点?你有什么建议。。。我仍在想,如果我们不使用ssh,还有什么更好的方法。@Ashmah HTTPS是一种方法,但您必须再次限制对生成的令牌的访问,并确保回购是私有的。除此之外,您还必须了解是否还有其他安全问题。这应该是最重要的评论,因为它完美地解决了这个问题。我一直在使用它,但当您开始在多个地方使用它时,它会变得非常冗长。“有没有一个图书馆可以把它缩短?@WritofManamus谷歌it:D这太棒了,谢谢。”。它在“脚本”中工作。不幸的是,它在“配置”中不起作用,这将非常有用。知道为什么吗?纳米-是外壳,不是npm
    "scripts": {
        "start": "NODE_ENV=$(grep NODE_ENV .env | cut -d '=' -f2) some_script"
    }