语境
Yarn 工作区提供了一个方便的类似 mono-repo 的功能,其中包被自动链接。即它们可以相互要求/导入,并且它们的二进制文件可以从工作区根目录链接和访问。
一个例子:
工作区/package.json
{
"name": "200180719-yarn-bin",
"version": "1.0.0",
"workspaces": [
"packages/*"
],
"private": true
}
工作区/包/a/package.json
{
"name": "a",
"version": "1.0.0",
"main": "src/index.js",
"bin": {
"mycli": "src/index.js"
}
}
工作区/包/a/src/index.js
#!/usr/bin/env node
console.log('welcome to the cli')
如果您然后将目录更改为主工作区并运行yarn install
,yarn 会正确链接二进制文件,您可以运行:
yarn run mycli
从工作区目录就好了。伟大的!
问题
我遇到的问题是,如果您的代码首先必须被编译,则二进制文件在完成之前将不可用yarn install
(因为您不应该在版本控制中发布编译后的代码)。我使用 Typescript 来编译我的 cli:
重命名并更新index.js
为:index.ts
a/package.json
{
"name": "a",
"version": "1.0.0",
"main": "src/index.js",
"bin": {
"mycli": "dist/index.js"
},
"scripts": {
"build": "tsc src/index.ts --outDir dist",
"preinstall": "yarn run build"
},
"devDependencies": {
"typescript": "^2.9.2"
}
}
即使在工作区目录上dist/index.js
运行时正确构建yarn install
,它也无法创建到二进制文件的链接:
Toms-MacBook-Pro-2:200180719-yarn-bin tommedema$ yarn run mycli
yarn run v1.7.0
error Command "mycli" not found.
问题
当我的二进制文件需要在安装时编译时,如何使纱线工作区二进制链接工作?
如果我需要使用 Lerna 来完成这项工作,那也完全可以(尽管最好避免调用,lerna bootstrap
因为这对于纱线工作区来说应该是多余的)。