【发布时间】:2018-10-10 20:01:07
【问题描述】:
我有一个使用yarn workspaces 和lerna 的monorepo 项目;它的所有部分都是用 TypeScript 编写的。这些模块位于packages/module-n 等子文件夹中,每个模块都有自己的package.json,其中包含以下几行:
"main": "dist/index.js",
"types": "dist/index.ts",
每个包的源代码都位于packages/module-n/src/index.ts,所以没什么异常。
当涉及到从命令行构建或发布时,一切正常 - 感谢每个包文件夹中的 tsconfig.json 和 build 脚本。然而,在 VSCode 中进行日常代码编辑时,事情变得不太方便,尽管我运行 tsc --watch all packages 以保持链接的依赖项同步。
当我命令单击引用对等包的定义时,VSCode 将我带到packages/package-n/dist/index.d.ts,而不是我当前可能正在编辑的packages/package-n/src/index.ts。另外,当我想用F2 重构某些东西时,dist/index.d.ts 文件可能偶尔会被修改,这迫使我由于错误而重新启动build:watch。问题是 TypeScript 在 **/dist/index.d.ts 中看到手动调整并拒绝进一步更新这些文件。
为了克服这种不便,我在根package.json 中编写了这两个脚本,但我不是我自己的解决方案的忠实拥护者:
"use-dev-typings": "lerna exec \"replace --quiet dist\\/index\\.d\\.ts src/index.ts package.json\"",
"use-prod-typings": "lerna exec \"replace --quiet src\\/index\\.ts dist/index.d.ts package.json\""
这是我在同一个根目录package.json 中使用它们的方式:
"build": "yarn use-prod-typings && lerna run build",
"build:watch": "lerna run build; yarn use-dev-typings && lerna run --parallel build:watch",
这个想法是,在我开始在 VSCode 中编辑文件并因此使用yarn build:watch 之前,我通过将"types": "dist/index.d.ts" 替换为"types": "src/index.ts" 来修补所有packages/package-n/package.json 文件。这修复了命令+单击和重构,这很棒。对于一次性构建(例如在发布之前),"types" 恢复为 "dist/index.d.ts"。
我想知道是否有更好的方法来实现我所追求的目标,如果有人能给我建议,那就太好了。我很确定有一天我会不小心提交"src/index.ts",甚至发布具有此值的版本。 src/*.ts 的内容不包括在 npm 版本中,以保持我的包很小。
【问题讨论】:
-
对于那些也在为同样的问题而苦苦挣扎并希望看到解决方法的人,这里是我正在应用上述 hack 的 repo:github.com/gicentre/litvis
标签: typescript visual-studio-code typescript-typings lerna monorepo