18

语境

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.tsa/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因为这对于纱线工作区来说应该是多余的)。

4

0 回答 0