根据Firebase Functions with Yarn workspaces的说法,我想使用Yarn工作区将monorepo部署到Firebase。我可以成功地将"web“方面部署到Firebase托管,它引用了一个共享的”核心“工作区。但是,尝试对Firebase函数上的" Functions“工作区执行相同的操作会失败。
我正在使用具有以下文件夹结构的Yarn工作区:
packages/
core/ // name: firebase-monorepo-core: custom core package
functions/ // name: firebase-monorepo-functions: firebase functions package
web/ // name: firebase-monorepo-web: react package这些已经在根package.json文件中进行了配置:
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/firebase-monorepo-core"
]
}为了在Firebase中启用Yarn工作区(并因此共享我的core包),我使用nohoist特性在functions和web中按照twiz的Stackoverflow answer创建了到Yarn工作区的符号链接。
在functions和web中,core包也以依赖项的形式存在
"dependencies": {
"firebase-monorepo-core": "*"
}在本地运行时没有任何问题,事实上,将web包部署到Firebase主机上工作得很好。但是,将functions包部署到Firebase函数会抛出一个错误:

我已经创建了一个Github存储库https://github.com/cjmyles/firebase-monorepo来演示这一点,生成的web工作区可以在https://fir-monorepo.firebaseapp.com上查看。
如果我对core工作区执行yarn pack操作,并在package.json文件中将其作为tarball引用,则可以部署core包,但我真的不喜欢这种解决方案,而且它将需要更多的开销才能实现自动化。
如果有任何建议来解决这个问题,我们将不胜感激。
发布于 2020-08-06 15:31:53
一个潜在的解决方案是使用Lerna。
然后,您可以将您的core包发布到一个私有的GitHub包,并使用Lerna创建一个指向core包的符号链接,用于本地开发。
发布于 2020-12-16 19:28:16
issue是指firebase-tools假定您的函数使用的所有包在npm中都可用。
一个快速的解决方案是使用firelink。
cd ./packages/functions
yarn add -D @rxdi/firelink为所有共享依赖项的函数package.json添加等效节。
"fireDependencies": {
"@org/common": "../../packages/common"
},更改部署脚本以使用firelink二进制文件
"scripts": {
"build": "tsc --build tsconfig.build.json",
"predeploy": "yarn build",
"deploy:functions": "firelink deploy --only functions"
}只是提个醒并不适用于"devDependencies",但在生产中无论如何都不应该需要它们。
更新您的firebase.json以运行预部署目标。
"functions": {
"predeploy": ["npm --prefix \"$RESOURCE_DIR\" run predeploy"],
"source": "packages/functions"
},最后,删除工作空间包中的所有本地yarn.lock文件。如果您希望锁定依赖关系,请在预部署步骤中添加npm install。如果有人对此有更好的解决方案,请让我知道。不幸的是,yarn不能在工作区中按需生成锁文件。
发布于 2021-04-28 05:58:16
我得到了这个工作,但它是一个痛苦和令人生厌。到目前为止,它工作得很好。我使用的是NPM工作区,但是这个概念应该适用于任何将节点模块挂接到根文件夹的项目。我还对CI和TypeScript使用了GitHub工作流/操作,因此所有这些都可以在这些环境中工作。
Firebase CLI使用TypeScript's tsc
functions/src/domain)中来构建我的依赖包,这样它们就可以被上传
cp -r packages/domain firebase/functions/src/domainsed:sed -i 's/"dependencies": {/"dependencies": { "@mycompany\/domain": "file:src\/domain",/' package.json在该命令之前,我的package.json如下所示:
"dependencies": {
"lodash": "^4.17.20",
...在该命令之后,它看起来如下所示:
"dependencies": { "@mycompany/domain": "file:src/domain",
"lodash": "^4.17.20",
...然后部署:firebase deploy --only functions
不是很漂亮,但它是完全自动化的。
https://stackoverflow.com/questions/61015842
复制相似问题