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 中找到私有包的主要内容,如果未能解决你的问题,请参考以下文章