因为我们不想在项目代码中包含敏感数据,包括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>)
问候!
我
答案 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的工作方式相同。
答案 6 :(得分:0)
这是我设法解决package.json
以实现相同目的的方法。它使用一个脚本,该脚本从package.json
的自定义部分读取URL模块,在其中插入环境变量,然后使用npm install --no-save
安装它们(根据用例,可以省略--no-save
)。
作为奖励:它尝试从.env.json
读取env变量,可以将其进行gitignore操作,对开发非常有用。
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?')
}
在您的"postinstall": "node env-dependencies.js"
中添加一个package.json
,这样它将在每个npm install
上运行
使用所需的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服务器成为完全成熟的软件包管理器)
npm install
答案 7 :(得分:0)
非常简单直接的解决方案...
Package.json
<块引用>“依赖项”:{ ... "my-private-github-repo": "git+https://${ENV.PERSONAL_ACCESS_TOKEN}@github.com/USER/abcd-repo-3.4.0.git", ... }
还有其他使用“DOTENV”npm 包的方法,但是当我们尝试解决“Github”包依赖性时,它无能为力。以上似乎是直接的解决方案。