我设法为这个问题找到了一个合理的解决方法。我希望它可以帮助其他人在同样的问题上挣扎。
所需设置
在开始执行这些步骤之前,您需要在 CI/CD 系统上设置 SSH 密钥。这就是授予您的构建系统 ssh 访问您的私人仓库的原因。这里有几篇文章讨论如何做到这一点。
您还需要通过安装包,git+ssh
以便它包含在您的package.json
(和可选的yarn.lock
)中。
yarn add git+ssh://git@gitlab.com:erichiggins/top_secret.git
此时,您应该在 中看到以下条目package.json
:
...
"dependencies": {
"top_secret": "git+ssh://git@gitlab.com:erichiggins/top_secret.git"
},
...
安装包(两次)
以下是我在部署阶段之前在 CI/CD 设置的 shell 脚本中运行的命令,以便使用git+ssh
. 我将top_secret
在我的示例中使用一个虚假的包名称,以使其更清楚。
(我yarn
在这个例子中使用了和 GitLab,但如果你愿意,这同样适用于npm
GitHub。)
yarn install
cd node_modules/top_secret
yarn pack
mv top_secret-v*.tgz ../../
cd ../../
yarn add file:top_secret-v1.0.0.tgz
注意:该yarn pack
命令将生成一个包含版本号的文件名,但不能yarn add
使用通配符 ( *
)。我在使用yarn pack --filename
通用的、无版本的文件名时遇到了问题,因此您可能需要对此进行硬编码或找到使用由yarn pack
.
结果
如果您尝试在本地运行这两个命令,您会注意到您最终在文件top_secret
的dependencies
部分中只有一个新条目package.json
,如下所示:
"top_secret": "file:node_modules/top_secret",
这是正在发生的事情:
git+ssh
您正在通过具有访问权限的系统将私有存储库作为一个包安装。
- 您正在将其从您的
node_modules/
目录重新打包到一个 tarball 文件 (.tgz) 中。
- 您正在使用从本地 tarball 文件安装相同的包
file:
- 因为包名是相同的,所以它用条目替换
git+ssh
了package.json
条目file:
。
您对 Cloud Functions 的部署现在应该可以顺利进行,并且包含您的私有包。祝你好运,如果您对这些说明有任何疑问,请告诉我——我很乐意纠正任何错误并重写任何不清楚的地方。
替代方法
如果您不介意额外的工作或私有 repo 的更改频率不足以证明 CI/CD 中的额外复杂性是合理的,您还可以使用npm pack
/yarn pack
创建一个 tarball 文件,运行yarn add file:...
上面列出的相同命令来修改您的package.json
和只需将 tarball 文件检查到您的存储库中即可。
注意:请注意,如果您将 tarball 文件签入的存储库是公开的,那么您的私有存储库/包的来源也将公开。
参考: