【问题标题】:Lerna build fails on remote - internal packages are badly symlinked远程 Lerna 构建失败 - 内部包的符号链接错误
【发布时间】:2023-12-26 13:57:01
【问题描述】:

我有一个使用 lerna 创建的 monorepo 项目。
我正在尝试创建一个 CI 流来测试我的存储库安装并在远程环境中构建操作。
在点击lerna bootstrap 安装所有包依赖项后,我在根文件夹上使用lerna run build --stream,它为我的存储库中的每个子包调用lerna run build
此流程在我的本地机器上运行良好,但无法使用 travis-ci 构建。

目前的结论:

  1. 问题可能与 travis-ci 服务操作系统 无关,因为在尝试运行流程的 GCP 上的两个 Ubuntu VM 实例上都发生了相同的行为在配置为 macOS 机器的 travis-ci 服务器上。
  2. 引导标志--no-ci--force-local 都不会改变任何东西。
  3. 导航到~/sqpoc/node_modules/@superquery/components/dist,提示构建文件已正确创建,这意味着问题可能与在所述环境中失败的内部 lerna 符号链接流有关。
  4. >

输出:

$ lerna run build --stream
lerna notice cli v4.0.0
lerna info Executing command in 4 packages: "yarn run build"
@superquery/components: $ node ./scripts/build.ts
@superquery/greeter: $ tsc -p tsconfig.release.json && webpack
@superquery/superquery: $ react-scripts build
@superquery/superquery: Creating an optimized production build...
@superquery/greeter: asset bundle.js 39.4 KiB [compared for emit] (name: main)
@superquery/greeter: runtime modules 670 bytes 3 modules
@superquery/greeter: cacheable modules 11.5 KiB
@superquery/greeter:   ./build/src/main.js 701 bytes [built] [code generated]
@superquery/greeter:   ./node_modules/tslib/tslib.es6.js 10.8 KiB [built] [code generated]
@superquery/greeter: webpack 5.37.0 compiled successfully in 3703 ms
@superquery/server: $ tsc -p tsconfig.release.json
@superquery/superquery: Failed to compile.
@superquery/superquery: ./src/App.tsx
@superquery/superquery: Cannot find module: '@superquery/components'. Make sure this package is installed.
@superquery/superquery: You can install this package by running: yarn add @superquery/components.
@superquery/superquery: error Command failed with exit code 1.
@superquery/superquery: info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
lerna ERR! yarn run build exited 1 in '@superquery/superquery'
error Command failed with exit code 1.

预期输出:

$ lerna run build --stream
lerna notice cli v4.0.0
lerna info Executing command in 4 packages: "yarn run build"
@superquery/components: $ node ./scripts/build.ts
@superquery/greeter: $ tsc -p tsconfig.release.json && webpack
@superquery/greeter: asset bundle.js 39.4 KiB [compared for emit] (name: main)
@superquery/greeter: runtime modules 670 bytes 3 modules
@superquery/greeter: cacheable modules 11.5 KiB
@superquery/greeter:   ./build/src/main.js 701 bytes [built] [code generated]
@superquery/greeter:   ./node_modules/tslib/tslib.es6.js 10.8 KiB [built] [code generated]
@superquery/greeter: webpack 5.37.0 compiled successfully in 1521 ms
@superquery/server: $ tsc -p tsconfig.release.json
@superquery/superquery: $ react-scripts build
@superquery/superquery: Creating an optimized production build...
@superquery/superquery: Compiled successfully.
@superquery/superquery: File sizes after gzip:
@superquery/superquery:   119.52 KB  build/static/js/2.ea8fed9a.chunk.js
@superquery/superquery:   4.79 KB    build/static/js/main.7a35accd.chunk.js
@superquery/superquery:   1.41 KB    build/static/js/3.80a7969b.chunk.js
@superquery/superquery:   1.17 KB    build/static/js/runtime-main.d48b464c.js
@superquery/superquery:   574 B      build/static/css/main.9d5b29c0.chunk.css
@superquery/superquery: The project was built assuming it is hosted at /.
@superquery/superquery: You can control this with the homepage field in your package.json.
@superquery/superquery: The build folder is ready to be deployed.
@superquery/superquery: You may serve it with a static server:
@superquery/superquery:   npm install -g serve
@superquery/superquery:   serve -s build
@superquery/superquery: Find out more about deployment here:
@superquery/superquery:   https://cra.link/deployment
lerna success run Ran npm script 'build' in 4 packages in 35.9s:
lerna success - @superquery/components
lerna success - @superquery/greeter
lerna success - @superquery/server
lerna success - @superquery/superquery
✨  Done in 37.28s.

package.json 文件:

{
  "name": "superquery",
  "version": "1.0.0",
  "author": "***************",
  "repository": "https://github.com/doitintl/sqpoc.git",
  "main": "index.js",
  "license": "MIT",
  "private": true,
  "workspaces": {
    "packages": [
      "packages/*"
    ]
  },
  "scripts": {
    "start": "lerna run start --stream",
    "test": "lerna run test --stream",
    "test:ci": "lerna run test:ci --stream",
    "watch": "lerna run watch --stream",
    "storybook": "lerna run storybook --stream",
    "production": "lerna run production --stream",
    "build": "lerna run build --stream",
    "deploy": "lerna run deploy --stream",
    "bootstrap": "lerna run rimraf && lerna bootstrap",
    "rimraf": "rm -rf node_modules",
    "installApp": "yarn rimraf && yarn install && yarn bootstrap",
    "dev": "lerna run dev",
    "dev-logs": "lerna run dev --parallel",
    "dev-module": "lerna run dev --scope",
    "e2e": "nightwatch -e chrome,firefox",
    "e2e-test": "concurrently -k --success first \"npm run start\" \"npm run e2e\""
  },
  "devDependencies": {
    "chromedriver": "^90.0.0",
    "geckodriver": "^1.22.3",
    "lerna": "^4.0.0",
    "selenium-server": "^3.141.59"
  }
}

lerna.json 文件:

{
  "useWorkspaces": true,
  "npmClient": "yarn",
  "version": "1.0.0",
  "packages": [
    "packages/superquery",
    "packages/components"
  ]
}

使用的技术栈:
节点 14.17.0
npm 6.14.13
非虚拟机 0.37.2
lerna 4.0.0
纱线 1.22.10

尝试遵循以下链接(以及更多链接)的建议,这要么是幼稚的,要么与我的问题无关。
Lerna bootstrap does not link local dependencies?
https://github.com/lerna/lerna/issues/1444

【问题讨论】:

    标签: node.js travis-ci symlink monorepo lerna


    【解决方案1】:

    更新lerna.json文件后解决:

    {
      "useWorkspaces": true,
      "npmClient": "yarn",
      "version": "1.0.0"
    }
    

    【讨论】: