谷歌云跨服务调用函数:共享模块与独立构建方案求助
解决方案
针对多模块独立构建但需共享公共代码的问题,这里有几个实用方案:
方案1:把公共模块发布为私有npm包
- 把
common/封装成独立的npm包,发布到私有仓库(比如GCP Artifact Registry的npm仓库) - 每个业务模块(module1/module2/module3)的
package.json里添加这个私有包作为依赖 - 云端构建时,先在cloudbuild.yaml里配置登录私有仓库,再执行依赖安装,云端就能正常拉取公共模块
示例module1的cloudbuild.yaml:
steps: # 配置GCP私有npm仓库地址 - name: 'gcr.io/cloud-builders/npm' args: ['config', 'set', '@your-namespace:registry', 'https://us-central1-npm.pkg.dev/your-project/your-repo/'] # 安装依赖(包括私有公共模块) - name: 'gcr.io/cloud-builders/npm' args: ['install'] # 执行构建、测试等步骤 - name: 'gcr.io/cloud-builders/npm' args: ['run', 'build']
方案2:构建阶段同步公共模块代码
保留每个模块独立的cloudbuild.yaml,在构建步骤里手动拉取或复制公共模块到当前构建上下文:
子方案A:从根目录复制公共代码
如果构建触发时指定根目录为上下文,可直接复制common到模块目录:
steps: # 复制common模块到当前模块的依赖目录 - name: 'gcr.io/cloud-builders/bash' args: ['cp', '-r', '../common', './node_modules/@your-project/common'] - name: 'gcr.io/cloud-builders/npm' args: ['install'] # 后续构建操作
子方案B:用Git子模块管理公共代码
把common设为Git子模块,构建时初始化拉取:
steps: # 初始化并拉取公共子模块 - name: 'gcr.io/cloud-builders/git' args: ['submodule', 'init'] - name: 'gcr.io/cloud-builders/git' args: ['submodule', 'update'] # 此时业务模块可直接require('./common')引用 - name: 'gcr.io/cloud-builders/npm' args: ['install']
方案3:用npm/yarn工作区适配独立构建
采用根目录+common+业务模块的结构,同时给每个模块单独配cloudbuild.yaml:
- 根目录
package.json配置工作区:
{ "name": "your-project-root", "private": true, "workspaces": [ "common", "module1", "module2", "module3" ] }
- 每个业务模块的cloudbuild.yaml指定根目录为上下文,切换到模块目录执行构建:
示例module1的cloudbuild.yaml:
steps: # 安装所有工作区依赖(自动关联common模块) - name: 'gcr.io/cloud-builders/yarn' args: ['install'] dir: './module1' # 在module1目录下执行构建 - name: 'gcr.io/cloud-builders/yarn' args: ['run', 'build'] dir: './module1' # 部署步骤
这种方式既实现了代码共享,又能保留每个模块独立触发构建的能力。
内容的提问来源于stack exchange,提问作者dev_jr
相关产品推荐
相关产品推荐

