Github 操作似乎无法在带有纱线工作区和 lerna 的 monorepo 中找到私有包

Posted

技术标签:

【中文标题】Github 操作似乎无法在带有纱线工作区和 lerna 的 monorepo 中找到私有包【英文标题】:Github actions can't seem to find private package in monorepo with yarn workspaces and lerna 【发布时间】:2021-10-01 22:50:12 【问题描述】:

我创建了一个基于 yarn 工作空间和 lerna 的 monorepo,其中包含以下包类型:

UI网站包(Vue Vite应用) DTO 包(私有 npm 包) n 个后端包(AWS 无服务器)

我的项目结构看起来像这样

root
-- package.json
-- packages/
--- ui/
---- package.json
---- dist/
--- dto/
---- package.json
---- dist/
--- serverlessBackend1/
---- package.json
---- build/
--- serverlessBackend2/
---- package.json
---- build/
--- serverlessBackendN/
---- package.json
---- build/

DTO 包主要包含在所有其他包中使用的类型,因此它在我的包的每个 package.json 中都列为依赖项。

在我的根 package.json 我有以下三个基本的 lerna 脚本:


    [...]
    "workspaces": [
        "packages/*"
    ],
    "scripts": 
        "build": "lerna run build",
        "publish": "lerna publish --conventional-commits --yes",
        "deploy": "lerna run deploy"
    ,
    "dependencies": 
        [...]
    ,
    "devDependencies": 
        [...]
    

现在我想创建一个 github 操作管道,它负责将不同的包分发到它们的目的地。网站包的 Ftp 上传,将 dto 包发布到 npm 并将所有无服务器项目部署到 AWS。

由于我对 Github 操作非常陌生,因此我已经通过官方文档、自述文件、其他项目、*** 问题挖掘了自己的方式,并设法建立了一个管道,它适用于三种情况中的两种。

不幸的是,我想将所有无服务器程序包部署到 AWS 的步骤似乎有一个奇怪的问题。首先,这是 Job 的配置方式:

Deploy-to-AWS:
    runs-on: ubuntu-latest
    env: 
        NODE_AUTH_TOKEN: $ secrets.NPM_AUTH_TOKEN 
    steps:
        - name: Checkout
          uses: actions/checkout@v2
          with:
            submodules: recursive
            token: $ secrets.GITHUB_TOKEN 
        - name: Installing dependencies
          run: yarn
        - name: Add AWS credentials with profile
          run: |
            aws configure set aws_access_key_id $ secrets.AWS_ACCESS_KEY  --profile $ secrets.PROFILE_NAME 
            aws configure set aws_secret_access_key $ secrets.AWS_SECRET_ACCESS_KEY  --profile $ secrets.PROFILE_NAME 
        - name: Deploy to AWS dev
          run: yarn deploy

当我在我的根目录中本地执行 yarn deploy 时,一切都按预期工作,并且每个无服务器包中的 deploy 脚​​本都被执行并且所有包都被正确部署。这就是package.json 在无服务器包中的样子:


    [...]
    "scripts": 
        "build": "tsc",
        "runDeployment": "serverless deploy -v --aws-profile my-profile-name",
        "deploy": "npm run build && npm run runDeployment"
    ,
    "dependencies": 
        "@userName/my-private-dto-package": "^0.3.2",
        [...]
    ,
    "devDependencies": 
        [...]
    

但是当我在 Github 操作工作流程中尝试相同的操作时,我收到一个错误,即找不到我的私有包模块:

2nd-serverless-package: path/to/file/where/dto/is/imported.ts(1,88): error TS2307: Cannot find module '@userName/my-private-dto-package' or its corresponding type declarations.

这似乎发生在每个包裹上,但第一个包裹除外。那么也许只是为第一个包解决了依赖关系?

我在互联网上上下搜索过,但无济于事。

【问题讨论】:

【参考方案1】:

我认为这可能与符号链接的依赖项有关,因此 DTO 包仅在根级别可用,而不是直接在无服务器包内。

但我通过分离每个无服务器包的工作流并直接安装依赖项来解决它。

name: Serverless deployment package-name
on:
  push:
    branches:
      - main
    paths:
      - 'packages/serverlessBackend1/**'

jobs:
  Deploy-to-AWS:
    runs-on: ubuntu-latest
    env: 
      NODE_AUTH_TOKEN: $ secrets.NPMRC_AUTH_TOKEN 
    steps:
      - name: Check out repository code
        uses: actions/checkout@v2

      - name: Setup up node
        uses: actions/setup-node@v2
      
      - name: Provide profile credentials
        run: |
          aws configure set aws_access_key_id $ secrets.AWS_ACCESS_KEY  --profile my-profile-name
          aws configure set aws_secret_access_key $ secrets.AWS_SECRET_ACCESS_KEY  --profile my-profile-name
      
      - name: Install dependencies
        run: cd packages/serverlessBackend1 && npm install

      - name: Deploy event backend to AWS dev
        run: cd packages/serverlessBackend1 && npm run deploy

这完全为我解决了。不是我最初问题的解决方案,因此没有将其标记为答案,但我认为我的发现可能对其他人有所帮助。

【讨论】:

以上是关于Github 操作似乎无法在带有纱线工作区和 lerna 的 monorepo 中找到私有包的主要内容,如果未能解决你的问题,请参考以下文章

纱线无法添加包(工作区内外)

带有纱线工作区的 Oclif

带有纱线工作空间的通用依赖库版本

无法在纱线工作区 monorepo 中添加包

我们可以在 github 操作中缓存纱线全局变量吗

带有 Lerna 的纱线工作区仍在将包添加到子文件夹