Zong
patch-package 遭私有源背刺

众所周知, patch-package 是一款很不错的打补丁工具包,虽然 pnpm 没法使用。

由于目前工作环境受限于私有源限制,想给某个包打补丁。

但是问题就是,因为私有源同步 npm 落后了,导致执行 npx patch-package pkg_example 失败。

报错提示:

Error Couldn't find any versions for "..." that matches "^0.0.0"
...

而且看报错提示就是 npm 的执行过程的提示。

当然了,最简单的办法当然是私有源及时同步 npm 最新的依赖包版本。

但是,明明我打补丁,我并不关心依赖的关系,我只是想单纯的打补丁,能不能从本地打呢?

答案是:能!

我们来看到源码:

// https://github.com/ds300/patch-package/blob/master/src/makePatch.ts
// 删除部分代码
import { dirSync } from "tmp"

export function makePatch() {
  // 创建临时文件夹
  const tmpRepo = dirSync({ unsafeCleanup: true })
  const tmpRepoPackagePath = join(tmpRepo.name, packageDetails.path)
  const tmpRepoNpmRoot = tmpRepoPackagePath.slice(
    0,
    -`/node_modules/${packageDetails.name}`.length,
  )

  const tmpRepoPackageJsonPath = join(tmpRepoNpmRoot, "package.json")

    if (packageManager === "yarn") {
      // 尝试使用 yarn 安装依赖
    } else {
      // 尝试使用 npm 安装依赖
    }

那么我们就可以从这里展开操作,自己创建一个临时文件夹来代替 tmp 创建的临时文件夹路径,以此为出发点,在临时文件夹内手动安装依赖,并将安装动作取消。

const tmpRepo = dirSync({ unsafeCleanup: true })
tmpRepo.name = // 你需要的本地文件夹路径

在完成这些操作后,我们就可以使用本地资源来打补丁了。

🎉🎉🎉