【问题标题】:Yarn workspaces and GCloud buildYarn 工作区和 GCloud 构建
【发布时间】:2021-06-25 12:20:53
【问题描述】:

我使用 nodejs + typescript 创建了一个 monorepo,以使用 yarn 工作区发布一个 rest 端点。此服务器将在 Google Cloud Run 上运行并使用 Google Container Registry。

结构如下

my-project /
   |
    -> common/
       package.json
   |
    -> server/
        -> src
        Dockerfile
        package.json
   |
    -> client/
       (react client that consume what server produce)

Common 是跨项目的“共享”文件夹,以便为类型提供单个包。我使用命名约定@my-project/common 作为通用包的名称以避免冲突。

然后,我在我的服务器代码中引用公共包:

在服务器的 json 包中

"dependencies": {
    ...
    "@my-project/common": "1.0.0",
    ...
}

然后在实际代码中

import { MyType } from '@my-project/common/type'

如果值得的话,这里还有 Dockerfile:

FROM node:15-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn install
COPY ./dist ./
CMD [ "node", "server.js" ]

构建链是

  • cd 到服务器文件夹
  • 使用 yarn 调用构建脚本,该脚本使用编译后的代码创建了 dist/ 文件夹
  • 执行gcloud builds submit --tag gcr.io/my-gcp-project-12345/my-gcp-project推送到GCR

问题出在:Cloud Build 找不到通用包: An unexpected error occurred: "https://registry.yarnpkg.com/@my-project%2fcommon: Not found".

是否可以在不将公共包推送到私有注册表的情况下找到解决方案?

【问题讨论】:

  • 我宁愿使用npm,所以也许我不明白一些事情:“使用yarn 调用构建脚本以创建带有编译代码的dist/ 文件夹”是什么意思?至少在默认情况下yarn 没有创建任何这样的目录......我不认为 js 正在创建“编译”代码......
  • 嘿@vitooh 谢谢。在我的 package.json 中,“yarn build”调用 TSC 将 Typescript 转换为 JS,所以这是我的“编译”代码出现的地方。对于编译代码造成的混乱,我们深表歉意

标签: node.js docker gcloud google-cloud-run yarn-workspaces


【解决方案1】:

我们有一个类似的案例,但是有了云功能,也许它可以帮助你。

在部署函数之前,我们必须在 @company/common 库上运行 yarn pack,然后对函数运行 yarn add file:packName.tgz。

在我们的例子中,由于我们仍在部署端使用 package-lock.json,因此我们必须运行 npm i --package-lock-only 来更新 package-lock.json 上的完整性字段

部署后,我们必须将 package.json 恢复为我们的 lib 版本。

相当“黑客”,但有效。

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 2019-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2021-12-15
    • 2019-08-10
    • 2021-10-22
    • 2021-10-08
    相关资源
    最近更新 更多