本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
1、准备
克隆官方仓库
git clone https://github.com/pnpm/only-allow.git
cd only-allow
# npm i -g pnpm
pnpm i
1、看源码,先看read.md
Force a specific package manager to be used on a project //强制在项目上使用特定的包管理器
Add a `preinstall` script to your project's `package.json`.
If you want to force [npm](https://docs.npmjs.com/cli/npm), add:
```json
{
"scripts": {
"preinstall": "npx only-allow npm"
}
}
If you want to force [yarn](https://yarnpkg.com/), add:
```json
{
"scripts": {
"preinstall": "npx only-allow yarn"
}
}
2、调试源码
// only-allow/package.json
{
"bin": "bin.js",
}
提前在 only-allow/bin.js 文件打上断点 const usedPM = whichPMRuns()
按快捷键 ctrl + ` 快捷键打开终端。输入如下 yarn add release-it -D 命令,即可调试 only-allow/bin.js。
调试会报错
2、源码
#!/usr/bin/env node
const whichPMRuns = require('which-pm-runs')
const boxen = require('boxen')
const argv = process.argv.slice(2)
if (argv.length === 0) {
console.log('Please specify the wanted package manager: only-allow <npm|cnpm|pnpm|yarn>')
process.exit(1)
}
//用户传入的希望使用的包管理器
const wantedPM = argv[0]
//是不是包管理器
if (wantedPM !== 'npm' && wantedPM !== 'cnpm' && wantedPM !== 'pnpm' && wantedPM !== 'yarn') {
console.log(`"${wantedPM}" is not a valid package manager. Available package managers are: npm, cnpm, pnpm, or yarn.`)
process.exit(1)
}
const usedPM = whichPMRuns()
//不是期望的包管理器,报错
if (usedPM && usedPM.name !== wantedPM) {
const boxenOpts = { borderColor: 'red', borderStyle: 'double', padding: 1 }
switch (wantedPM) {
case 'npm':
console.log(boxen('Use "npm install" for installation in this project', boxenOpts))
break
case 'cnpm':
console.log(boxen('Use "cnpm install" for installation in this project', boxenOpts))
break
case 'pnpm':
console.log(boxen(`Use "pnpm install" for installation in this project.
If you don't have pnpm, install it via "npm i -g pnpm".
For more details, go to https://pnpm.js.org/`, boxenOpts))
break
case 'yarn':
console.log(boxen(`Use "yarn" for installation in this project.
If you don't have Yarn, install it via "npm i -g yarn".
For more details, go to https://yarnpkg.com/`, boxenOpts))
break
}
process.exit(1)
}
跟着断点,进入which-pm-runs
1、which-pm-runs 当前运行的是哪一个包管理器
返回包管理器和版本号
String,不推荐使用 substr。推荐使用 slice。