npm Husky准备脚本未能部署firebase函数

euoag5mw  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(138)

我已经将husky作为prepare脚本安装在我的npm项目中,如下所示

{
  "name": "functions",
  "scripts": {
    "build": "tsc",
    "start": "npm run serve",
    "deploy": "firebase deploy --only functions",
    "prepare": "husky install functions/.husky"
  }
  "dependencies": {
    "firebase-admin": "^11.4.1",
    "firebase-functions": "^4.1.1",
  },
  "devDependencies": {
    "husky": "^8.0.2",
    "typescript": "^4.9.4"
  }
}

husky被声明为devDependencies,因为此npm模块仅在本地开发时需要,在运行时应用程序中不需要。
因此,当我运行npm run deploy时,我得到以下错误

i  functions: updating Node.js 16 function funName(us-central1)...
Build failed:

> prepare
> husky install functions/.husky

sh: 1: husky: not found
npm ERR! code 127
npm ERR! path /workspace
npm ERR! command failed
npm ERR! command sh -c -- husky install functions/.husky

此错误明确指出未安装husky
一种可能的解决方案是创建一个prepare.js脚本,用于检查脚本是在本地开发中运行还是在firebase服务器中运行(以准备项目),然后有条件地运行husky npm模块命令

knpiaxh1

knpiaxh11#

我刚刚遇到了这个完全相同的问题,但是使用tsc时,我不知道为什么,但是prepare脚本也在cloud函数中运行(不仅仅是本地)。但是,考虑到您 * 很可能 * 在firebase.json的functions.ignore列表中有node_modules目录,node_modules目录不会作为部署的一部分上传,因此当脚本在云函数环境中运行时,husky包对脚本不可见。
您可能不需要在函数环境中运行husky脚本,因此可以添加一个条件来检查通常在函数环境中设置的环境变量(在我的例子中,我使用的是GOOGLE_FUNCTION_TARGET环境变量),并且只有在没有设置环境的情况下才运行该命令。您还需要将其 Package 在bash脚本中,而不是将其内联添加到包中。json,因为准备脚本是如何运行的。
例如,下面是我的scripts/prepare.sh文件的内容。

#!/bin/bash
set -o verbose

# Only run if the GOOGLE_FUNCTION_TARGET is not set
if [[ -z "$GOOGLE_FUNCTION_TARGET" ]]; then
    npm run build
fi

然后我在我的package.json准备脚本中使用它:

// ...
"prepare": "./scripts/prepare.sh",
// ...

有一个潜在的更好的解决方案,但这是我如何得到它为我工作。希望这有助于!

ljsrvy3e

ljsrvy3e2#

This SO的答案非常正确,并且使用了bash脚本,我使用答案中提到的相同概念在js中编写了名为prepare.mjsscripts/文件夹中的prepare脚本

"use-strict";
import * as path from "path";
import { fileURLToPath } from "url";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// Firebase sets the GOOGLE_FUNCTION_TARGET when running in the firebase environment
const isFirebase = process.env.GOOGLE_FUNCTION_TARGET !== undefined;
if (!isFirebase) {
  process.chdir("../"); // path where .git file is present. In my case it was ..
  const husky = await import("husky");
  husky.install("functions/.husky"); // path where .husjy config file is present w.r.t. .git file
}

在我的package.json中,我使用了上述脚本,如下所示

{
  "name": "functions",
  "scripts": {
    "build": "tsc",
    "start": "npm run serve",
    "deploy": "firebase deploy --only functions",
    "prepare": "node ./scripts/prepare.mjs"
  }
  "dependencies": {
    "firebase-admin": "^11.4.1",
    "firebase-functions": "^4.1.1",
  },
  "devDependencies": {
    "husky": "^8.0.2",
    "typescript": "^4.9.4"
  }
}

这使用了Google文档中记录的环境变量(GOOGLE_FUNCTION_TARGET

相关问题