npm経由だとfunc startがエラーで失敗する

結論

まずは結論から。

今回の原因は、node_modulesが壊れていたから。

解消方法は以下の通りです:

  • node_modulesディレクトリを削除する
  • npm installコマンドを実行して、依存関係を再インストールする

バージョンの不一致、特にグローバルにインストールされたものとnode_modulesのものとの違いが原因ではないかという仮説に基づいて調査を進めたため、解決に時間を要してしまいました。

この仮説の立て方自体は適切だと考えています。今後同様のエラーに遭遇した際も、以下に記す調査方法が有効だと思われるため、ここに記録として残しておきます。

調査記録

ターミナル上で直接 ‘func start’ コマンドを実行すると、Azure Functions のローカル開発環境が正常に起動し、期待通りの動作を示します。

node ➜ /workspaces $ func start

Azure Functions Core Tools
Core Tools Version:       4.0.6280 Commit hash: N/A +421f0144b42047aa289ce691dc6db4fc8b6143e6 (64-bit)
Function Runtime Version: 4.834.3.22875

[2024-09-16T05:40:16.627Z] Worker process started and initialized.

Functions:

        storageBlobTrigger: blobTrigger

For detailed output, run func with --verbose flag.
[2024-09-16T05:40:21.540Z] Host lock lease acquired by instance ID '00000000000000000000000067A5C288'.

しかし、npm start コマンドを使用して Azure Functions のローカル開発環境を起動しようとすると、期待した結果が得られず、エラーが発生してしまう。

{
  "name": "azrite_sample",
  "version": "1.0.0",
  "description": "",
  "main": "dist/src/functions/*.js",
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "clean": "rimraf dist",
    "prestart": "npm run clean && npm run build",
    "start": "func start",
    "test": "echo "No tests yet...""
  },
  "dependencies": {
    "@azure/functions": "^4.0.0"
  },
  "devDependencies": {
    "azure-functions-core-tools": "^4.x",
    "@types/node": "18.x",
    "typescript": "^4.0.0",
    "rimraf": "^5.0.0"
  }
}
npm run start
省略
> start
> func start

/workspaces/node_modules/azure-functions-core-tools/bin/func: 5: Syntax error: Unterminated quoted string

Syntax error: Unterminated quoted stringというキーワードで検索すると以下が出てきた。 しかし、すでにバージョンは新しいので関係がなさそう。

ターミナルとnpmでの実行で違いがあるとすれば、モジュールのバージョンなはず。

package-lock.jsonを確認してみる。

 "node_modules/azure-functions-core-tools": {
      "version": "4.0.6280",
      以下略

ターミナルのバージョンも確認

node ➜ /workspaces $ func --version
4.0.6280

モジュールのバージョン違いではなさそう。

package.jsonのfuncの参照先を変更すると、当然うまくいく。

node ➜ /workspaces $ which func
/usr/bin/func
"start": "/usr/bin/func start",

ここまでやって、単純に壊れているだけでは??という疑いが出てきた。 実際にnode_modulesを削除してnpm installをもう一度やるとうまくいった。

非常にガックリする原因でした。