You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bazel run启动nodejs_image时无法找到bazel-bin下的package.json依赖

问题根因

bazel build :image构建容器镜像时,rules_docker会自动将data字段声明的所有文件统一打包到容器内的/app根目录,因此package.json可被正常读取;但bazel run :image是直接在宿主机的Bazel runfiles环境中运行Node.js程序,不会启动容器,此时package.json作为源文件会被放在runfiles的工作区根目录,而程序运行的默认工作目录是编译产物所在的build目录,相对路径查找自然找不到package.json。

解决方案

方案1(推荐,兼顾本地运行和容器构建)

给ts_project规则添加assets字段,将package.json自动复制到编译输出目录,和入口文件app.js放在同级路径:

ts_project(
    name = "typescript_build",
    srcs = glob([
        "src/**/*",
    ]),
    assets = [":package.json"], # 新增该行
    allow_js = True,
    out_dir = "build",
    deps = ["@npm//:node_modules"],
)

修改后重新执行bazel run :image,会发现bazel-bin/build目录下已生成package.json,程序可正常读取。

方案2(临时本地测试用)

运行时添加参数强制在当前项目根目录执行,直接读取原文件系统的package.json:

bazel run --run_under="cd $PWD && " :image

方案3(适配Bazel运行环境)

修改Node.js代码中读取package.json的逻辑,通过Bazel注入的环境变量定位文件路径:

const fs = require('fs')
const path = require('path')

// bazel run时会注入BUILD_WORKSPACE_DIRECTORY指向项目根目录
const workspaceRoot = process.env.BUILD_WORKSPACE_DIRECTORY || __dirname
const packageJson = fs.readFileSync(path.join(workspaceRoot, 'package.json'), 'utf-8')

内容的提问来源于stack exchange,提问作者Cameron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:15:03