如何将 monorepo 节点项目捆绑到单个文件中?尝试使用 ncc

Posted

技术标签:

【中文标题】如何将 monorepo 节点项目捆绑到单个文件中?尝试使用 ncc【英文标题】:How can bundle a monorepo node project into a single file? trying with ncc 【发布时间】:2021-02-12 22:53:20 【问题描述】:

所以我有一棵类似的树

├── package.json
├── tsconfig.json
└── packages
    ├── lib1
    │   ├── package.json
    │   ├── src
    │   │   ├── index.ts
    │   └── tsconfig.json
    ├── lib2
    │   ├── package.json
    │   ├── src
    │   │   ├── index.ts
    │   └── tsconfig.json
    ├── graph
    │   ├── package.json
    │   ├── src
    │   │   ├── index.ts
    │   └── tsconfig.json
    └── peer
        ├── package.json
        ├── src
        │   └── index.ts
        └── tsconfig.json

其中graph依赖于lib2,而lib2又依赖于lib1。


  "compilerOptions": 
    "target": "es2018",
    "module": "commonjs",
    "lib": ["es2018"],
    "moduleResolution": "node",
    "declaration": true,
    "strict": true,
    "esModuleInterop": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "sourceMap": true,
    "resolveJsonModule": true,
    "outDir": "build"
  ,
  "exclude": ["**/node_modules", "**/build", "**/dist"]


  "extends": "../tsconfig-build.json",
  "compilerOptions": 
    "rootDir": "src",
    "outDir": "build"
  

当我使用它构建时,编译时一切都很好


  "scripts": 
    ":g:tsc": "cd $INIT_CWD && tsc --project tsconfig-build.json",

但如果我尝试使用@vercel/ncc,我会收到编译时错误,例如'rootDir' is expected to contain all source files.

    "build": "ncc build src/index.ts",

我尝试在我的tsconfig.json 中使用pathsreferences,但它们都不能满足我的目的,而且打字稿似乎没有正确查找不同的模块。当我将它指向对等体的 index.ts 时,它可以正常工作,但没有工作空间依赖关系。

我的最终目标是能够将单个 js 文件发送到 docker 容器。我怎样才能达到我的目标?

【问题讨论】:

【参考方案1】:

我们使用 Lerna 来管理我们的 Monorepo。

https://github.com/lerna/lerna

它允许拥有公共和私人包。公共包可以发布到注册表,并且任何依赖于来自同一个 Monorepo 的其他包的任何包都必须作为依赖项添加到 package.json 中。 Lerna 可以管理依赖包中最终发生的任何更改的版本增量。

我们通过使用 GitHub 操作实现了自动部署,让 Lerna 将公共包发布到 GitHub 注册表并增加所有包,包括私有和提交到主分支的更改。

lerna.json


  "version": "independent",
  "packages": ["packages/*"],
  "npmClient": "yarn",
  "ignoreChanges": ["**/*.md"],
  "useWorkspaces": true,
  "command": 
    "version": 
      "conventionalCommits": true,
      "createRelease": "github",
      "exact": true,
      "message": "chore(release): publish",
      "preid": "next"
    ,
    "publish": 
      "distTag": "latest",
      "preDistTag": "next",
      "registry": "https://npm.pkg.github.com/"
    
  

【讨论】:

以上是关于如何将 monorepo 节点项目捆绑到单个文件中?尝试使用 ncc的主要内容,如果未能解决你的问题,请参考以下文章

Grunt:将HTML页面捆绑到单个HTML文件中。所有依赖项

将 sass 文件捆绑到单个 sass 文件中

xml 如何使用Ant将Java程序捆绑到单个可执行.jar文件中

如何在 monorepo 中维护每个模块的自动更改日志?

Py2exe 将文件捆绑到单个 exe 中

将节点版本从 v6.10 升级到 v10.x 后捆绑项目的差异