如何在package.json

时间:2016-01-07 08:35:27

标签: node.js heroku npm

因为我们不想在项目代码中包含敏感数据,包括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"

这可能吗?

(问题是如果这是明智的不好,只有如果可能 b>)

问候!

8 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

您的行似乎是:

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

其中不包含任何敏感信息。

答案 2 :(得分:2)

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

我不是直接在package.json中使用环境变量,而是这样做:

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

在some-script.sh中:

#!/bin/sh

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

答案 3 :(得分:1)

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

最好只使用git+ssh(如果您的提供商支持它)与ssh代理。

答案 4 :(得分:1)

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

.env

/usr/bin/python3

package.json

...
SKIP_PREFLIGHT_CHECK=true
...

答案 5 :(得分:0)

您可以使用环境值注入package.json,如下所示:

  

以npm_config_开头的任何环境变量都将被解释为配置参数。例如,在您的环境中放置npm_config_foo = bar会将foo配置参数设置为bar。任何未赋值的环境配置都将赋值为true。配置值不区分大小写,因此NPM_CONFIG_FOO = bar的工作方式相同。

https://docs.npmjs.com/misc/config#environment-variables

答案 6 :(得分:0)

这是我设法解决package.json以实现相同目的的方法。它使用一个脚本,该脚本从package.json的自定义部分读取URL模块,在其中插入环境变量,然后使用npm install --no-save安装它们(根据用例,可以省略--no-save )。

作为奖励:它尝试从.env.json读取env变量,可以将其进行gitignore操作,对开发非常有用。

  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. 在您的"postinstall": "node env-dependencies.js"中添加一个package.json,这样它将在每个npm install上运行

  2. 使用所需的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"
  ]
},

(可以省略semver说明符#semver:^2.0.0,但指的是git标记,这很有用,因为它使git服务器成为完全成熟的软件包管理器)

  1. npm install

答案 7 :(得分:0)

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

  1. 在 package.json 所在的同一目录级别创建 .env 文件。
  2. 在 .env 文件中提及 PERSONAL_ACCESS_TOKEN=*******************************
  3. 不要忘记将“.env”添加到 .gitingore 列表中,这将防止在您将 git 提交到您的存储库时将密钥暴露给外界。
  4. 现在您可以在 package.json 中添加您的依赖项,如下所示,
<块引用>

Package.json

<块引用>

“依赖项”:{ ... "my-private-github-repo": "git+https://${ENV.PERSONAL_ACCESS_TOKEN}@github.com/USER/abcd-repo-3.4.0.git", ... }

还有其他使用“DOTENV”npm 包的方法,但是当我们尝试解决“Github”包依赖性时,它无能为力。以上似乎是直接的解决方案。