在 monorepo 中,是否可以将包配置为“如果可以的话,使用未编译的代码”?

dwj*_*ton 6 node.js typescript package.json yarnpkg yarnpkg-v2

我正在玩 Yarn 2,我想做这样的事情。

我有一个结构的单一存储库:

/
  packages/ 
    shared-ts/
       package.json
       src/
       lib*/ 
    app-ts/
       package.json
       src/
       lib*/ 
    app-js/ 
       package.json
       src/
       lib*/ 
Run Code Online (Sandbox Code Playgroud)

wherelib*表示该文件夹被 gitignored,但它是编译后的代码所在的位置。

shared-ts在此示例中,我有一个由两个应用程序使用的依赖库,app-ts并且app-js.

传统方法

配置像这样的 monorepo 的传统方法是,shared-ts我会有一个 package.json,如下所示:

"main": "lib/index.js"
"scripts" : {
    "build": "tsc" 
}

Run Code Online (Sandbox Code Playgroud)

脚本将在其中build构建index.jsindex.d.ts放入 lib 文件夹中。

当两者app-tsapp-js解析包时,他们会在 lib 文件夹中查找并找到index.js和 的app-ts情况 - index.d.ts.

这工作得很好,除了开发人员需要记住运行build脚本(如果他们进行了更改)shared-ts以便传播更改。

这可能会成为问题的地方是存在多层依赖关系的地方。

尝试围绕 1 点main进行工作src/index.ts

我可以将shared-tspackage.json 更改为

"main": "src/index.ts"
"scripts" : {
    "build": "tsc" 
}
Run Code Online (Sandbox Code Playgroud)

这通常不起作用,普通节点进程将无法解析文件中的语法.ts(例如import关键字)。

潜在的解决方法 -publishConfig

所以我正在考虑但尚未尝试的是使用publishConfig package.json 中的字段

该字段包含各种设置,仅当从本地源生成包时才会考虑这些设置(通过yarn pack或yarn npmpublish等发布命令之一)。

"main": "src/index.ts", 
"publishConfig": {
    "main": "lib/index.js"
}

Run Code Online (Sandbox Code Playgroud)

这个想法是:

  • 当您将包发布到 npm 时,lib/index.js将用作 main。代码已可供使用,无需编译。
  • 如果直接在 monorepo 中使用,src/index.ts将用作 main。例如,这种工作方式就像您正在运行一样app-tsts-node

然而,这种情况开始崩溃的地方是:

  • 在开发环境中运行app-js(无需设置任何额外的语法解析)。

目前实用的最佳解决方案

我目前最好的解决方案是“放弃这种‘不编译’的愿望”——如果开发人员对某些代码进行了更改,他们需要重新运行构建才能传播更改。

Ami*_*rji 0

使用这个怎么样?: import someValue from 'some-package/src/index';

我可以在我的 monorepo 中执行此操作,如下图所示

在此输入图像描述