我有一个名为shared
的子模块,它位于backend
文件夹(云函数文件夹)旁边:
我在backend/package.json
中添加了本地依赖项shared
,如下所示:
"dependencies": {
...
"shared": "file:../shared"
}
我运行了npm install
并确保node_modules/shared
存在。虽然,当我运行以下代码:
firebase deploy --only functions
我得到以下错误(通过Firebase):
Error: Error parsing triggers: Cannot find module 'shared/common'
Try running "npm install" in your functions directory before deploying.
此错误是由于这一行:
import { currentWeek } from 'shared/common';
如果我将目录更改为../../../shared/common
,firebase将编译而没有任何错误。
shared/common/index.ts:
export { currentWeek } from './current-week';
shared/tsconfig.json:
{
"compilerOptions": {
"baseUrl": ".",
"target": "es5",
"module": "commonjs",
"declaration": true,
"strict": true,
"removeComments": true
}
}
backend/tsconfig.json:
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"outDir": "./dist",
"module": "commonjs",
"noImplicitAny": false,
"removeComments": true,
"noLib": false,
"allowSyntheticDefaultImports": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"resolveJsonModule": true,
"target": "es6",
"moduleResolution": "node",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2015",
"dom"
]
},
"include": [
"./src/**/*",
"../shared/**/*"
]
}
如果我有这个模块,为什么我会得到这个错误?我是不是漏掉了什么?
3条答案
按热度按时间b1payxdu1#
我认为,你必须配置
module-resolution
为typescript编译器。对于您的案例:
你可以用另一个名字来命名
shared
。用途:
zzlelutf2#
简而言之:
1.默认情况下,
node_modules
被忽略,而backend/dist
被上传。npm run build
发生在本地,npm install
发生在云中。npm install
在云中可能会失败,因为缺少shared
文件夹或由于云环境中不同的目录结构和/或不同的“根”目录而导致的错误路径问题。或者,更详细地:
Functions有一个predeploy步骤,在本地 * 构建 *(
npm run build
=>tsc
)typescript项目,然后将输出推送到云,在那里安装依赖项 *(npm install
)。如果通过相对路径(
../../shared
)包含shared
,编译后的代码将在项目 * 构建 *(本地)后输出到backend/dist
文件夹,从而上传。当您通过本地节点模块依赖项包含
shared
时,输出在依赖项 * 安装 * 后位于backend/node_modules
文件夹中,因此不会上传,因为默认情况下会忽略node_modules
。您看到的另一个问题是为什么
npm install
不能在云中安装本地依赖项。这可能是由于(1)没有将shared
与backend
一起上传,和/或云环境中的目录和相对路径结构与本地不同。firebase.json
gj3fmq9x3#
虽然@jrasm91的答案很好地解释了这个错误的原因,但我有点怀念这里问题的解决方案。
让我们假设你有下面的monorepo结构
其中
common
是一个包含公共代码的NodeJS模块,firebase
是Firebase项目的根文件夹,firebase/functions
是函数的NodeJS项目。在
firebase/functions/package.json
中,不能包含common
模块,如因为正如@jrasm91所解释的,文件夹
common
位于functions
文件夹之外,因此在运行firebase deploy --only functions
时不会打包和上传,这也在这里解释。我的解决方案是将
common
文件夹附加符号链接到functions
文件夹然后更新
package.json