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
相关产品推荐
相关产品推荐

