【问题标题】:Npm workspaces - call workspace script from root packageNpm 工作区 - 从根包调用工作区脚本
【发布时间】:2023-03-24 05:20:01
【问题描述】:

我正在为根 git 存储库中的多个 npm 包而苦苦挣扎,这些包使用自定义开发脚本来处理启动、编译、构建等。现在我遇到了 npm 工作区,并想在我的以下项目结构中使用这个令人惊叹的新功能,但我无法让它工作:

projectx (root)
- package.json
- apps   
 -- backend
   -- src
   -- package.json (name: @projectx/backend, scripts: "dev":"ts-node or whatever")
 -- common
   -- src
   -- package.json (name: @projectx/common)
 -- frontend
   -- src
   -- package.json (name: @projectx/frontend, scripts: "dev":"webpack")

我的根 package.json 包含:

    {
  "name": "packagex",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "private": "true",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "back:dev": "npm workspace @projectx/backend dev",
    "front:dev": "npm workspace @projectx/frontend dev",
    "dev": "run-p back:dev front:dev"
  },
  "workspaces": [
    "apps/*"
  ],
  "repository": {
    "type": "git",
    "url": "git_url"
  },
  "author": "me",
  "license": "ISC",
  "devDependencies": {
    "npm-run-all": "^4.1.5"
  }
}

现在我想用 npm-run-all 和 root 上的命令启动后端和前端: npm run dev 导致:

而且我还想与后端和前端共享通用包,这在这种情况下应该是可能的。也许其他人也面临同样的问题,或者对我在这里做错了什么有一些想法。

【问题讨论】:

    标签: node.js npm workspace monorepo


    【解决方案1】:

    您在 package.json 中的 "workspaces" 属性看起来正确。我正在使用 NPM Workspaces,它运行良好,但它仍然缺少很多功能,所以你需要自己连接。我也不认为npm worksace 是一个命令(但也许是为了将来?),所以这里有一个清单让它工作:

    • 确保您使用的是 Node 15+ 和 NPM 7+
    • 将所有package.json设置为"private": true,
    • 删除项目中的所有package-lock.json,转到根目录,然后是npm install。它应该生成一个根级别 package-lock.json,其中包含工作空间的所有依赖项
    • 由于您使用的是npm-run-all,请将其添加到您的脚本中:
      "scripts": {
        "back:dev": "cd apps/backend && npm run dev",
        "front:dev": "cd apps/fontend && npm run dev",
        "dev": "npm-run-all build --parallel back:dev front:dev"
      }
    

    然后以npm run dev 开头。

    注意,您可能需要考虑使用start 脚本而不是dev 来缩短您需要键入的命令(例如npm start 而不是npm run dev),但npm run dev 仍然可以。

    【讨论】:

    • 我看不到 node15/16 的任何通知要求。今天 LTS 还仅限于 node14,不是吗?
    • @CraigHicks NPM 7+ 是工作区支持所必需的。节点 15+ 带有 NPM 7+。您可以使用旧版本的 Node,但您需要将 NPM 显式升级到 7+。
    • 正确。我将 NPM 7 与节点 14 一起使用,因为节点 16(还不是 LTS)导致了一些错误。没有尝试过 Node 15。
    【解决方案2】:

    npm@7.7.0 添加了一种从子包/工作区调用脚本的方法,这里有一些基于您原来的示例:

    在位于apps/backend 下的所有工作区中运行名为“dev”的脚本:

    npm run dev -w apps/backend

    在所有工作区中运行名为“dev”的脚本:

    npm run dev --ws

    在名为 @projectx/frontend 的包中运行名为“dev”的脚本:

    npm run dev -w @projectx/frontend

    更多信息:

    【讨论】:

      【解决方案3】:

      我想你希望:

      • 将脚本和依赖项分开(因此有 4 个package.json 文件),以便于维护

      我可以建议一个没有工作区的解决方法,它可能会满足您的需求:

      {
        ...
        "scripts": {
          "//back:dev": "npm workspace @projectx/backend dev",
          "back:dev": "npm --prefix apps/backend dev",
      
          "//front:dev": "npm workspace @projectx/frontend dev",
          "front:dev": "npm --prefix apps/frontend dev",
      
          "dev": "run-p back:dev front:dev"
        },
        "//workspaces": [
          "apps/*"
        ],
        "devDependencies": {
          "@local/back": "file:apps/backend",
          "@local/front": "file:apps/frontend",
          "npm-run-all": "^4.1.5"
        }
      }
      

      npm --prefix 在当前文件夹之外的另一个文件夹中运行 npm 脚本。

      @local/back 依赖项不是必需的,但我发现如果例如。一个包依赖于另一个。您可以通过以下方式使用该技巧达到共同点:

        "dependencies": {
          "@local/common": "file:../common"
        }
      

      一周前我希望工作空间能提供更好的解决方案,但没有发现上述机制有任何好处。

      希望工作区:

      • 仅在特定 package.jsonfiles 条目中公开这些文件(现在,全部显示)
      • 仅允许 import 访问特定 package.jsonexports 中的路径(如果有的话)

      NPM Workspaces monorepo - share local package's distribution folder as root instead of the entire source files

      【讨论】:

        猜你喜欢
        • 2021-06-14
        • 2021-03-22
        • 2018-10-18
        • 2021-11-12
        • 2022-11-25
        • 1970-01-01
        • 2021-06-02
        • 2021-09-23
        • 1970-01-01
        相关资源
        最近更新 更多