5

我有一个使用 Lerna 的 monorepo,其结构如下:

monorepo
  |--  server
  |--  package1
  |--  package2

所有软件包都使用Babel并在安装 3 个项目后将所有库yarn复制到. 因此,项目上没有安装,只是在 monorepo 存储库中。@babelmonorepo/node_modulesbabel

我的 lerna.json:

{
  "lerna": "2.9.0",
  "npmClient": "yarn",
  "useWorkspaces": true,
  "packages": [
    "packages/*"
  ]
}

lerna 根package.json

{
    "name": "monorepo",
    "version": "1.0.0",
    "workspaces": [
        "packages/*"
    ],
    "private": true,
    "scripts": {
        "start": "lerna exec -- start",
    },
    "devDependencies": {
        "lerna": "^2.9.0",
        "concurrently": "3.5.1",
        "eslint": "^4.18.2",
        "eslint-config-airbnb": "16.1.0",
        "eslint-plugin-import": "2.9.0",
        "eslint-plugin-jsx-a11y": "6.0.3",
        "eslint-plugin-react": "7.7.0",
        "fs-extra": "^5.0.0",
        "node-fetch": "^2.1.1",
        "nodemon": "^1.11.0"
      }
}

我的项目有以下package.json:

{
  "name": "@monorepo/server",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "start": "nodemon --exec \"babel-node start-server.js\""
  },
  "dependencies": {
    "@babel/cli": "^6.24.1",
    "@babel/core": "^6.25.0",
    "@babel/plugin-transform-runtime": "^6.23.0",
    "@babel/preset-env": "^1.6.1",
    "@babel/preset-es2017": "^6.24.1",
    "bcryptjs": "^2.4.3",
    "body-parser": "^1.17.2",
    "connect-mongo": "^2.0.0",
    "crypto": "^1.0.1",
    "express": "^4.15.3",
    "express-graphql": "^0.6.12",
    "graphql": "^0.13.1",
    "graphql-relay": "^0.5.4",
    "jwt-simple": "^0.5.1",
    "mongoose": "^5.0.10",
    "morgan": "^1.8.2",
    "nodemailer": "^4.6.0",
    "passport": "^0.4.0",
    "passport-jwt": "^4.0.0",
    "path": "^0.12.7",
    "validator": "^9.1.1"
  },
  "babel": {
    "presets": [
      "@babel/es2017",
      "@babel/preset-env"
    ],
    "plugins": [
      "transform-runtime"
    ]
  }
}

当我启动服务器时,它没有在本地找到加载程序。我认为这是因为所有 babel 都安装在monorepo/node_modules

yarn server
yarn run v1.5.1
$ lerna exec --scope @amplifactory/server -- nodemon --exec "babel-node start-server.js
lerna info version 2.9.0
lerna info scope @amplifactory/server
[nodemon] 1.17.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `babel-node start-server.js`
D:\monorepo\node_modules\babel-core\lib\transformation\file\options\option-manager.js:328
        throw e;
        ^

Error: Couldn't find preset "@babel/es2017" relative to directory "D:\\9. DEV\\WORKSPACE\\amplifactory\\packages\\server"
    at D:\monorepo\node_modules\babel-core\lib\transformation\file\options\option-manager.js:293:19
    at Array.map (native)
    at OptionManager.resolvePresets (D:\monorepo\node_modules\babel-core\lib\transformation\file\options\option-manager.js:275:20)
    at OptionManager.mergePresets (D:\monorepo\node_modules\babel-core\lib\transformation\file\options\option-manager.js:264:10)
    at OptionManager.mergeOptions (D:\monorepo\node_modules\babel-core\lib\transformation\file\options\option-manager.js:249:14)
    at OptionManager.init (D:\monorepo\node_modules\babel-core\lib\transformation\file\options\option-manager.js:368:12)
    at compile (D:\monorepo\node_modules\babel-register\lib\node.js:103:45)
    at loader (D:\monorepo\node_modules\babel-register\lib\node.js:144:14)
    at Object.require.extensions.(anonymous function) [as .js] (D:\monorepo\node_modules\babel-register\lib\node.js:154:7)
    at Module.load (module.js:487:32)
[nodemon] app crashed - waiting for file changes before starting...

我该如何解决?如何配置服务器以查看 monorepo babel 并解决该错误?

4

1 回答 1

5

您的 Babel 依赖项应该安装在根目录下package.json(因为它们将在所有包中共享)。

yarn add --dev -W @babel/cli @babel/core @babel/plugin-transform-runtime @babel/preset-env @babel/preset-es2017"

-W标志告诉 Yarn Workspaces 在根级别安装。然后,您还将 Babel 配置从包内部移动到根目录。我建议将配置从文件中分离出来package.json并放入它自己的babel.config.js文件中。

这是一个使用 Babel 7 和 Lerna 和 Yarn 工作区的完整 Monorepo 示例。希望这可以帮助!

于 2019-03-31T18:24:49.293 回答